i=k=input()
while i:i-=1;print(" "*(k+~i)+"\\"+i*' / |\ '[i%2::2])[:k-~i]+"_/"[i>0:]
Cobalah online!
Salah satu trik Erik memungkinkan saya bermain golf 3 byte! Disimpan 3 byte berkat Jonathan Allan.
Bagaimana ini bekerja?
Pertama, ini mendapat input dari STDIN dan menugaskannya ke dua variabel terpisah idan k. Kemudian, ketika variabelnya ibenar, kami menurunkannya dan menghasilkan string yang sesuai; ini adalah singkatan untuk pengulangan dari input - 1 hingga 0.
Menghasilkan String
Saya akan membagi ini menjadi lebih banyak bagian:
Pertama, mendapatkan jarak memimpin dicapai dengan " "*(k+~i). Karena idipetakan melalui rentang (input, 0] , kita harus mengurangkannya dari k(input asli yang disimpan dengan aman), mengurangi dan mengulangi spasi yang berkali-kali.
+"\\"- Menambahkan karakter "\"ke spasi di atas.
' / |\ '[i%2::2]- Menghasilkan dua string kami, yaitu "/ \ "dan " | ", dengan cara berikut:
Jika iganjil, i% 2 adalah 1 , dengan demikian [i%2::2]mengembalikan setiap 2 karakter dari string kami yang lebih besar, mulai dari indeks 1 (0-diindeks).
Jika igenap, i% 2 adalah 1 , maka mekanisme di atas melakukan hal yang sama kecuali dimulai pada indeks 0 .
+~-i*- Mengulang string yang dihasilkan di atas, baik "/ \ "atau " | ", i-1 kali, dan menambahkannya ke string lain. Manfaat dari operator bitwise ( ~- Komplemen Bitwise, Setara dengan saya dikurangi -1 ) adalah tidak memerlukan tanda kurung dalam konteks ini.
[:k-~i]- Mendapat semua karakter dari string yang digabungkan di atas sampai indeks k- ~ i = k - (-1 - i) = k + 1 + i .
+"_/"[i>0:]- Ini hanya menambah "/"jika saya ≥ 1 , kalau tidak ditambahkan _/.
Contoh lengkap / detail eksekusi
Mari kita ambil contoh cara kerja untuk input 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.