हेक्सागोनी , 920 722 271 बाइट्स
छह अलग-अलग प्रकार के फल लूप, आप कहते हैं? यही हेक्सागोनी केलिए बनाया गया था।
){r''o{{y\p''b{{g''<.{</"&~"&~"&<_.>/{.\.....~..&.>}<.._...=.>\<=..}.|>'%<}|\.._\..>....\.}.><.|\{{*<.>,<.>/.\}/.>...\'/../==.|....|./".<_>){{<\....._>\'=.|.....>{>)<._\....<..\..=.._/}\~><.|.....>e''\.<.}\{{\|./<../e;*\.@=_.~><.>{}<><;.(~.__..>\._..>'"n{{<>{<...="<.>../
ठीक है, यह नहीं था। हे भगवान, मैंने अपने आप को क्या किया ...
यह कोड अब साइड 10 लंबाई का षट्भुज है (यह 19 में शुरू हुआ)। यह संभवत: 9 और आकार का हो सकता है, शायद 9 के आकार का भी हो, लेकिन मुझे लगता है कि मेरा काम यहां हो गया है ... संदर्भ के लिए, स्रोत में 175 वास्तविक कमांड हैं, जिनमें से कई संभावित अनावश्यक दर्पण हैं (या रद्द करने के लिए जोड़े गए थे) एक पार पथ से एक कमांड)।
स्पष्ट रैखिकता के बावजूद, कोड वास्तव में दो-आयामी है: हेक्सागोनी इसे एक नियमित षट्भुज में बदल देगा (जो कि वैध कोड भी है, लेकिन सभी व्हाट्सएप हेक्सागोनी में वैकल्पिक है)। यहाँ इसके सभी में अनकहा कोड है ... अच्छी तरह से मैं "सौंदर्य" नहीं कहना चाहता:
) { r ' ' o { { y \
p ' ' b { { g ' ' < .
{ < / " & ~ " & ~ " & <
_ . > / { . \ . . . . . ~
. . & . > } < . . _ . . . =
. > \ < = . . } . | > ' % < }
| \ . . _ \ . . > . . . . \ . }
. > < . | \ { { * < . > , < . > /
. \ } / . > . . . \ ' / . . / = = .
| . . . . | . / " . < _ > ) { { < \ .
. . . . _ > \ ' = . | . . . . . > {
> ) < . _ \ . . . . < . . \ . . =
. . _ / } \ ~ > < . | . . . . .
> e ' ' \ . < . } \ { { \ | .
/ < . . / e ; * \ . @ = _ .
~ > < . > { } < > < ; . (
~ . _ _ . . > \ . _ . .
> ' " n { { < > { < .
. . = " < . > . . /
व्याख्या
मैं भी कोशिश नहीं करूँगा और इस गोल्फ संस्करण में सभी जटिल निष्पादन मार्गों की व्याख्या करना शुरू कर दूंगा, लेकिन एल्गोरिथ्म और समग्र नियंत्रण प्रवाह इस असम्बद्ध संस्करण के समान है जो कि मैंने एल्गोरिथ्म के समझाने के बाद वास्तव में जिज्ञासु के लिए अध्ययन करना आसान हो सकता है:
) { r ' ' o { { \ / ' ' p { . . .
. . . . . . . . y . b . . . . . . .
. . . . . . . . ' . . { . . . . . . .
. . . . . . . . \ ' g { / . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . > . . . . < . . . . . . . . .
. . . . . . . . . . . . . . > . . ) < . . . . .
. . . . . . . . . . / = { { < . . . . ( . . . . .
. . . . . . . . . . . ; . . . > . . . . . . . . . <
. . . . . . . . . . . . > < . / e ; * \ . . . . . . .
. . . . . . . . . . . . @ . } . > { } < . . | . . . . .
. . . . . / } \ . . . . . . . > < . . . > { < . . . . . .
. . . . . . > < . . . . . . . . . . . . . . . | . . . . . .
. . . . . . . . _ . . > . . \ \ " ' / . . . . . . . . . . . .
. . . . . . \ { { \ . . . > < . . > . . . . \ . . . . . . . . .
. < . . . . . . . * . . . { . > { } n = { { < . . . / { . \ . . |
. > { { ) < . . ' . . . { . \ ' < . . . . . _ . . . > } < . . .
| . . . . > , < . . . e . . . . . . . . . . . . . = . . } . .
. . . . . . . > ' % < . . . . . . . . . . . . . & . . . | .
. . . . _ . . } . . > } } = ~ & " ~ & " ~ & " < . . . . .
. . . \ . . < . . . . . . . . . . . . . . . . } . . . .
. \ . . . . . . . . . . . . . . . . . . . . . . . < .
. . . . | . . . . . . . . . . . . . . . . . . = . .
. . . . . . \ . . . . . . . . . . . . . . . . / .
. . . . . . > . . . . . . . . . . . . . . . . <
. . . . . . . . . . . . . . . . . . . . . . .
_ . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
ईमानदारी से, पहले पैराग्राफ में मैं केवल आधा मजाक कर रहा था। तथ्य यह है कि हम छह तत्वों के एक चक्र के साथ काम कर रहे हैं वास्तव में एक बड़ी मदद थी। हेक्सागोनी का मेमोरी मॉडल एक अनंत हेक्सागोनल ग्रिड है जहां ग्रिड के प्रत्येक किनारे में एक हस्ताक्षरित मनमाना-सटीक पूर्णांक होता है, जिसे शून्य से आरंभ किया जाता है।
यहाँ इस कार्यक्रम में उपयोग की गई मेमोरी के लेआउट का एक चित्र दिया गया है:
बाईं ओर के लंबे सीधे बिट का उपयोग a
मनमाने आकार के 0-टर्मिनेटेड स्ट्रिंग के रूप में किया जाता है जो अक्षर r से जुड़ा होता है । अन्य अक्षरों पर धराशायी लाइनें एक ही तरह की संरचना का प्रतिनिधित्व करती हैं, प्रत्येक को 60 डिग्री से घुमाया जाता है। प्रारंभ में, मेमोरी पॉइंटर 1 पर स्थित किनारे पर इंगित करता है , उत्तर की ओर।
कोड का पहला, रैखिक बिट किनारों के आंतरिक "स्टार" को अक्षरों के roygbp
साथ-साथ प्रारंभिक किनारे पर सेट करता है 1
, जैसे कि हम जानते हैं कि चक्र कहां समाप्त होता है / शुरू होता है (बीच p
और r
):
){r''o{{y''g{{b''p{
इसके बाद, हम 1 लेबल वाले किनारे पर वापस आ गए हैं ।
अब एल्गोरिथ्म का सामान्य विचार यह है:
- चक्र में प्रत्येक अक्षर के लिए, एसटीडीआईएन से पत्र पढ़ते रहें और, यदि वे वर्तमान पत्र से अलग हैं, तो उन्हें उस पत्र से जुड़े स्ट्रिंग में जोड़ दें।
- जब हम उस पत्र को पढ़ते हैं जिसे हम वर्तमान में देख रहे हैं, तो हम
e
लेबल वाले किनारे में संग्रहीत करते हैं ? , क्योंकि जब तक यह चक्र पूरा नहीं होता है, हमें यह मानना होगा कि हमें इस चरित्र को भी खाना होगा। बाद में, हम चक्र में अगले वर्ण के लिए रिंग के चारों ओर घूमेंगे।
- इस प्रक्रिया को बाधित करने के दो तरीके हैं:
- या तो हमने चक्र पूरा कर लिया है। इस मामले में, हम चक्र के माध्यम से एक और त्वरित दौर बनाते हैं, जो उन सभी को बदल रहा
e
है ? किनारों के साथ n
, क्योंकि अब हम चाहते हैं कि यह चक्र हार पर बना रहे। फिर हम प्रिंटिंग कोड की ओर बढ़ते हैं।
- या हमने ईओएफ को मारा (जिसे हम एक नकारात्मक चरित्र कोड के रूप में पहचानते हैं)। इस मामले में, हम एक नकारात्मक मान लिखते हैं ? वर्तमान चरित्र का किनारा (ताकि हम इसे आसानी से दोनों से अलग कर सकें
e
और n
)। फिर हम मुद्रण कोड पर जाने से पहले 1 किनारे (संभावित अपूर्ण चक्र के शेष को छोड़ना) के लिए खोज करते हैं ।
- मुद्रण कोड फिर से चक्र से गुजरता है: चक्र में प्रत्येक वर्ण के लिए यह
e
प्रत्येक वर्ण के लिए मुद्रण करते समय संग्रहीत स्ट्रिंग को साफ करता है । फिर यह करने के लिए चलता है ? चरित्र के साथ जुड़ा हुआ किनारा। यदि यह नकारात्मक है, तो हम बस कार्यक्रम को समाप्त कर देते हैं। यदि यह सकारात्मक है, तो हम इसे प्रिंट करते हैं और अगले चरित्र पर जाते हैं। एक बार जब हम चक्र पूरा कर लेते हैं तो हम चरण 2 पर वापस जाते हैं।
एक और बात जो दिलचस्प हो सकती है, वह यह है कि मैंने मनमाने आकार के तारों को कैसे लागू किया है (क्योंकि यह पहली बार मैंने हेक्सागोनी में अनबाउंड मेमोरी का उपयोग किया है)।
कल्पना कीजिए कि हम कुछ बिंदु जहां हम अभी भी के लिए पात्रों पढ़ रहे हैं पर हैं आर (ताकि हम आरेख का उपयोग कर सकते है के रूप में) और एक [0] और एक 1 पहले से ही अक्षर के साथ भर दिया गया है (उनमें से सब कुछ उत्तर पश्चिम अभी भी शून्य है )। उदाहरण के लिए, शायद हमने og
इनपुट के पहले दो पात्रों को उन किनारों में पढ़ा है और अब पढ़ रहे हैं y
।
नए चरित्र को किनारे में पढ़ा जाता है । हम का उपयोग करें ? यह जाँचने के लिए कि क्या यह पात्र समान है r
। (यहां एक निफ्टी चाल है: हेक्सागोनी केवल सकारात्मक और गैर-सकारात्मक के बीच आसानी से अंतर कर सकती है, इसलिए घटाव के माध्यम से समानता की जांच करना कष्टप्रद है और इसके लिए कम से कम दो शाखाओं की आवश्यकता होती है। लेकिन सभी अक्षर एक दूसरे से 2 के कारक से कम हैं, इसलिए। हम मोडुलो को लेते हुए मूल्यों की तुलना कर सकते हैं, जो केवल शून्य देगा यदि वे समान हैं।)
क्योंकि y
से अलग है r
, हम (लेबल नहीं किया गया) बढ़त के बायीं तरफ चली में और कॉपी y
वहाँ। अब हम षट्भुज चारों ओर आगे ले जाते हैं, आगे हर बार चरित्र एक किनारे को कॉपी, जब तक हमारे पास y
के किनारे विपरीत पर में । लेकिन अब पहले से ही एक चरित्र है [0] जिसे हम अधिलेखित नहीं करना चाहते हैं। इसके बजाय, हम y
अगले षट्भुज के चारों ओर "खींचें" और एक 1 की जांच करें । लेकिन वहाँ एक चरित्र के रूप में अच्छी तरह से है, इसलिए हम आगे एक और षट्भुज चलते हैं। अब एक [2] अभी भी शून्य है, इसलिए हम इसकी नकल करते हैंy
इसे में। मेमोरी पॉइंटर अब स्ट्रिंग के साथ-साथ इनर रिंग की ओर बढ़ता है। हम जानते हैं कि जब हम स्ट्रिंग की शुरुआत में पहुंच गए हैं, क्योंकि [(i) [a] के बीच (अनलेबल्ड) किनारों सभी शून्य हैं ? सकारात्मक है।
यह संभवतः हेक्सागोनी में सामान्य रूप से गैर-तुच्छ कोड लिखने के लिए एक उपयोगी तकनीक होगी।