i=k=input()
while i:i-=1;print(" "*(k+~i)+"\\"+i*' / |\ '[i%2::2])[:k-~i]+"_/"[i>0:]
इसे ऑनलाइन आज़माएं!
एरिक की चाल में से एक ने मुझे 3 बाइट्स की अनुमति दी! जोनाथन एलन के लिए 3 बाइट्स को सहेजा गया।
यह कैसे काम करता है
सबसे पहले, यह STDIN से इनपुट प्राप्त करता है और इसे दो अलग-अलग वेरिएबल्स में असाइन करता है iऔर k। तब, जबकि चर iसत्य है, हम इसे घटाते हैं और तदनुसार तार उत्पन्न करते हैं; यह इनपुट से लूपिंग के लिए एक शॉर्टहैंड है - 1 सभी तरह से नीचे 0 पर।
स्ट्रिंग्स बनाना
मैं इसे और भागों में विभाजित करूँगा:
सबसे पहले, अग्रणी रिक्ति प्राप्त करने के साथ प्राप्त किया जाता है " "*(k+~i)। चूंकि iरेंज (इनपुट, 0] के माध्यम से मैप किया जाता है , हमें इसे k(हमारे सुरक्षित रूप से संग्रहीत मूल इनपुट से) घटाना चाहिए , और कई बार एक स्थान को दोहराना चाहिए।
+"\\"- चरित्र "\"को ऊपर के रिक्त स्थान में जोड़ता है।
' / |\ '[i%2::2]- निम्नलिखित तरीके से , हमारे दो तार उत्पन्न करता है, "/ \ "और " | ":
तो iअजीब है, मैं% 2 है 1 , इस प्रकार [i%2::2]हमारे बड़े स्ट्रिंग के प्रत्येक 2 वर्ण देता है, सूचकांक पर शुरू 1 (अनुक्रमित 0)।
तो iभी है, मैं% 2 है 1 , एक ही करता है इस प्रकार ऊपर तंत्र को छोड़कर यह सूचकांक पर शुरू होता है 0 ।
+~-i*- से दोहराया जाएगा स्ट्रिंग ऊपर जेनरेट, या तो "/ \ "या " | ", i-1 बार, और अन्य तार करने के लिए इसे जोड़ देता है। बिटवाइज ऑपरेटर ( ~- बिटवाइज़ कॉम्प्लिमेंट, इक्वलेंट टू आई सबट्रेक्ट -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.