i=k=input()
while i:i-=1;print(" "*(k+~i)+"\\"+i*' / |\ '[i%2::2])[:k-~i]+"_/"[i>0:]
Hãy thử trực tuyến!
Một trong những thủ thuật của Erik cho phép tôi chơi gôn 3 byte! Lưu được 3 byte nhờ Jonathan Allan.
Làm thế nào điều này hoạt động
Trước hết, điều này nhận đầu vào từ STDIN và gán nó cho hai biến riêng biệt ivà k. Sau đó, trong khi biếni là trung thực, chúng tôi giải mã nó và tạo các chuỗi tương ứng; đây là một tốc ký để lặp từ đầu vào - 1 xuống đến 0.
Tạo chuỗi
Tôi sẽ chia phần này thành nhiều phần hơn:
Trước hết, có được khoảng cách hàng đầu là đạt được với " "*(k+~i). Vì iđược ánh xạ qua phạm vi (đầu vào, 0] , chúng tôi phải trừ nó khỏik (đầu vào ban đầu được lưu trữ an toàn của chúng tôi), giảm dần và lặp lại một không gian nhiều lần.
+"\\" - Thêm nhân vật "\" vào khoảng trắng ở trên.
' / |\ '[i%2::2]- Tạo hai chuỗi của chúng tôi, cụ thể là "/ \ "và" | " , theo cách sau:
Nếu ilà số lẻ, i% 2 là 1 , do đó [i%2::2]trả về mỗi 2 ký tự của chuỗi lớn hơn của chúng tôi, bắt đầu từ chỉ mục 1 (được lập chỉ mục 0).
Nếu ilà chẵn, i% 2 là 1 , do đó cơ chế ở trên thực hiện tương tự ngoại trừ nó bắt đầu ở chỉ số 0 .
+~-i*- Lặp lại chuỗi được tạo ở trên, "/ \ "hoặc " | ", i-1 lần và nối nó với các chuỗi khác. Lợi ích của toán tử bitwise ( ~- Bổ sung bitwise , tương đương với i được trừ từ -1 ) là nó không yêu cầu dấu ngoặc trong ngữ cảnh này.
[:k-~i]- Nhận tất cả các ký tự của các chuỗi được nối ở trên cho đến khi chỉ số k- ~ i = k - (-1 - i) = k + 1 + i .
+"_/"[i>0:]- Điều này chỉ thêm "/"nếu tôi 1 , nếu không nó sẽ bổ sung _/.
Ví dụ đầy đủ / chi tiết thực hiện
Hãy lấy một ví dụ về cách mọi thứ hoạt động với đầu vào là 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.