i=k=input()
while i:i-=1;print(" "*(k+~i)+"\\"+i*' / |\ '[i%2::2])[:k-~i]+"_/"[i>0:]
온라인으로 사용해보십시오!
Erik의 트릭 중 하나가 3 바이트의 골프를 허용했습니다! Jonathan Allan 덕분에 3 바이트를 절약했습니다.
작동 원리
먼저 STDIN에서 입력을 받아서 두 개의 개별 변수 i
및에 할당합니다 k
. 그런 다음 변수는i
가 진실한 를 줄이고 문자열을 적절하게 생성합니다. 이것은 입력에서 1-0까지 루핑하는 속기입니다.
문자열 생성
나는 이것을 더 많은 부분으로 나눌 것이다 :
우선, 띄어쓰기 간격은으로 달성됩니다 " "*(k+~i)
. i
범위 (input, 0]을 통해 매핑 되기 때문에 k
(안전하게 저장된 원래 입력에서) 빼고 공백을 여러 번 반복하고 반복해야합니다.
+"\\"
- "\"
위의 공백에 문자 를 추가합니다 .
' / |\ '[i%2::2]
- 즉 우리의 두 문자열을 생성 "/ \ "
하고 " | "
다음과 같은 방식으로, :
경우 i
홀수, 난 % 2 인 1 따라서, [i%2::2]
인덱스부터 시작하여, 우리의 큰 문자열의 각 2 개 문자를 반환 1 (0 인덱스).
경우 i
에도이고, I는 2 % 인 1 은 인덱스에서 시작되는 것을 제외하고는 동일한 작업을 수행하므로기구보다도 0 .
+~-i*
- 문자열이 상기 생성 된 반복하거나 "/ \ "
또는 " | "
, I-1 번, 다른 문자열에 추가한다. 비트 연산자 ( -1 에서 빼는 i~
와 동등한 비트 연산자)의 이점은 이 컨텍스트에서 괄호가 필요하지 않다는 것입니다.
[:k-~i]
-인덱스 k- ~ i = k-(-1-i) = k + 1 + i 까지 문자열이 연결된 모든 문자를 가져옵니다 .
+"_/"[i>0:]
-i가 1 이상인"/"
경우 에만 추가 되고 그렇지 않으면 추가 됩니다._/
전체 예 / 실행 세부 사항
입력이 4 인 상황이 어떻게 작동하는지 예를 들어 보겠습니다 .
i=k=input() # i and k are assigned to 4.
while i: # Starts the loop. The initial value of i is 4.
i-=1; # Decrement i. i is now 3.
" "*(k+~i) # A space repeated k - 1 - i = 4 - 1 - 3 = 0 times.
+"\\" # Plus the character "\". CS (Current string): "\".
' / |\ '[i%2::2] # The string ' / |\ '[3%2::2] = ' / |\ '[1::2] = "/ \ ".
i* # ^ repeated i = 3 times: "/ \ / \ / \ ".
+ # And concatenate. CS: "\/ \ / \ / \ "
[:k-~i] # Get the characters of ^ up to index k + 1 + i = 4 + 1 + 3 = 8.
# CS: "\/ \ / \".
+"_/"[i>0:] # Append "_/"[i>0:] = "_/"[3>0:] = "_/"[1:] = "/".
# CS: "\/ \ / \/".
print # Output the result "\/ \ / \/".
while i: # i is truthy (> 0), thus we loop again.
i-=1; # Decrement i. i becomes 2.
" "*(k+~i) # " " repeated 4 - 2 - 1 = 1 time.
+"\\" # Plus "\". CS: " \".
' / |\ '[i%2::2] # ' / |\ '[2%2::2] = ' / |\ '[::2] = " | ".
+i* # Repeat i = 2 times and append: " | ". CS: " \ | |".
[:k-~i] # CS up until k + 1 + i = 4 + 2 + 1 = 7. CS: " \ | ".
+"_/"[i>0:] # Append "/". CS: " \ | /".
print # Outputs the CS: " \ | /".
while i: # i is truthy (> 0), thus we loop again.
i-=1; # Decrement i. i is now 1.
" "*(k+~i) # " " repeated 4 - 1 - 1 = 2 times.
+"\\" # Plus "\". CS: " \".
' / |\ '[i%2::2] # ' / |\ '[2%2::2] = ' / |\ '[::2] = "/ \ ".
+i* # Repeat i = 1 time and append: "/ \ ". CS: " \/ \ ".
[:k-~i] # CS up until k + i + 1 = 4 + 2 = 6. CS: " \/ \".
+"_/"[i>0:] # Append "/". CS: " \/ \/".
print # Outputs the CS: " \/ \/".
while i: # i is truthy (> 0), thus we loop again.
i-=1; # Decrement i. i is now 0.
" "*(k+~i) # " " repeated 4 - 1 - 0 = 3 times.
+"\\" # Plus "\". CS: " \".
' / |\ '[i%2::2] # ' / |\ '[1%2::2] = ' / |\ '[1::2] = " | ".
+i* # Repeat i = 0 times and append: " \". CS: " \".
[:k-~i] # CS up until k + i + 1 = 4 + 0 + 1 = 5. CS: " \".
+"_/"[i>0:] # Append "_/" (because i > 0 is False since i == 0). CS: " \_/".
print # Outputs the CS: " \_/".
while i: # i == 0, hence the condition is falsy and the loop ends.
# Program terminates.