क्यूबिक्स, 238 234 217 151 110 100 बाइट्स
बची 14 बाइट्स ETHProductions की बदौलत
u'^.:s+.;;;\-?W?rsos\(rrOIO:ur>'=o;^u.;;.>$.vUo^'rsu1;;@!\q?s*su;;IOu*+qU../;(*\(s.;<..r:''uq....qu\
विस्तारित:
u ' ^ . :
s + . ; ;
; \ - ? W
? r s o s
\ ( r r O
I O : u r > ' = o ; ^ u . ; ; . > $ . v
U o ^ ' r s u 1 ; ; @ ! \ q ? s * s u ;
; I O u * + q U . . / ; ( * \ ( s . ; <
. . r : ' ' u q . . . . q u \ . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
इसे ऑनलाइन आज़माएं!
इसे यहाँ आज़माएँ
व्याख्या
कोड में दो छोरों के साथ 8 चरण होते हैं। मैं भाग द्वारा कोड भाग पर जाऊंगा।
चरण 1 (ए ^ बी)
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
I O : u . . . . . . . . . . . . . . . .
U o ^ ' . . . . . . . . . . . . . . . .
; I O u . . . . . . / ; ( * \ . . . . .
? ? r : . . . . . . ? . . . \ ? ? ? ? ?
. . . . ? . . . . . ? . . . . . . . . .
? ? ? ? ?
. . . . .
. . . . .
. . . . .
. . . . .
यह उन हिस्सों के साथ क्यूब है जो हटाए गए पहले चरण के लिए अप्रासंगिक हैं। प्रश्नचिह्न दिखाता है कि आईपी जिस ओपी पर जाएगा, वह अपना रास्ता और अधिक स्पष्ट कर देगा।
IO:'^o;IO:r*(; # Explanation
I # Push the first input (A)
O # output that
: # duplicate it
'^ # Push the character "^"
o # output that
; # pop it from the stack
I # Push the second input (B)
O # output that
: # duplicate
r # rotate top 3 elements
* # Push the product of the top two elements
( # decrease it by one
; # pop it from the stack (making the last
# two operations useless, but doing it
# this way saves 10B)
अब, स्टैक इस तरह दिखता है: A, B, A, B
चरण 2 (प्रिंट लूप के लिए तैयार)
प्रिंट पाश 3 तर्कों (स्टैक पर शीर्ष 3 तत्वों) लेता है: P
, Q
और R
। P
पुनरावृत्तियों की राशि Q
है, विभाजक (वर्ण कोड) है और R
दोहराने की संख्या है। सौभाग्य से, लूप उस आवश्यकता का भी ध्यान रखता है जिसके परिणामस्वरूप स्ट्रिंग को समाप्त होना चाहिए R
, नहीं Q
।
हम दोहराना चाहते हैं A*
वास्तव में B
, कई बार तो विभाजक है *
। ध्यान दें कि स्टैक के रूप में शुरू होता है A, B, A, B
। एक बार फिर, मैंने सभी अप्रासंगिक निर्देशों को हटा दिया। आईपी S
उत्तर की ओर इशारा करते हुए शुरू होता है ।
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . r . . . . . . . . . . . . . . .
. . . . r . . . . . . . . . . . . . . .
. . . . * . . . . . . . . . . . . . . .
. . . . ' . . . . . . . . . . . . . . .
. . . . S . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
'*rr # Explanation
'* # Push * (Stack: A, B, A, B, *)
rr # Rotate top three elements twice
स्टैक अब है A, B, B, *, A
।
चरण 3/6/8 (प्रिंट लूप)
संकल्पना
E . . . . .
? r s o s u
\ ( r r O <
. . . . . S
आईपी S
उत्तर की ओर इशारा करते हुए लूप में प्रवेश करता है , और E
फिर से उत्तर की ओर इशारा करते हुए लूप से बाहर निकलता है । इस स्पष्टीकरण के लिए, स्टैक को सेट किया गया है [..., A, B, C]
। निम्नलिखित निर्देशों को निष्पादित किया जाता है। ध्यान दें कि आईपी प्रश्न चिह्न से पहले लूप को नहीं छोड़ सकता है, इसलिए पहले चार निर्देशों को हमेशा निष्पादित किया जाएगा।
Orr(?rsos # Explanation
O # Output `C`
rr # Rotate top three elements twice (Stack: [..., B, C, A])
( # Decrease A by one (Stack: [..., B, C, A-1])
? # If top of stack (A) > 0:
r # Rotate top of stack (Stack: [..., A-1, B, C])
s # Swap top elements (Stack: [..., A-1, C, B])
o # Output top of stack (B) as character code
s # Swap top elements (Stack: [..., A-1, B, C]
#
# ... and repeat ...
कार्यान्वयन
यहाँ फिर से क्यूब है, अप्रासंगिक भागों को हटा दिया गया है। आईपी S
पूर्व की ओर इशारा करते हुए शुरू होता है ।
. . . . .
. . . . .
. . . . .
? r s o s
\ ( r r O
. . . . . S ' = o ; ^ u . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
जैसा कि आप देख सकते हैं, आईपी लूप में प्रवेश करने से पहले चार निर्देशों में आता है। चूँकि वर्ण कोड फिर से हटा दिया जाता है, हम इस भाग में प्रवेश करते ही लूप तक पहुँच जाते हैं।
'=o; # Explanation
'= # Push =
o # Output
; # Pop from stack
लूप के अंदर, ऊपर की व्याख्या है।
चरण 4 (आईपी को अलग करना)
चूंकि हम कई बार उपरोक्त लूप का उपयोग करते हैं, और वे सभी आईपी को एक ही स्थान पर समाप्त करने का कारण बनते हैं, हमें कई रनों के बीच अंतर करना होगा। सबसे पहले, हम विभाजक के बीच अंतर कर सकते हैं (पहले रन में ए है *
, जबकि रन दो और तीन में एक +
विभाजक है)। दोहराए गए संख्या के मूल्य की जांच करके हम रन 2 और 3 के बीच अंतर कर सकते हैं। यदि यह एक है, तो कार्यक्रम समाप्त हो जाना चाहिए।
पहली तुलना
यहाँ यह क्यूब पर कैसा दिखता है। आईपी एस पर शुरू होता है और उत्तर की ओर इशारा करता है। स्टैक शामिल हैं [..., * or +, A or 1, 0]
। नंबर 1 दिखाता है कि आईपी कहाँ समाप्त होगा यदि यह पहला लूप है (उत्तर की ओर इशारा करते हुए) और नंबर 2 से पता चलता है कि जहाँ यह दूसरा (या तीसरा) लूप है (पूर्व की ओर इशारा करते हुए) तो आईपी ख़त्म हो जाएगा।
u ' . . .
s + . 1 .
; \ - ? 2
S . . . .
. . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
;s'+-? # Explanation
; # Delete top element (0)
s # Swap the top two elements (Stack: 1/A, */+)
'+ # Push the character code of +
- # Subtract the top two elements and push
# that to the stack (Stack: 1/A, */+, +, (*/+)-+)
? # Changes the direction based on the top
# item on the stack. If it's 0 (if (*/+) == +)
# the IP continues going right, otherwise, it
# turns and continues going north.
यदि आईपी अब है 1
, तो स्टैक है [A, *, +, -1]
। अन्यथा, ढेर है [A or 1, +, +, 0]
। जैसा कि आप देख सकते हैं, दूसरे मामले के ढेर में अभी भी एक अज्ञात है, इसलिए हमें एक और तुलना करनी होगी।
दूसरी तुलना
क्योंकि आईपी चरण 5 से गुजर चुका है, स्टैक इस तरह दिखता है [A^(B-1) or nothing, A or 1, +, +, 0]
:। यदि पहला तत्व है nothing
, तो दूसरा तत्व है 1
, और रिवर्स भी है। क्यूब इस तरह दिखता है, आईपी एस पर शुरू होता है और पूर्व की ओर इशारा करता है। यदि यह दूसरा लूप है, तो आईपी समाप्त होता हैE
पश्चिम की ओर इशारा करते हुए । अन्यथा, कार्यक्रम हिट @
और समाप्त हो जाता है।
. . . . .
. . . . ;
. . . S W
. . . . .
. . . . .
. . . . . . . . . . . . . ; . . . . . .
. . . . . . . . . E @ ! \ q . . . . . .
. . . . . . . . . . . . ( * . . . . . .
. . . . . . . . . . . . q u . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
नियंत्रण प्रवाह के लिए कुछ भी नहीं करने वाले निर्देशों को नीचे सूचीबद्ध किया गया है।
;;q*q(!@
;; # Delete top two elements (Stack [A^(B-1)/null, A/1, +])
q # Send top element to the bottom (Stack [+, A^(B-1)/0, A/1])
* # Push product of top two elements
# (Stack [+, A^(B-1)/0, A/1, A^B/0])
q # Send top element to the bottom
# (Stack [A^B/0, +, A^(B-1)/0, A/1])
( # Decrease the top element by 1
# (Stack [A^B/0, +, A^(B-1)/0, (A-1)/0])
! # If (top element == 0):
@ # Stop program
स्टैक अब है [A^B, +, A^(B-1), A-1]
, बशर्ते कार्यक्रम समाप्त नहीं हुआ।
चरण 5 ("A +" (दोहराने A ^ (B-1)) की तैयारी)
अफसोस की बात है कि क्यूबिक्स के पास पावर ऑपरेटर नहीं है, इसलिए हमें एक और लूप की जरूरत है। हालांकि, हमें पहले स्टैक को साफ करने की आवश्यकता है, जिसमें अब शामिल है[B, A, *, +, -1]
।
सफाई करना
यहाँ फिर से घन है। हमेशा की तरह, आईपी एस (उत्तर की ओर इशारा करते हुए) से शुरू होता है, और पश्चिम की ओर ई पर समाप्त होता है।
. . . ? .
. . . ; .
. . . S .
. . . . .
. . . . .
. . . . . . . . . . . . . . . . > $ . v
. . . . . . . . . . . . . . . . . . . ;
. . . . . . . . . . . . . . . . . . E <
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
;; # Explanation
;; # Remove top 2 elements (Stack: [B, A, *])
ए ^ (बी -1) की गणना
एक अन्य लूप जो प्रिंट लूप के समान ही काम करता है, लेकिन यह थोड़ा अधिक कॉम्पैक्ट है। आईपी शुरू होता है S
, पश्चिम की ओर इशारा करते हुए, स्टैक के साथ [B, A, *]
। आईपी E
उत्तर की ओर इशारा करते हुए बाहर निकलता है ।
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . . . . . . . . . . . E . . . . .
. . . . . . . . . . . . . . ? s * s u .
. . . . . . . . . . . . . . \ ( s . ; S
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
लूप बॉडी निम्नलिखित है।
;s(?s*s # Explanation
; # Pop top element.
s # Shift top elements.
( # Decrease top element by one
? # If not 0:
s # Shift top elements again
* # Multiply
s # Shift back
#
# ... and repeat ...
परिणामी स्टैक है [A, A^(B-1), 0]
।
स्टैक की सफाई (फिर से)
अब हमें प्रिंट लूप को फिर से प्राप्त करने की आवश्यकता है, जिसमें स्टैक के शीर्ष के साथ है [..., A^(B-1), +, A]
। ऐसा करने के लिए, हम निम्नलिखित को निष्पादित करते हैं। यहाँ फिर से घन है,
. . ^ ? :
. . . . .
. . . . .
. . . . .
E . . . .
. . . . . s . . . . . . . . ; . . $ . .
. . . . . + q U . . . . . . S . . s . .
. . . . . ' u q . . . . . . . . . ? . .
. . . . . . . ? . . . . . . . . . ? . .
. . . . . . . ? . . . . . . . . . ? . .
. . ? . .
. . ? . .
. . ? . .
. . ? . .
. . ? . .
;:$sqq'+s # Explanation
; # Delete top element (Stack: [A, A^(B-1)])
: # Copy top element
$s # No-op
qq # Send top two elements to the bottom
# (Stack: [A^(B-1), A^(B-1), A])
'+ # Push +
# (Stack: [A^(B-1), A^(B-1), A, +])
s # Swap top two elements
# (Stack: [A^(B-1), A^(B-1), +, A])
चरण 7 (अंतिम लूप की तैयारी)
स्टैक अब है [A^B, +, A^(B-1), A-1]
, आईपी शुरू होता है S
, पश्चिम में जा रहा है, और E
सही पर समाप्त होता है ।
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . . E . . . . . . . . . . . . . .
. . . . . . u 1 ; ; S . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
निष्पादित किए गए निर्देश:
;;1 # Explanation
;; # Delete top two elements
1 # Push 1
स्टैक अब जैसा दिखता है [A^B, +, 1]
, और आईपी प्रिंट लूप में प्रवेश करने वाला है, इसलिए हम काम कर रहे हैं।