यह आश्चर्यजनक रूप से मुश्किल था, और मुझे यकीन नहीं है कि यह इष्टतम है ...
<.@!$?
कोड को पैडिंग और अनफ़ॉलो करने के बाद, यह निम्न हेक्स ग्रिड का प्रतिनिधित्व करता है:
यह मेरे हाल के त्रुटि-मुक्त बिल्ली कार्यक्रम की तरह एक समान नियंत्रण प्रवाह का उपयोग करता है , विरोधी-विकर्णों के साथ आगे बढ़ रहा है। यह प्राप्त करने के लिए कि हम निर्देश पॉइंटर (IP) को बाईं ओर मोड़कर शुरू करते हैं, जहां बैंगनी मार्ग निचले बाएं कोने में घूमता है।
?
इनपुट को पूर्णांक के रूप में पढ़ता है। !
इसे वापस प्रिंट करता है। .
सिर्फ एक नो-ऑप है। अब ग्रिड का कोना एक शाखा के रूप में कार्य करता है:
यदि इनपुट था 0
, तो आईपी लाल पथ के साथ जारी रहेगा, जो बस प्रोग्राम को समाप्त करता है @
।
यदि इनपुट था 1
, तो आईपी ग्रीन पथ पर जारी रहेगा। फिर से, .
बस एक नो-ऑप है, लेकिन $
बेफुन्ज के ट्रैम्पोलिन के बराबर है: यह अगले निर्देश को छोड़ देता है। लपेटने के बाद, अगला निर्देश होगा ?
, लेकिन $
निष्पादन के कारण वास्तव में नीले रास्ते पर जारी रहता है, जिसकी !
एक और प्रति प्रिंट करने के लिए शुरू होती है 1
। यह लूप जिसमें केवल होता !..$
है अब अनिश्चित काल तक दोहराया जाता है।
हेक्सागोनी में नियंत्रण प्रवाह का एक अध्ययन ...
मेरा मानना है कि उपरोक्त समाधान इष्टतम है। मैंने एक ब्रूट फ़ॉरेसर लिखा है, जो सभी 6-बाइट हेक्सागोनी कार्यक्रमों की जांच करता है, जिसमें कम से कम एक-एक होता है ?!@
(जो आवश्यक होता है; मैंने भी चेक किया है :
और विभाजन-बाय-ज़ीर त्रुटि के साथ समाप्त होने के %
स्थान पर @
, लेकिन यह भी मदद नहीं की)। चेक सभी प्रोग्रामों को प्रिंट करता है जो a) 0
इनपुट पर प्रोडक्ट करता है 0
और टर्मिनेट और b) कम से कम दो 1
एस (और कुछ नहीं) का उत्पादन करता है और प्रोग्राम के पहले 60 टिक्स के भीतर समाप्त नहीं होता है (5-बाइट सॉल्यूशंस के लिए 200 टिक) । मुझे संदेह है कि कोई भी वैध समाधान 200 0
या अधिक टिक्कों को सही ढंग से पहले या दूसरे 1
को इतने छोटे ग्रिड पर प्रिंट करने के लिए ले जाएगा , इसलिए मुझे नहीं लगता कि मैं किसी भी संभावित समाधान से चूक गया हूं।
खोज में 5 बाइट्स के लिए कोई परिणाम नहीं मिला, लेकिन 6 बाइट्स के लिए 57 परिणाम (उपयोग करते हुए @
; अगर हम बाइट्स की समान मात्रा में इस सफाई से हल कर सकते हैं, तो एक त्रुटि के साथ समाप्त करने की कोई आवश्यकता नहीं है)। उन 57 में से केवल 6 झूठे सकारात्मक थे जो वास्तव में केवल दो 1
एस मुद्रित करते थे और फिर बिना किसी और मुद्रण के एक अनंत लूप में प्रवेश करते थे। एक समाधान को दो बार सूचीबद्ध किया गया था क्योंकि इसमें दो !
कमांड थे। यह ठीक 50 वैध समाधान छोड़ देता है।
समाधानों के बीच एक निश्चित मात्रा में अध: पतन होता है जहाँ एक या दो वर्ण पर्याप्त नहीं होते हैं, जैसे कि क्योंकि वे प्रभावी रूप से वैसे भी ऑप्स नहीं होते हैं। समाधानों को वास्तव में अलग-अलग कार्यक्रमों के 23 सेटों में बांटा जा सकता है (कुछ मामलों में, दो सेटों के बीच केवल एक ही वर्ण अंतर होता है, लेकिन यह नियंत्रण प्रवाह को काफी हद तक बदल देता है, इसलिए मैंने उन्हें अलग से गिना है)। दो समूह बहुत ही अप्रत्याशित तरीके से कई अनुदेश बिंदुओं का उपयोग करते हैं। जैसा कि मैं शाखाओं और दर्पणों का उपयोग करने के लिए इन तरीकों में से अधिकांश के साथ कभी नहीं आया, वे एक बहुत ही रोचक अध्ययन करते हैं कि हेक्सागोनी में किस प्रकार का नियंत्रण प्रवाह संभव है, और मैंने निश्चित रूप से भविष्य के गोल्फ के लिए कुछ नए गुर सीखे हैं।
समग्र नियंत्रण प्रवाह लगभग हमेशा एक ही है: एक नंबर पढ़ा है, इसे प्रिंट। अगर यह 0
एक रास्ता मिल गया है @
, अगर नहीं के माध्यम से पाशन रखने !
जबकि एक किनारे मूल्य के 1
। चार उल्लेखनीय अपवाद हैं:
- एक समाधान (दो में से एक
!
) 1
ग्रिड के माध्यम से प्रति दो पुनरावृत्ति प्रिंट करता है, इसलिए अधिकांश कार्यक्रमों के रूप में दो बार तेजी से मुद्रण होता है। मैंने इसे x2
नीचे के साथ चिह्नित किया है ।
- कुछ समाधान (जिनके पास एक है
o
) 1
एक 111
(वर्ण कोड ) के साथ प्रतिस्थापित करते हैं o
, इसलिए वे प्रति सेकंड तीन 1
एस मुद्रित करते हैं, जिससे वे अधिकांश कार्यक्रमों के रूप में तीन गुना तेजी से प्रिंट करते हैं। मैंने इन्हें x3
नीचे से चिह्नित किया है।
- दो समाधान संलग्न एक
1
प्रत्येक चरण में बढ़त मूल्य के लिए (ताकि 1
-> 11
-> 111
-> ...)। वे बहुत तेजी से प्रिंट करते हैं , लेकिन वे अंततः स्मृति से बाहर निकल जाएंगे। मैंने इन्हें OoM
नीचे से चिह्नित किया है।
- दो समाधान एक बहुत ही तंग लूप में प्रवेश करते हैं जो केवल आगे पीछे उछलता है
!
, हर दूसरे टिक पर मुद्रण होता है (प्रत्येक 5 वें या इसके बजाय), जो उन्हें थोड़ा तेज (और नट) बनाता है। मैंने इन्हें ><
नीचे से चिह्नित किया है।
तो यहाँ पूरा चिड़ियाघर है:
#1 #5 #12 #19
?!/$.@ ?$!>$@ .?!/$@ |!|?$@ # ><
?!/$1@ # OoM ?$!|$@ =?!/$@
?!/$=@ #20
?!/$\@ #6 #13 $@.?<!
?!/$o@ # x3 ?/!<|@ .?/!$@ $@1?<! # OoM
?!/$!@ # x2 =?/!$@ $@=?<!
#7 $@o?<! # x3
#2 ?\!<|@ #14
?!>$)@ \!?__@ #21
?!>$1@ #8 _>_!?@
?!>$o@ # x3 ?<!>$@ # >< #15
?!|$)@ \_?!$@ #22
?!|$1@ #9 <!@.$?
?!|$o@ # x3 ?\$!@$ #16 <!@/$?
\_?!_@ <!@=$?
#3 #10 <$@!$?
?!|)$@ ?~#!@) #17 <.@!$?
?!|1$@ ?~#!@1 $$?\@! </@!$?
?!|o$@ # x3 <=@!$?
#11 #18
#4 ?$)\@! \$?\@! #23
?_!<@> ?$1\@! <<@]!?
?$o\@! # x3
निम्नलिखित अधिक प्रतिनिधि समूहों के एक मुट्ठी भर के लिए एक छोटा सा walkthrough है। विशेष रूप से समूह 10 और 23 की जाँच के लायक हैं। अन्य समूहों में कई अन्य दिलचस्प और कभी-कभी जटिल मार्ग हैं, लेकिन मुझे लगता है कि मैंने आपको इसके अंत में काफी ऊब दिया है। किसी के लिए जो वास्तव में हेक्सागोनी सीखना चाहते हैं, ये निश्चित रूप से जांच के लायक हैं, क्योंकि वे दर्पण के और भी अधिक संभावित उपयोग प्रदर्शित करते हैं $
।
समूह 1
यह मेरे मूल समाधान की तुलना में अधिक विस्तृत नहीं है, लेकिन रास्ते अलग-अलग दिशाओं में चलते हैं। यह एकल कक्ष में सबसे बड़ी संख्या में भिन्नता के लिए भी अनुमति देता है, क्योंकि सही-सबसे नो-ऑप को 5 अलग-अलग कमांडों से बदला जा सकता है जो संरचना को बदलने के बिना अभी भी इसे वैध बनाते हैं:
समूह 2
यह एक काफी दिलचस्प है, क्योंकि यह केवल क्षैतिज रूप से चलता है। को लपेटने के बाद >
, आईपी कोने में शाखा को लेते हुए, तुरंत पलट जाती है। यह पूरी तरह से अच्छी तरह से नहीं आरेख है, लेकिन 1
हम मामले में पहली पंक्ति को फिर से पीछे ले जाते हैं, लेकिन इस बार पीछे। इसका मतलब यह भी है कि हम ?
फिर से दौड़ते हैं, जो अब लौटता है 0
(ईओएफ)। )
मुद्रण 1
एस रखने के लिए यह (वेतन वृद्धि) के साथ तय किया गया है । इसकी भी 5 विविधताएँ हैं, जैसा )
भी हो सकता है , 1
या हो सकता है :o
>
|
समूह ३
यह एक पिछले एक के समान दिखता है लेकिन यह नरक के रूप में गड़बड़ है। मारने के |
बाद और फिर नीचे या ऊपर की पंक्ति को एक समान करना। लेकिन एक पाश के मामले में, $
अब से अधिक छोड़ देता है )
पर दर्पण। इसलिए हम फ़िरोज़ा मार्ग को दाईं ओर का अनुसरण करते हैं, अब वृद्धि को मारें, @
इससे पहले कि हम |
फिर से चारों ओर लपेटें, और फिर शीर्ष पर हरे रास्ते पर वापस जाएं।
समूह ४
मैंने सोचा कि यह विशेष रूप से निफ्टी था:
_
ऊपरी दाएं कोने में दर्पण शुरू में नो-सेशन है, इसलिए हम साथ प्रिंट !
और मारा <
। 0
पथ अब क्षैतिज दर्पण हिट और समाप्त हो जाता है। 1
पथ वास्तव में एक दिलचस्प प्रक्षेपवक्र होती है, जबकि: इसे नीचे विक्षेपित, को लपेटता है !
, क्षैतिज दिशा में रीडायरेक्ट कर दिया जाता है और फिर वापस करने के लिए लपेटता !
फिर से । यह फिर इस rhombus आकार में चलती रहती है, प्रति बार दो बार प्रति मुद्रण (हर तीसरे टिक)।
समूह 8
यह वास्तव में तंग मुद्रण लूप के साथ दो समाधानों में से एक है:
<
शाखा के रूप में कार्य करता है। दो बार लपेटने के बाद, 0
हिट @
। 1
दूसरी ओर, पहले स्किप करता है ?
, फिर >
इसे फिर से भेजता है $
, इसलिए यह स्किप है @
। फिर आईपी फ़िरोज़ा पथ में लपेटता है, जहां यह ( >
और बीच <
में किनारे के चारों ओर लपेटकर) के बीच आगे और पीछे उछलता है ।
समूह १०
दो समूहों में से एक जो अन्य अनुदेश बिंदुओं का उपयोग करता है, और यह बिल्कुल सुंदर है। हेक्सागोनी में 6 हैं - प्रत्येक एक अलग कोने से दक्षिणावर्त किनारे से शुरू होता है, लेकिन उनमें से केवल एक ही समय में सक्रिय होता है।
हमेशा की तरह, हम साथ पढ़ते हैं ?
। अब ~
एकात्मक नकार है: यह 1
एक में बदल जाता है -1
। अगला, हमने मारा #
। यह IPs के बीच स्विच करने का एक तरीका है: यह वर्तमान बढ़त मान modulo 6 लेता है और संबंधित IP पर स्विच करता है (IPs को 0
दक्षिणावर्त दिशा से क्रमांकित किया जाता है)। तो अगर इनपुट था 0
, तो आईपी बस एक ही रहता है, और सीधे बोरिंग यात्रा करता है !@
। लेकिन अगर इनपुट था 1
, तो वर्तमान मूल्य -1
जो है 5 (mod 6)
। तो हम आईपी पर स्विच करते हैं जो बहुत ही सेल (ग्रीन पथ) पर शुरू होता है। अब #
नो-ऑप है और ?
मेमोरी एज को सेट करता है 0
। )
वेतन वृद्धि तो !
प्रिंट 1
। अब हम ~
इसे सुनिश्चित करने के लिए फिर से हिट करते हैं#
अभी भी एक नो-ऑप है (जैसा कि हमें आईपी 1 पर स्विच करने का विरोध किया गया था जो कार्यक्रम को समाप्त कर देगा)। यह दिमाग लगा रहा है कि इस छोटे से कार्यक्रम में सब कुछ एक साथ कैसे फिट बैठता है।
समूह २२
बस ध्यान दें, यह समूह मेरा मूल समाधान है। यह सबसे बड़ा समूह भी होता है, क्योंकि नो-ऑप दो अलग-अलग स्थानों में हो सकता है, और वास्तविक (प्रभावी नो-ऑप) कमांड के लिए कई विकल्प हैं।
समूह २३
यह एक से अधिक IP का उपयोग करने वाला दूसरा समूह है। वास्तव में यह एक 3 अलग-अलग आईपी का उपयोग करता है । शीर्ष दायां कोना थोड़ा गड़बड़ है, लेकिन मैं आपको इसके माध्यम से चलने की कोशिश करूंगा:
तो, आपके द्वारा पहले देखी गई शुरुआत: <
उत्तर-पूर्व को विक्षेपित करती है, ?
इनपुट पढ़ती है। अब ]
आईपी के बीच बदलने का एक और तरीका है: यह अगले आईपी को घड़ी की दिशा में नियंत्रित करता है। इसलिए हम फ़िरोज़ा पथ पर नियंत्रण स्विच करते हैं जो (मुझे पता है कि यह देखना मुश्किल है) दक्षिण-पूर्व में जाने वाले उत्तर-पूर्व कोने में शुरू होता है। यह तुरंत परिलक्षित होता है <
ताकि यह उत्तर-पश्चिम की ओर जाते हुए दक्षिण-पूर्व के कोने तक जा पहुंचे। यह हिट भी है ]
इसलिए हम अगले आईपी पर स्विच करते हैं । यह पूर्व-कोने में शुरू होने वाला ग्रे मार्ग है, जो दक्षिण-पश्चिम की ओर जा रहा है। यह इनपुट को प्रिंट करता है, फिर नॉर्थ-ईस्ट के कोने में जाता है। <
मार्ग को क्षैतिज में दर्शाया गया है, जहां यह दूसरे द्वारा परिलक्षित होता है <
। अब दाहिना हाथ<
एक शाखा के रूप में कार्य करता है: यदि इनपुट था 0
, तो आईपी उत्तर-पूर्व की ओर बढ़ता है, और इसके लिए लपेटता है @
। यदि इनपुट था 1
, तो आईपी ले जाता है !
, लेफ-थंड तक जाता है, <
जहां यह परिलक्षित होता है ... अब कोने में, यह वापस से लपेटता है !
, दाएं से विक्षेपित हो जाता <
है, बाएं से परिलक्षित होता है <
और रास्ते शुरू होते हैं ऊपर...
काफी गड़बड़ है, लेकिन एक सुंदर गड़बड़ है। :)
टिमवी के अद्भुत हेक्सागोनीकॉलर के साथ उत्पन्न आरेख ।