양의 정수를받는 프로그램 (또는 함수)을 작성하십시오.
입력이 1
인 경우 각각 옆에 1 개의 슬래시가있는 두 개의 다이아몬드를 나란히 인쇄 (또는 반환)하십시오.
/\/\
\/\/
N
1보다 큰 모든 입력 N-1
에 대해, 인접 다이아몬드의 각 쌍에 대한 출력을 보고, 측면 길이가 두 이웃의 측면 길이의 합인 새 다이아몬드를 사이에 삽입하십시오. 이 새로운 다이아몬드 패턴을 인쇄 (또는 반환)하십시오.
2
입력이 있을 때 , 우리는 출력을 1
보고 측면 길이가 1 인 두 개의 인접한 다이아몬드가 있음을 알 수 있습니다.
/\
/\/ \/\
\/\ /\/
\/
입력 3
을 2
위해 두 개의 인접 다이아몬드 쌍 사이에 측면 길이가 3 (1 + 2 및 2 + 1) 인 두 개의 다이아몬드 에 대한 출력을 보고 추가합니다.
/\ /\
/ \ /\ / \
/\/ \/ \/ \/\
\/\ /\ /\ /\/
\ / \/ \ /
\/ \/
패턴을 계속하면에 대한 출력 4
은 다음과 같습니다.
/\ /\
/\ / \ / \ /\
/ \ /\ / \ / \ /\ / \
/ \ / \ / \ /\ / \ / \ / \
/\/ \/ \/ \/ \/ \/ \/ \/\
\/\ /\ /\ /\ /\ /\ /\ /\/
\ / \ / \ / \/ \ / \ / \ /
\ / \/ \ / \ / \/ \ /
\/ \ / \ / \/
\/ \/
등등.
출력은 모든 행에 후행 공백을 가질 수 있지만 최대 1 개의 후행 줄 바꿈 (및 선행 줄 바꿈 없음)을 가질 수 있습니다.
바이트 단위의 가장 짧은 코드가 이깁니다.
답변
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.
답변
커먼 리스프, 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))
답변
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 : 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)