아가일 ASCII 아트


27

양의 정수를받는 프로그램 (또는 함수)을 작성하십시오.

입력이 1인 경우 각각 옆에 1 개의 슬래시가있는 두 개의 다이아몬드를 나란히 인쇄 (또는 반환)하십시오.

/\/\
\/\/

N1보다 큰 모든 입력 N-1에 대해, 인접 다이아몬드의 각 쌍에 대한 출력을 보고, 측면 길이가 두 이웃의 측면 길이의 합인 새 다이아몬드를 사이에 삽입하십시오. 이 새로운 다이아몬드 패턴을 인쇄 (또는 반환)하십시오.

2입력이 있을 때 , 우리는 출력을 1보고 측면 길이가 1 인 두 개의 인접한 다이아몬드가 있음을 알 수 있습니다.

   /\
/\/  \/\
\/\  /\/
   \/

입력 32위해 두 개의 인접 다이아몬드 쌍 사이에 측면 길이가 3 (1 + 2 및 2 + 1) 인 두 개의 다이아몬드 에 대한 출력을 보고 추가합니다.

    /\        /\
   /  \  /\  /  \
/\/    \/  \/    \/\
\/\    /\  /\    /\/
   \  /  \/  \  /
    \/        \/

패턴을 계속하면에 대한 출력 4은 다음과 같습니다.

                    /\            /\
     /\            /  \          /  \            /\
    /  \    /\    /    \        /    \    /\    /  \
   /    \  /  \  /      \  /\  /      \  /  \  /    \
/\/      \/    \/        \/  \/        \/    \/      \/\
\/\      /\    /\        /\  /\        /\    /\      /\/
   \    /  \  /  \      /  \/  \      /  \  /  \    /
    \  /    \/    \    /        \    /    \/    \  /
     \/            \  /          \  /            \/
                    \/            \/

등등.

출력은 모든 행에 후행 공백을 가질 수 있지만 최대 1 개의 후행 줄 바꿈 (및 선행 줄 바꿈 없음)을 가질 수 있습니다.

바이트 단위의 가장 짧은 코드가 이깁니다.


1
관련 OEIS : oeis.org/A002487 .
orlp

답변:


8

Pyth, 50 49 바이트

L.rR"\/"_bjbyK.tsm+Jm+*\ k\\dyJu.iGsM.:G2tQjT9djK

데모

설명:

L.rR"\/"_bjbyK.tsm+Jm+*\ k\\dyJu.iGsM.:G2tQjT9djK
                                                     Implicit:
                                                     Q = eval(input())
                                                     T = 10
                                                     d = ' '
                                                     b = '\n'
L                                                    def y(b): return
 .rR"\/"                                             Swap \ and / in
        _b                                           reversed input.
                                                     This effectively vertically
                                                     mirrors the input.
                               u                     Apply the function repeatedly
                                           jT9       Starting with [1, 1]
                                         tQ          and repeating Q - 1 times
                                .iG                  interlace G (input) with
                                     .:G2            All 2 element substrings of G
                                   sM                mapped to their sums.
                 m                                   map over these values
                                                     implicitly cast to ranges
                    m       d                        map over the range values
                                                     impicitly cast to ranges
                     +*\ k\\                         to k spaces followed by
                                                     a backslash.
                   J                                 Save to J, which is roughly:
                                                     \
                                                      \
                  +          yJ                      And add on y(J), giving
                                                     \
                                                      \
                                                      /
                                                     /
                s                                    Combine the half diamonds
                                                     into one list.
              .t                              d      Traspose, filling with ' '.
             K                                       Save to K, giving
                                                     something like:
                                                     \  /
                                                      \/
            y                                        Vertically mirror.
          jb                                         Join on newlines and print.
                                               jK    Join K on (implicitly)
                                                     newlines and print.

1
그럴 가능성은 얼마나 될까? 나는 또한 정확히u.iGsM.:G2tQjT9내 (부분) 솔루션. 난 당신의 대답을 보지 못했습니다 ...
orlp

2
@orlp 무언가를하는 가장 좋은 방법은 하나뿐입니다.
isaacg 2016 년

5

커먼 리스프, 425

