i=k=input()
while i:i-=1;print(" "*(k+~i)+"\\"+i*' / |\ '[i%2::2])[:k-~i]+"_/"[i>0:]
ลองออนไลน์!
หนึ่งในกลอุบายของ Erik ทำให้ฉันตีกอล์ฟได้ 3 ไบต์! บันทึก 3 ไบต์ขอบคุณ Jonathan Allan
วิธีนี้ใช้ได้ผล
ปิดครั้งแรกนี้ได้รับข้อมูลจาก STDIN และกำหนดให้กับตัวแปรทั้งสองแยกจากกันและi
k
จากนั้นในขณะที่ตัวแปรi
นั้นเป็นความจริงเราจะลดลงและสร้างสตริงตามนั้น นี่เป็นชวเลขสำหรับการวนลูปจากอินพุต - 1 จนถึง 0
การสร้างสตริง
ฉันจะแยกส่วนนี้ออกเป็นส่วน ๆ เพิ่มเติม:
" "*(k+~i)
ปิดแรกเริ่มระยะห่างชั้นนำจะประสบความสำเร็จกับ เนื่องจากi
มีการแมปผ่านช่วง(อินพุต, 0]เราจะต้องลบมันออกจากk
(อินพุตดั้งเดิมของเราที่เก็บไว้อย่างปลอดภัย) การลดลงและทำซ้ำพื้นที่ที่ซ้ำหลายครั้ง
+"\\"
- เพิ่มอักขระ"\"
ลงในช่องว่างด้านบน
' / |\ '[i%2::2]
- สร้างสองสายของเราคือ"/ \ "
และ" | "
ในลักษณะดังต่อไปนี้:
หากi
เป็นเลขคี่i% 2คือ1ดังนั้น[i%2::2]
จะส่งคืนอักขระ 2 ตัวของสตริงที่มีขนาดใหญ่กว่าของเราเริ่มต้นที่ดัชนี1 ( ดัชนี0)
ถ้าi
เป็นแม้กระทั่ง% ฉัน 2เป็น1ดังนั้นกลไกดังกล่าวข้างต้นไม่เหมือนกันยกเว้นว่ามันจะเริ่มต้นที่ดัชนี0
+~-i*
- ซ้ำสตริงที่สร้างขึ้นดังกล่าวข้างต้นอย่างใดอย่างหนึ่ง"/ \ "
หรือ" | "
, I-1ครั้งและผนวกไปยังสายอื่น ๆ ประโยชน์ของผู้ประกอบการระดับบิต ( ~
- ส่วนเสริม Bitwise เทียบเท่ากับiลบจาก-1 ) คือมันไม่จำเป็นต้องใช้วงเล็บในบริบทนี้
[:k-~i]
- ได้รับทุกตัวอักษรของสตริงตัดแบ่งข้างต้นจนกว่าดัชนีK- ~ i = k - (-1 - i) = k + 1 + i
+"_/"[i>0:]
- นี้เท่านั้นที่จะเพิ่ม"/"
ถ้าฉัน≥ 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.