मैं आपके सामने प्रस्तुत करता हूं, हेक्सागोनी आत्म-व्याख्याकार का पहला 3% ...
|./...\..._..>}{<$}=<;>'<..../;<_'\{*46\..8._~;/;{{;<..|M..'{.>{{=.<.).|.."~....._.>(=</.\=\'$/}{<}.\../>../..._>../_....@/{$|....>...</..~\.>,<$/'";{}({/>-'(<\=&\><${~-"~<$)<....'.>=&'*){=&')&}\'\'2"'23}}_}&<_3.>.'*)'-<>{=/{\*={(&)'){\$<....={\>}}}\&32'-<=._.)}=)+'_+'&<
इसे ऑनलाइन आज़माएं! आप इसे स्वयं भी चला सकते हैं, लेकिन इसमें लगभग 5-10 सेकंड का समय लगेगा।
सिद्धांत रूप में, यह पक्ष-लंबाई 9 (217 या उससे कम के स्कोर के लिए) में फिट हो सकता है, क्योंकि यह केवल 201 कमांड का उपयोग करता है, और मेरे द्वारा पहले लिखे गए ungolfed संस्करण (केवल साइड-लेंथ 30 पर) को केवल 178 आदेशों की आवश्यकता है। हालाँकि, मुझे पूरा यकीन है कि यह हमेशा के लिए सब कुछ ठीक कर देगा, इसलिए मुझे यकीन नहीं है कि मैं वास्तव में इसका प्रयास करूँगा।
अंतिम एक या दो पंक्तियों के उपयोग से बचकर आकार 10 में इसे थोड़ा सा गोल करना भी संभव है, ताकि पीछे चल रहे नो-ऑप्स को छोड़ा जा सके, लेकिन इसके लिए पहले मार्ग में से एक के रूप में पर्याप्त पुनर्लेखन की आवश्यकता होगी। जॉइनस लेफ्ट लेफ्ट कॉर्नर का इस्तेमाल करता है।
व्याख्या
आइए कोड को अनफॉलो करके और कंट्रोल फ्लो पाथ को एनोटेट करके शुरू करें:
यह अभी भी काफी गड़बड़ है, इसलिए यहां "अनलॉल्फ्ड" कोड के लिए वही आरेख है जो मैंने पहले लिखा था (वास्तव में, यह साइड-लेंथ 20 है और मूल रूप से मैंने साइड-लेंथ 30 पर कोड लिखा था लेकिन यह इतना विरल था कि यह 'सभी में पठनीयता में सुधार नहीं होता है, इसलिए मैंने आकार को थोड़ा अधिक उचित बनाने के लिए इसे थोड़ा संकुचित कर दिया है):
बड़े संस्करण के लिए क्लिक करें।
रंग बिल्कुल समान हैं कुछ बहुत ही मामूली विवरणों के अलावा, गैर-नियंत्रण-प्रवाह आदेश भी बिल्कुल समान हैं। इसलिए मैं समझा रहा हूं कि यह कैसे काम करता है जो अनऑर्गोडेड संस्करण पर आधारित है, और यदि आप वास्तव में जानना चाहते हैं कि गोल्फ कैसे काम करता है, तो आप जांच कर सकते हैं कि बड़े हेक्सागोन में कौन से भागों के अनुरूप हैं। (केवल पकड़ यह है कि गोल्फ कोड एक दर्पण से शुरू होता है ताकि वास्तविक कोड बाएं कोने में शुरू हो।)
मूल एल्गोरिथ्म लगभग मेरे CJam उत्तर के समान है । दो अंतर हैं:
- केंद्रित हेक्सागोनल संख्या समीकरण को हल करने के बजाय, मैं बस लगातार केंद्रित हेक्सागोनल संख्याओं की गणना करता हूं जब तक कि इनपुट की लंबाई के बराबर या उससे बड़ा न हो। ऐसा इसलिए है क्योंकि हेक्सागोनी में एक वर्गमूल की गणना करने का सरल तरीका नहीं है।
- इसके बजाय इनपुट को बिना ऑप्स के पैड करने के बजाय, मैं बाद में जांचता हूं कि क्या मैंने पहले ही इनपुट में कमांड को समाप्त कर दिया है और
.
यदि मेरे पास है तो इसके बजाय प्रिंट करें ।
इसका मतलब है कि मूल विचार नीचे उबलता है:
- अपनी लंबाई की गणना करते समय इनपुट स्ट्रिंग पढ़ें और स्टोर करें।
- सबसे छोटी साइड-लंबाई
N
(और इसी केंद्रित हेक्सागोनल संख्या hex(N)
) का पता लगाएं जो पूरे इनपुट को पकड़ सकती है।
- व्यास की गणना करें
2N-1
।
- प्रत्येक पंक्ति के लिए, इंडेंट और कोशिकाओं की संख्या (जो योग करें
2N-1
) की गणना करें । इंडेंट प्रिंट करें, कोशिकाओं को प्रिंट करें ( .
यदि इनपुट पहले से ही समाप्त हो गया है) का उपयोग करके , एक लाइनफीड प्रिंट करें।
ध्यान दें कि केवल नो-ऑप्स हैं इसलिए वास्तविक कोड बाएं कोने में शुरू होता है ( $
, जो कि ऊपर कूदता है >
, इसलिए हम वास्तव,
में अंधेरे ग्रे पथ पर शुरू करते हैं )।
यहाँ प्रारंभिक मेमोरी ग्रिड है:
तो मेमोरी पॉइंटर उत्तर की ओर इशारा करते हुए, लेबल वाले इनपुट पर शुरू होता है । ,
एसटीडीआईएन से एक बाइट पढ़ता है या -1
अगर हमने ईओएफ को उस किनारे पर मारा है। इसलिए, इसके <
बाद का अधिकार सशर्त है कि क्या हमने सभी इनपुट पढ़े हैं। आइए अब हम इनपुट लूप में बने रहें। अगला कोड हम निष्पादित करते हैं
{&32'-
यह बढ़त लेबल में एक 32 लिखते हैं अंतरिक्ष , और फिर बढ़त लेबल में इनपुट मूल्य से यह घटा देती है diff । ध्यान दें कि यह कभी भी नकारात्मक नहीं हो सकता क्योंकि हम गारंटी देते हैं कि इनपुट में केवल मुद्रण योग्य ASCII शामिल है। यह शून्य होगा जब इनपुट एक स्थान था। (जैसा कि टिमवी बताते हैं, यह तब भी काम करेगा जब इनपुट में लाइनफीड या टैब शामिल हो सकते हैं, लेकिन यह 32 से कम वर्ण कोड वाले अन्य सभी वर्णों को भी <
हटा देगा ।) उस स्थिति में, निर्देश सूचक (IP) को विक्षेपित कर देता है और हल्के भूरे रंग का रास्ता लिया जाता है। वह रास्ता बस सांसद की स्थिति को रीसेट करता है {=
और फिर अगले चरित्र को पढ़ता है - इस प्रकार, रिक्त स्थान छोड़ दिए जाते हैं। अन्यथा, यदि चरित्र एक स्थान नहीं था, तो हम निष्पादित करते हैं
=}}})&'+'+)=}
के माध्यम से षट्भुज के आसपास यह पहली चाल लंबाई बढ़त इसके विपरीत जब तक diff बढ़त के साथ =}}}
। तो फिर यह प्रतियां विपरीत से मूल्य लंबाई में बढ़त लंबाई के साथ धार, और यह वेतन वृद्धि )&'+'+)
। हम एक दूसरे में देखेंगे कि यह क्यों समझ में आता है। अंत में, हम एक नया किनारा लेकर चलते हैं =}
:
(विशेष बढ़त मूल्य चुनौती में दिए गए अंतिम परीक्षण मामले से हैं।) इस बिंदु पर, लूप दोहराता है, लेकिन सब कुछ एक षट्भुज उत्तर-पूर्व में स्थानांतरित हो गया। इसलिए एक और चरित्र को पढ़ने के बाद, हमें यह मिलता है:
अब आप देख सकते हैं कि हम उत्तर-पूर्व विकर्ण के साथ धीरे-धीरे इनपुट (माइनस स्पेस) लिख रहे हैं, हर दूसरे किनारे पर वर्णों के साथ, और उस वर्ण तक की लंबाई को लेबल की गई लंबाई के समानांतर संग्रहीत किया जा रहा है ।
जब हम इनपुट लूप के साथ होते हैं, तो मेमोरी इस तरह दिखाई देगी (जहां मैंने पहले भाग के लिए कुछ नए किनारों को लेबल किया है):
%
अंतिम वर्ण हम पढ़ है, 29
हम पढ़ गैर अंतरिक्ष वर्णों की संख्या है। अब हम षट्भुज की भुजा-लम्बाई ज्ञात करना चाहते हैं। सबसे पहले, गहरे हरे / ग्रे पथ में कुछ रैखिक प्रारंभिक कोड है:
=&''3{
इधर, =&
धार लेबल में प्रतियां लंबाई (29 हमारे उदाहरण में) लंबाई । फिर 3''3
लेबल वाले किनारे पर जाता है और इसके मूल्य को निर्धारित करता है (जिसे हमें गणना में एक निरंतर के रूप में आवश्यकता होती है)। अंत में N (N-1) लेबल वाले किनारे पर जाता है ।3
{
अब हम नीले लूप में प्रवेश करते हैं। यह लूप वेतन वृद्धि N
( एन लेबल वाले सेल में संग्रहीत ) फिर अपने केंद्रित हेक्सागोनल संख्या की गणना करता है और इसे इनपुट लंबाई से घटाता है। रैखिक कोड जो ऐसा करता है:
{)')&({=*'*)'-
यहाँ, एन{)
को बढ़ता है और बढ़ता है । N-1')&(
लेबल वाले किनारे पर जाता है , वहां प्रतियां और इसे घटाता है। N (N-1) में उनके उत्पाद की गणना करता है । कई गुणा जो निरंतर और वृद्धि के परिणामस्वरूप बढ़त को हेक्स (एन) में लेबल करता है । जैसी कि उम्मीद थी, यह Nth केंद्रित षट्कोणीय संख्या है। अंत में उस और इनपुट लंबाई के बीच अंतर की गणना करता है। यदि परिणाम सकारात्मक है, तो पक्ष-लंबाई अभी तक बड़ी नहीं है, और लूप दोहराता है (जहां एमपी को किनारे पर एन (एन -1) लेबल करें )।N
{=*
'*)
3
'-
}}
एक बार जब पक्ष-लंबाई काफी बड़ी हो जाती है, तो अंतर शून्य या नकारात्मक होगा और हम इसे प्राप्त करते हैं:
सबसे पहले, अब वास्तव में लंबा रैखिक हरा रास्ता है जो आउटपुट लूप के लिए कुछ आवश्यक आरंभ करता है:
{=&}}}32'"2'=&'*){=&')&}}
{=&
में परिणाम को कॉपी करके शुरू होता है diff में बढ़त लंबाई धार, क्योंकि हम बाद में कुछ गैर सकारात्मक वहाँ की जरूरत है। }}}32
बढ़त लेबल में एक 32 लिखते हैं अंतरिक्ष । '"2
ऊपर लेबल नहीं किया गया किनारे में एक निरंतर 2 लिखते diff । एक ही लेबल के साथ दूसरे किनारे में '=&
प्रतियां N-1
। '*)
इसे 2 से गुणा करें और इसे बढ़ाएं ताकि हमें शीर्ष पर 2N-1 लेबल वाले किनारे में सही मूल्य मिल सके । यह षट्कोण का व्यास है। 2N-1{=&')&
लेबल वाले दूसरे किनारे में व्यास को कॉपी करता है । अंत में शीर्ष पर 2N-1 लेबल वाले किनारे पर वापस जाता है ।}}
आइए किनारों को फिर से लगाएँ:
वर्तमान में हम जिस किनारे पर हैं (जो अभी भी षट्भुज का व्यास रखता है) का उपयोग आउटपुट की तर्ज पर पुनरावृति करने के लिए किया जाएगा। वर्तमान रेखा पर कितने रिक्त स्थान हैं, यह इंडेंट लेबल वाला किनारा गणना करेगा। वर्तमान पंक्ति में कोशिकाओं की संख्या पर पुनरावृति करने के लिए किनारे लेबल वाली कोशिकाओं का उपयोग किया जाएगा।
अब हम गुलाबी पथ पर हैं जो इंडेंट की गणना करता है । ('-
decrements लाइनों इटरेटर और से यह घटा देती है N-1 (में मांगपत्र धार)। कोड में छोटी नीली / ग्रे शाखा केवल परिणाम के मापांक की गणना करती है ( ~
यदि यह ऋणात्मक या शून्य है तो मान को घटाता है, और सकारात्मक होने पर कुछ भी नहीं होता है)। गुलाबी पथ के शेष भाग को इंडेंट को व्यास से कोशिकाओं के किनारे में "-~{
घटाया जाता है और फिर इंडेंट किनारे पर वापस ले जाता है ।
गंदा पीला रास्ता अब इंडेंटेशन को प्रिंट करता है। लूप सामग्री वास्तव में सिर्फ हैं
'";{}(
कहाँ '"
करने के लिए ले जाता है अंतरिक्ष में बढ़त, ;
यह प्रिंट, {}
ले जाता है वापस करने के लिए इंडेंट और (
यह decrements।
जब हम उस (दूसरे) गहरे भूरे रंग के रास्ते को खोजते हैं, तो अगले वर्ण को प्रिंट करने के लिए खोजता है। =}
स्थिति में ले जाता है (जिसका अर्थ है, पर कोशिकाओं बढ़त, दक्षिण इशारा करते हुए)। तब हमारे पास एक बहुत कड़ा लूप होता है, {}
जो बस दो किनारों को दक्षिण-पश्चिम दिशा में नीचे ले जाता है, जब तक कि हम संग्रहीत स्ट्रिंग के अंत को हिट नहीं करते हैं:
ध्यान दें कि मैंने EOF को एक किनारे पर स्थानांतरित कर दिया है ? । एक बार जब हम इस चरित्र को संसाधित कर लेते हैं, तो हम उस किनारे को नकारात्मक बना देंगे, ताकि {}
अगली यात्रा के बजाय लूप यहां समाप्त हो जाए :
कोड में, हम अंधेरे ग्रे पथ के अंत में हैं, जहां '
इनपुट चरित्र पर एक कदम पीछे जाता है। यदि स्थिति पिछले दो आरेखों में से एक है (यानी इनपुट में अभी भी एक चरित्र है जिसे हमने अभी तक नहीं छापा है), तो हम हरे रंग की राह ले रहे हैं (नीचे वाला, उन लोगों के लिए जो हरे रंग के साथ अच्छे नहीं हैं और नीला)। यह एक काफी सरल है: ;
चरित्र को ही प्रिंट करता है। '
इसी स्थान के किनारे पर ले जाता है जो अभी भी पहले से एक 32 रखता है और ;
उस स्थान को प्रिंट करता है। फिर {~
हमारा ईओएफ बनाता है ? अगले पुनरावृत्ति के लिए नकारात्मक, '
एक कदम पीछे जाता है ताकि हम एक और तंग }{
लूप के साथ स्ट्रिंग के उत्तर-पश्चिम छोर पर लौट सकें । जो लंबाई पर समाप्त होता हैसेल ( हेक्स (एन) के नीचे एक गैर-सकारात्मक ) अंत }
में कोशिकाओं के किनारे पर वापस चला जाता है ।
यदि हमने पहले ही इनपुट समाप्त कर दिया है, तो लूप जो ईओएफ खोजता है? वास्तव में यहाँ समाप्त होगा:
उस मामले '
में लंबाई सेल पर चलती है , और हम इसके बजाय हल्के नीले (शीर्ष) पथ ले रहे हैं, जो एक नो-ऑप प्रिंट करता है। इस शाखा का कोड रैखिक है:
{*46;{{;{{=
{*46;
राईट धार में एक 46 लेबल कोई को-अप और यह (यानी अवधि) प्रिंट करता है। फिर {{;
करने के लिए ले जाता है अंतरिक्ष में बढ़त और कहा कि प्रिंट करता है। {{=
करने के लिए ले जाता है वापस कोशिकाओं अगले चरण के लिए किनारे।
इस बिंदु पर पथ एक साथ वापस आते हैं और कोशिकाओं के किनारे को (
घटाते हैं । यदि इट्रेटर अभी तक शून्य नहीं है, तो हम हल्के भूरे रंग का रास्ता अपनाएंगे, जो बस सांसद की दिशा को उलट देता है और फिर प्रिंट करने के लिए अगले वर्ण की तलाश करता है।=
अन्यथा, हम वर्तमान रेखा के अंत तक पहुंच गए हैं, और आईपी इसके बजाय बैंगनी मार्ग ले जाएगा। यह मेमोरी ग्रिड उस बिंदु पर कैसा दिखता है:
बैंगनी पथ में यह शामिल है:
=M8;~'"=
=
फिर सांसद की दिशा उलट। M8
इसके मान को सेट करता है 778
(क्योंकि चरित्र कोड M
है 77
और अंक वर्तमान मूल्य के लिए खुद को जोड़ देंगे)। ऐसा होता है 10 (mod 256)
, इसलिए जब हम इसे प्रिंट करते हैं ;
, तो हमें एक लाइनफीड मिलता है। फिर ~
किनारे को नकारात्मक बनाता है, लाइनों के किनारे पर '"
वापस जाता है और एक बार फिर एमपी को उलट देता है।=
अब अगर रेखा किनारे शून्य है, तो हम कर रहे हैं। आईपी (बहुत कम) लाल पथ लेगा, जहां @
कार्यक्रम को समाप्त करता है। अन्यथा, हम उस बैंगनी पथ पर जारी रहते हैं जो दूसरी पंक्ति को प्रिंट करने के लिए गुलाबी एक में वापस छोर देता है।
टिमवी के हेक्सागोनीकॉलर के साथ बनाया गया नियंत्रण प्रवाह आरेख । मेमोरी डायग्राम उनके एसोटेरिक आईडीई में दृश्य डिबगर के साथ बनाया गया है ।
abc`defg
वास्तव में pastebin.com/ZrdJmHiR