भूलभुलैया , 28 25 24 23 22 बाइट्स
" >
?!?:|}\{@
@\?"":)!
यह पागल मज़ा था! :) यह अब तक का सबसे घनी संकुचित भूलभुलैया कार्यक्रम है जो मैंने अब तक लिखा है। मेरे पास 20 और 21 बाइट्स में कई संस्करण थे जो लगभग काम करते थे कि मुझे अभी भी संदेह है कि यह इष्टतम है ...
यह सकारात्मक पूर्णांकों की सूची के रूप में इनपुट लेता है (एक मनमाने ढंग से सीमांकक के साथ), और परिणाम को STDOUT को लाइनफीड-सीमांकित पूर्णांक के रूप में प्रिंट करता है।
20/21 बाइट्स के लिए शिकार: मैंने फॉर्म के सभी कार्यक्रमों की जाँच की है
" XX
?!?X}\{@
@\?XX)!
X
ब्रूट बल द्वारा कोई भी उचित चरित्र कहां है, लेकिन कोई भी वैध समाधान नहीं मिला। बेशक इसका मतलब यह नहीं है कि एक छोटा समाधान मौजूद नहीं है, लेकिन इसकी संरचना के लिए सभ्य मान्यताओं के बिना 20-बाइट कार्यक्रमों को बाध्य करना संभव नहीं है।
व्याख्या
(स्पष्टीकरण थोड़ा पुराना है, लेकिन मैं अभी भी आश्वस्त नहीं हूं कि समाधान इष्टतम है, इसलिए मैं इसे अपडेट करने के साथ इंतजार करूंगा।)
इसलिए, आम तौर पर भूलभुलैया कार्यक्रमों को माज़ की तरह देखा जाता है। जबकि निर्देश सूचक एक गलियारे में है, यह उस गलियारे का अनुसरण करेगा। जब आईपी किसी भी तरह के जंक्शन से टकराता है, तो दिशा को लैबिंथिथ के मुख्य स्टैक के शीर्ष मूल्य के आधार पर निर्धारित किया जाता है (लैब्रिंथ में दो स्टैक होते हैं, जिसमें नीचे शून्य की अनंत राशि होती है)। इसका आम तौर पर मतलब है कि कोई भी गैर-तुच्छ लूप काफी महंगा होगा, क्योंकि अगर आपके पास सभी जगहों पर नॉन-वॉल सेल हैं तो सब कुछ एक जंक्शन है, और ज्यादातर मामलों में आईपी के लिए स्टैक के शीर्ष का सही मूल्य नहीं होगा। आप जिस रास्ते पर जाना चाहते हैं, ले जाएं। तो आप क्या करते हैं आप छोरों को बड़ा करते हैं जैसे कि उनके पास केंद्र में एक पूरी तरह से केवल एक अच्छी तरह से परिभाषित प्रविष्टि और निकास बिंदु है।
लेकिन इस बार मैं वास्तव में भाग्यशाली था और सब कुछ इतनी अच्छी तरह से एक साथ फिट हो गया, कि मैं इसे एक बड़े झुरमुट में डाल सकता था। :)
_
दक्षिण की ओर जाने पर नियंत्रण प्रवाह शुरू होता है । _
मुख्य ढेर पर एक शून्य धक्का। यह एक नो-ऑप की तरह लग सकता है, लेकिन इससे (गैर-निहित) स्टैक की गहराई बढ़ जाती है, 1
जिसकी हमें बाद में आवश्यकता होगी।
?
STDIN से एक पूर्णांक पढ़ता है। यदि पढ़ने के लिए अधिक पूर्णांक नहीं हैं, तो यह शून्य को धक्का देता है। उस स्थिति में, आईपी दक्षिण चलती रहती है और @
कार्यक्रम को तुरंत समाप्त कर देती है (क्योंकि इनपुट सूची खाली है)। अन्यथा, आईपी पूर्व में बदल जाता है।
अब हम दो निकास बिंदुओं के साथ बहुत तंग पाश में प्रवेश कर रहे हैं:
!?;
\?
;
!
स्टैक पर केवल एक शून्य छोड़कर STDOUT में पूर्णांक को प्रिंट करता है। आईपी पूर्व की ओर बढ़ता रहता है, और ?
अगले पूर्णांक को पढ़ता है। यदि यह गैर-शून्य है, तो हम एक अधिकार लेते हैं और दक्षिण को स्थानांतरित करते हैं। ?
एक और एक (अगले भी सूचकांक) पढ़ता है। फिर, अगर वह गैर-शून्य है, तो हम एक अधिकार लेते हैं और पश्चिम को स्थानांतरित करते हैं।
फिर \
स्टैक को बदलने के बिना एक लाइनफीड प्रिंट करता है, इसलिए हम उत्तर की ओर बढ़ते हुए एक और अधिकार लेते हैं। !
अगले-इंडेक्स पूर्णांक को प्रिंट करता है। चूंकि अब स्टैक पर कम से कम एक (पॉजिटिव) विषम-इंडेक्स पूर्णांक है, हम दाएं मुड़ते हैं और लूप दोहराता है।
एक बार या तो ?
सूची के अंत को हिट करने के बाद, वे एक शून्य को धक्का देते हैं और सीधे उसी पर चलते हैं ;
, जो उस शून्य को छोड़ देता है।
इस मामले में कि सूची में केवल एक ही तत्व था, हम कर रहे हैं (क्योंकि हमने तुरंत ही छाप दिया है), इसलिए आईपी पूर्व के सभी तरह से आगे बढ़ेगा @
, फिर से कार्यक्रम को समाप्त करना (एक अनुगामी छापना) रास्ते में लाइनफीड)।
अन्यथा, हमें विषम-इंडेक्स पूर्णांक को भी प्रिंट करने की आवश्यकता है। उस स्थिति में दोनों मार्ग (पहले लूप के दो निकास बिंदुओं से) मध्य में विलीन हो जाते हैं "
, दोनों में पूर्व की ओर मुड़ते हैं।
_
शून्य को धकेलने से बचने के लिए बाईं ओर ले जाता है @
, और ;
उस शून्य को छोड़ देता है। अब हम एक नया लूप दर्ज करते हैं:
"}
""
IP, बायीं ओर घूमते हुए, घड़ी की सूई में लूप के चारों ओर जाते हुए, नीचे-बाएँ सेल में प्रवेश करता है। }
सहायक ढेर करने पर मुख्य ढेर के शीर्ष बदलाव। जबकि स्टैक पर अभी भी एक तत्व है, आईपी अपनी बात करता रहता है। एक बार सब कुछ सहायक स्टैक में स्थानांतरित कर दिया गया (और प्रक्रिया में उलट), आईपी अंतिम लूप में प्रवेश करने के बजाय पूर्व की ओर बढ़ रहा है:
\{@
#!
\
फिर से एक लाइनफीड प्रिंट करता है, {
एक आइटम को सहायक स्टैक से वापस मुख्य पर ले जाता है। यदि वह अभी भी सूची का एक आइटम था, तो यह सकारात्मक होगा, और आईपी दक्षिण में बदल जाता है, जहां आइटम के साथ मुद्रित किया जाता है !
। फिर #
स्टैक गहराई को धक्का देता है (और अब यह वह जगह है जहां प्रारंभिक _
महत्वपूर्ण है, क्योंकि #
यह एक सकारात्मक स्टैक गहराई सुनिश्चित करता है), ताकि आईपी अभी भी फिर से \
और {
फिर से सही हो जाए।
जब हमने सबकुछ छाप दिया, {
तो सहायक स्टैक के नीचे से एक शून्य खींचता है, आईपी पूर्व को जारी रखता है, और @
कार्यक्रम को समाप्त करता है।