(labels((a(n)(if(> n 1)(loop for(x y)on(a(1- n))by #'cdr collect x when y collect(+ x y))'(1 1))))(lambda(~ &aux(l(a ~))(h(apply'max l))(w(*(apply'+ l)2))(o(* 2 h))(m(make-array(list o w):initial-element #\ ))(x 0)(y h))(labels((k(^ v)(setf(aref m y x)^(aref m(- o y 1)x)v)(incf x))(d(i)(when(plusp i)(k #\\ #\/)(incf y)(d(1- i))(decf y)(k #\/ #\\))))(mapc #'d l))(dotimes(j o)(fresh-line)(dotimes(i w)(princ(aref m j i))))))

(funcall *fun* 4)

                    /\            /\                    
     /\            /  \          /  \            /\     
    /  \    /\    /    \        /    \    /\    /  \    
   /    \  /  \  /      \  /\  /      \  /  \  /    \   
/\/      \/    \/        \/  \/        \/    \/      \/\
\/\      /\    /\        /\  /\        /\    /\      /\/
   \    /  \  /  \      /  \/  \      /  \  /  \    /   
    \  /    \/    \    /        \    /    \/    \  /    
     \/            \  /          \  /            \/     
                    \/            \/                    

언 골프

(labels
    ((sequence (n)
       (if (> n 1)
           (loop for(x y) on (sequence (1- n)) by #'cdr
                 collect x
                 when y
                   collect(+ x y))
           '(1 1))))
  (defun argyle (input &aux
                  (list (sequence input))
                  (half-height (apply'max list))
                  (width (* (apply '+ list) 2))
                  (height (* 2 half-height))
                  (board (make-array
                          (list height width)
                          :initial-element #\ ))
                  (x 0)
                  (y half-height))
    (labels ((engrave (^ v)
               (setf (aref board y              x) ^ ;; draw UP character
                     (aref board (- height y 1) x) v ;; draw DOWN character (mirrored)
                     )
               (incf x) ;; advance x
               )
             (draw (i)
               (when (plusp i)
                 (engrave #\\ #\/)  ;; write opening "<" shape of diamond
                 (incf y)
                 (draw (1- i))   ;; recursive draw
                 (decf y)
                 (engrave #\/ #\\)  ;; write closing ">" shape of diamond
                 )))
      ;; draw into board for each entry in the sequence
      (mapc #'draw list))

    ;; ACTUAL drawing
    (dotimes(j height)
      (fresh-line)
      (dotimes(i width)
        (princ (aref board j i))))
    board))

3

CJam, 59 58 57 바이트

YXbri({{_2$+\}*]}*:,_:|,S*0'\tf{fm>_W%'\f/'/f*}:+zN*_W%N@

1 바이트를 골라 낸 @ MartinBüttner에게 감사합니다.

CJam 통역사 에서 온라인으로 사용해보십시오 .

생각

예 를 들어 입력 3의 경우

\  
/  
\  
 \ 
  \
  /
 / 
/  
\  
 \ 
 / 
/  
\  
 \ 
  \
  /
 / 
/  
\  
/  

문자열을 회전시키고  \일부 백 슬래시를 슬래시로 교체합니다.

그런 다음 결과 배열을 압축하여 행과 열을 바꿉니다. 원하는 출력의 아래쪽 절반을 얻습니다.

상위 절반은 하위 절반과 반대로 바이트 당 바이트입니다.

암호

YXb     e# Push A := [1 1] and 2 in unary.
ri(     e# Read an integer fro STDIN and subtract 1.
{       e# Do the following that many times:
  {     e#   For each I in A but the first:
    _2$ e#     Push a copy of I and the preceding array element.
    +\  e#     Compute the sum of the copies and swap it with I.
  }*    e#
  ]     e#   Collect the entire stack in an array.
}*      e#
:,      e# Replace each I in A with [0 ... I-1].
_       e# Push a copy of A.
:|      e# Perform set union of all the ranges.
,S*     e# Get the length (highest I in A) and push a string of that many spaces.
0'\t    e# Replace the first space with a backslash.
f{      e# For each range in A, push the generated string; then:
  fm>   e#   Rotate the string by each amount in the array.
  _W%   e#   Push a reversed copy of the resulting array of strings.
  '\f/  e#   In each string, split at backslashes.
  '/f*  e#   Join each string, separating with slashes.
}       e#
:+      e# Concatenate the resulting arrays of strings.
zN*     e# Zip and join, separating by linefeeds.
_W%     e# Push a reversed copy of the string.
N@      e# Push a linefeed and rotate the original string on top of it.

1

개정 1 : Ruby 170

큰 다이아몬드를 만들고 줄이지 않는 새로운 방법.

->n{a=[1]
m=1<<n-1
(m-1).times{|i|a<<a[i]<<a[i]+a[i+1]}
(-b=a.max).upto(b-1){|j|0.upto(m){|i|d=' '*q=a[-i]*2
(j*2+1).abs<q&&(d[j%q]=?\\;d[-1-j%q]=?/)   
print d}
puts""}}

개정 0 : 루비, 187

->n{a=[1]
m=1<<n-1
(m-1).times{|i|a<<a[i]<<a[i]+a[i+1]}
(2*b=a.max).times{|j|
0.upto(m){|i|d=' '*b*2;d[(b+j)%(b*2)]='\\';d[(b-1-j)%(b*2)]=?/
r=b-a[-i]
d.slice!(b-r,r*2)
print d}
puts ""}}

다이아몬드의 크기는 https://oeis.org/A002487 의 반복 관계에 따라 계산됩니다. 따라서 a모든 행의 모든 ​​요소를 ​​1에서로 구성 하는 배열 을 만듭니다 n. 우리는 마지막 1<<n-1요소 에만 관심이 있습니다 (Ruby는 음수 색인을 사용하여 배열에서 가져올 수 있습니다 -1은 배열의 마지막 요소 임) 1.

한 줄씩, 다이아몬드는 다이아몬드로, 가장 큰 다이아몬드의 문자 행을 그린 다음 가운데 열을 잘라 필요한 다이아몬드의 행을 가져옵니다. Rev 1은 짧지 만이 방법이 마음에 들었습니다.

모듈 식 산술은 같은식이 모든 것을 /직접 추가 하고 마찬가지로 하나의식이 모든 것을 직접 추가하도록 감싸는 데 사용 \됩니다.

테스트 프로그램에서 언 골프

f=->n{
  a=[1]
  m=1<<n-1
  (m-1).times{|i|a<<a[i]<<a[i]+a[i+1]}                   #concatenate a[i] and a[i]+a[i+1] to the end of a
    (2*b=a.max).times{|j|                                #run through lines (twice the largest number in a
      0.upto(m){|i|                                      #run through an initial '1' plus the last m numbers in a
      d=' '*b*2;d[(b+j)%(b*2)]='\\';d[(b-1-j)%(b*2)]=?/  #d is the correct string for this line of the largest diamond
      r=b-a[-i]                                          #calculate number of characters to be deleted from middle of d
      d.slice!(b-r,r*2)                                  #and delete them
      print d                                            #print the result
    }
    puts ""                                              #at the end of the line, print a newline
  }
}

f.call(gets.to_i)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.