_8
,%
;
"}{{+_5
"= %_!
= """{
;"{" )!
एक विभाजन-दर-शून्य त्रुटि (STDERR पर त्रुटि संदेश) के साथ निर्देश।
इसे ऑनलाइन आज़माएं!
लेआउट वास्तव में अक्षम लगता है, लेकिन मैं अभी इसे गोल्फ के लिए एक रास्ता नहीं देख रहा हूं।
व्याख्या
यह समाधान डेनिस की अंकगणितीय चाल पर आधारित है: सभी वर्ण कोड मोडुलो लें 8
, दोनों सिरों से एक जोड़ी जोड़ें और सुनिश्चित करें कि यह विभाज्य है 5
।
भूलभुलैया प्राइमर:
- लैब्रिंथ में मनमाने ढंग से सटीक पूर्णांक, मुख्य और ऑक्स (इलरी) के दो ढेर होते हैं, जो शुरू में शून्य (अनंत) अनंत राशि से भरे होते हैं।
- स्रोत कोड एक भूलभुलैया जैसा दिखता है, जहां निर्देश सूचक (आईपी) गलियारों का अनुसरण करता है जब यह (यहां तक कि कोनों के आसपास भी) हो सकता है। कोड पढ़ने के क्रम में पहले वैध चरित्र से शुरू होता है, अर्थात इस मामले में शीर्ष बाएं कोने में। जब आईपी जंक्शन के किसी भी रूप में आता है (यानी इसके अलावा कई आसन्न कोशिकाएं), तो यह मुख्य स्टैक के शीर्ष के आधार पर एक दिशा लेगा। बुनियादी नियम हैं: नकारात्मक होने पर बाएं मुड़ें, शून्य होने पर आगे बढ़ते रहें, सकारात्मक होने पर दाएं मुड़ें। और जब इनमें से एक भी संभव नहीं है क्योंकि दीवार है, तो आईपी विपरीत दिशा में ले जाएगा। मृत सिरों को मारते समय आईपी भी घूमता है।
- अंकों को मुख्य स्टैक के शीर्ष 10 से गुणा करके और फिर अंकों को जोड़कर संसाधित किया जाता है।
कोड एक छोटे 2x2, क्लॉक वाइज लूप से शुरू होता है, जो सभी इनपुट मोडुलो 8 को पढ़ता है:
_ Push a 0.
8 Turn into 8.
% Modulo. The last three commands do nothing on the first iteration
and will take the last character code modulo 8 on further iterations.
, Read a character from STDIN or -1 at EOF. At EOF we will leave loop.
अब ;
सादर प्रणाम -1
। हम एक और दक्षिणावर्त लूप दर्ज करते हैं जो मुख्य स्टैक (यानी अंतिम वर्ण) के शीर्ष को नीचे की ओर ले जाता है:
" No-op, does nothing.
} Move top of the stack over to aux. If it was at the bottom of the stack
this will expose a zero underneath and we leave the loop.
= Swap top of main with top of aux. The effect of the last two commands
together is to move the second-to-top stack element from main to aux.
" No-op.
अब एक छोटा रैखिक है:
{{ Pull two characters from aux to main, i.e. the first and last (remaining)
characters of the input (mod 8).
+ Add them.
_5 Push 5.
% Modulo.
आईपी अब एक जंक्शन पर है जो 5. से विभाज्यता का परीक्षण करने के लिए एक शाखा के रूप में कार्य करता है। यदि मोड्यूलो का परिणाम गैर-शून्य है, तो हम जानते हैं कि इनपुट एक वाटसन-क्रिक पैलिंड्रोम नहीं है और हम पूर्व की ओर मुड़ते हैं:
_ Push 0.
! Print it. The IP hits a dead end and turns around.
_ Push 0.
% Try to take modulo, but division by zero fails and the program terminates.
अन्यथा, हमें शेष इनपुट की जांच करते रहना होगा, इसलिए आईपी दक्षिण की ओर जाता है। {
शेष इनपुट के निचले हिस्से में खींचती है। यदि हमने इनपुट समाप्त कर दिया है, तो यह एक 0
( aux के नीचे से ) होगा, और IP दक्षिण की ओर बढ़ना जारी रखेगा:
) Increment 0 to 1.
! Print it. The IP hits a dead end and turns around.
) Increment 0 to 1.
{ Pull a zero over from aux, IP keeps moving north.
% Try to take modulo, but division by zero fails and the program terminates.
अन्यथा, जाँच किए जाने वाले स्ट्रिंग में अधिक वर्ण हैं। आईपी पश्चिम की ओर मुड़ता है और अगले (दक्षिणावर्त) 2x2 लूप में चला जाता है जिसमें बड़े पैमाने पर बिना ऑप्स होते हैं:
" No-op.
" No-op.
{ Pull one value over from aux. If it's the bottom of aux, this will be
zero and the IP will leave the loop eastward.
" No-op.
इस पाश के बाद, हमें मुख्य स्टैक पर इनपुट मिला है, इसके पहले और अंतिम चरित्र को छोड़कर और शीर्ष पर एक शून्य के साथ। ;
छोड देता है 0
और फिर =
ढेर की सबसे ऊपर अदला-बदली, लेकिन यह सिर्फ पहली रद्द करने के लिए है =
, पाश में क्योंकि अब हम एक अलग स्थान में पाश में प्रवेश कर रहे हैं। धोये और दोहराएं।