:-:_
इसे ऑनलाइन आज़माएं! पाद लेख में मैंने अन्य सभी 4-बाइट समाधानों को शामिल किया है। (स्टैक कैट्स पहली लाइनफीड के बाद सब कुछ अनदेखा कर देते हैं।)
रिवर्स की कोशिश करो!
व्याख्या
-n
संख्यात्मक उत्पादन पर झंडा बदल जाता है (और इनपुट है, लेकिन हम किसी भी जरूरत नहीं है), और -m
झंडा सामान्य रूप से सिर्फ एक गोल्फ सुविधा जो आप स्रोत कोड की अनावश्यक भाग से बचने की सुविधा देता है है। ऐसा इसलिए है क्योंकि हर स्टैक कैट्स प्रोग्राम को मिरर समरूपता की आवश्यकता होती है। -m
झंडे के साथ आप केवल इसे पहले आधा (केंद्रीय चरित्र) देते हैं। तो यहाँ वास्तविक कार्यक्रम है:
:-:_:-:
जैसा कि आप पहले TIO लिंक में देख सकते हैं, 4 टन बाइट समाधान है, लेकिन मैंने इसकी सरलता के लिए इसे चुना। स्टैक कैट्स स्टैक-आधारित है, और यह प्रोग्राम केवल प्रारंभिक स्टैक का उपयोग करता है। चूंकि हमारे पास कोई इनपुट नहीं है, इसलिए इसमें -1
शून्य के अनंत कुएं के ऊपर एक एकल (एक ईओएफ मार्कर) होता है। कार्यक्रम में तीन आज्ञाओं के निम्नलिखित अर्थ हैं:
: Swap the top two stack elements.
- Negate the top stack element (i.e. multiply by -1).
_ Pop a. Peek b. Push b-a.
तो यहां बताया गया है कि कैसे प्रोग्राम स्टैक को संशोधित करता है (राज्यों और कमांडों को यह इंगित करने के लिए कंपित किया जाता है कि प्रत्येक कमांड स्टैक को एक राज्य से अगले में कैसे बदलता है):
: - : _ : - :
-1 0 0 -1 1 0 0 1
0 -1 -1 0 0 1 1 0
0 0 0 0 0 0 0 0
… … … … … … … …
जैसा कि यह पता चला है, एकमात्र आदेश जो वास्तव में यहां कुछ भी करता है _
जो हमारे ईओएफ मार्कर को एक में बदल देता है 1
। कार्यक्रम के अंत में आउटपुट निहित है, और ईओएफ मार्कर वैकल्पिक है, इसलिए यह बस 1
हमें प्रिंट करता है ।
अब यदि हम स्रोत कोड को उलट देते हैं, तो निहितार्थ के कारण, वास्तविक कार्यक्रम बन जाता है:
_:-:-:_
यह कुछ अलग करता है:
_ : - : - : _
-1 1 0 0 1 -1 0 -1
0 0 1 1 0 0 -1 -1
0 0 0 0 0 0 0 0
… … … … … … … …
इस बार स्टैक का निचला भाग अभी भी एक है -1
इसलिए यह ईओएफ मार्कर के रूप में कार्य करता है और केवल इसके -1
शीर्ष पर ही प्रिंट होता है।
...
अब उस सब के साथ कहा, चूंकि स्टैक कैट्स का उलटा कोड के साथ इस तरह का एक अनूठा रिश्ता है, मुझे लगता है कि उपयोग -m
करना थोड़ा धोखा है। यह आमतौर पर केवल स्रोत कोड के अनावश्यक भाग को छोड़ कर बाइट्स को बचाने के लिए होता है, लेकिन यहां यह वास्तव में चुनौती को बहुत आसान बना देता है और यहां तक कि पूरे कार्यक्रम को छोटा कर देता है। ऐसा इसलिए है क्योंकि किसी पूर्ण प्रोग्राम को उलटने से प्रोग्राम केवल तभी बदलेगा जब उसमें कोई भी हो <>[]
, जिसका अर्थ यह भी है कि प्रोग्राम कई स्टैक का उपयोग कर समाप्त होता है (स्टैक कैट्स में वास्तव में स्टैक्स का टेप होता है, जहां सभी लेकिन प्रारंभिक एक ही भरे होते हैं के साथ शुरू करने के लिए शून्य के साथ)। इसके अलावा, इसे उल्टा करने से बस स्वैप होता है <>
और []
जोड़े, जो अभी भी निष्पादन को सममित बनाता है। उस समरूपता को तोड़ने का एकमात्र तरीका है I
जो उपयोग करता है -]
या करता है-[
या स्टैक के शीर्ष के संकेत के आधार पर कुछ भी नहीं। इसलिए...
*|]I*:*I[|*
इसे ऑनलाइन आज़माएं! पाद लेख में फिर से एक ही बाइट गिनती में अन्य सभी विकल्प शामिल हैं। उन आउटपुट में से कुछ 1 / -1 और कुछ आउटपुट 2 / -2 जैसा कि प्रत्येक प्रोग्राम के बाद संकेत दिया गया है। मैं यह एक कि उत्पादन 2 में से एक के रूप में थोड़े बेतरतीब ढंग से समझाने के लिए उठाया।
रिवर्स की कोशिश करो!
व्याख्या
जैसा कि मैंने कहा, यह थोड़ा लंबा है। यहां तक कि अगर हमने इसके लिए -m
नोटेशन का उपयोग किया है, तो यह उपर्युक्त 4 के बजाय 6 बाइट्स में वजन करेगा।
इस समय उपयोग में आदेश:
* Toggle the least significant bit of the top of the stack.
| Reverse the longest non-zero of prefix on this stack.
[] Move one stack to the left/right and take the top of the current stack with you.
I If the top of the stack is positive, -], if it's negative, -[, otherwise do nothing.
: Swap the top two stack elements.
पहला प्रोग्राम केवल दो स्टैक का उपयोग करता है। यह ASCII कला में करने के लिए थोड़ा गड़बड़ है, लेकिन मैं अपनी पूरी कोशिश करूँगा। वर्ग कोष्ठक इंगित करते हैं कि टेप हेड किस स्टैक पर है, और मैं स्टैक स्टेट्स के प्रत्येक जोड़े के बीच कमांड डालूँगा।
[-1]
… 0 0 …
0 0
… …
*
[-2]
… 0 0 …
0 0
… …
| (does nothing)
]
[-2]
… 0 0 …
0 0
… …
I
[2]
… 0 0 …
0 0
… …
*
[3]
… 0 0 …
0 0
… …
:
[0]
… 3 0 …
0 0
… …
*
[1]
… 3 0 …
0 0
… …
I
[-1]
… 3 0 …
0 0
… …
[
[-1]
… 3 0 …
0 0
… …
|
[ 3]
… -1 0 …
0 0
… …
*
[ 2]
… -1 0 …
0 0
… …
अब -1
ईओएफ मार्कर के रूप में कार्य करता है और 2
प्रिंट हो जाता है।
जब तक अन्य कार्यक्रम समान है [
। यह अभी भी लगभग सभी तरह से दूसरा है I
। हम तकनीकी रूप से एक अलग स्टैक पर होंगे, लेकिन उन पर मूल्यों के बिना, वे सभी अविवेच्य हैं। लेकिन फिर फर्क पड़ता है I[
और I]
समाप्त होता है:
*|[I*:*I
[-1]
… 3 0 0 …
0 0 0
… … …
]
[-1]
… 3 0 0 …
0 0 0
… … …
| (does nothing)
*
[-2]
… 3 0 0 …
0 0 0
… … …
और इस बार, हमारे पास EOF मार्कर नहीं है, लेकिन कार्यक्रम अभी भी आउटपुट करता है -2
।
-
(0x45 = 0b00101101) जेली में काम करता है --
उपज -1 क्योंकि यह शाब्दिक -1 को परिभाषित करता है, जबकिṆ
(0xB4 = 0b1010100) 1 उपज देता है क्योंकि यह तार्किक तार्किक प्रदर्शन नहीं करता है शून्य के निहित इनपुट के। (बेशकṆ
काम करता है: पी)