अंडरलोड, 196 बाइट्स
()()(<svg width="99" height="147">)S(<g transform="translate):S((33,33)">)S((3,0)rotate)*a(*a(~*)*~("><path d="M0h3" stroke="#"/>)~*a(*)**:(-90)a~^~(90)a~^)*::*:**:*^S(</g>)(:*)::*:**:*^S(</svg>)S
मुझे लगा कि इस चुनौती को कम-शक्ति वाले एसोलंग में आज़माना दिलचस्प हो सकता है; इतनी कम संख्या वाली भाषा के लिए अंडरलोड काफी अच्छी तरह से करता है।
आउटपुट बहुत भारी नेस्टेड टैग और कुछ गोल्फ शॉर्टकट के साथ एक एसवीजी फ़ाइल है। अब तक, मुझे ऐसा ब्राउज़र नहीं मिला है जो इसे प्रदर्शित कर सके (फ़ायरफ़ॉक्स इसे लोड करने की कोशिश में कई मिनटों तक लटका रहता है, और फ़ायरफ़ॉक्स और क्रोमियम दोनों एक खाली स्क्रीन देते हैं)। अधिकांश इमेज प्रोसेसिंग प्रोग्राम इसे या तो लोड नहीं कर सकते हैं (इसे किसी अन्य प्रारूप में बदलना मुश्किल है), लेकिन मैंने इसे छवि दर्शक आई गनोम (जो उबंटू पर डिफ़ॉल्ट इंस्टॉल का हिस्सा है) में लोड करने में कामयाब रहा। इसलिए मैंने छवि का एक स्क्रीनशॉट लिया ताकि आप इसे देख सकें (वास्तविक छवि में एक पारदर्शी पृष्ठभूमि है, लेकिन आप वास्तव में पारदर्शी स्क्रीनशॉट नहीं ले सकते हैं):
हमें छवि का आकार स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता है। छवि के लिए एक उपयुक्त अभिविन्यास चुनना, न्यूनतम कानूनी आकार में सब कुछ आरेखण करना, और चुनौती द्वारा निर्दिष्ट पुनरावृत्तियों की न्यूनतम संख्या करना, हमें एक छवि प्रदान करता है जो बस एक बाइट को बचाने के लिए 99 पिक्सेल चौड़े में फिट बैठता है। यह अच्छा है जब चीजें इस तरह से काम करती हैं।
छवि को चित्रित करने के लिए इस्तेमाल किया जाने वाला सामान्य एल्गोरिदम दो चर बनाए रखना है (अंडरलोड चर का नाम नहीं देता है, लेकिन मैंने उन्हें एक्स और वाई के रूप में सोचा था ), दोनों शुरू में खाली थे। फिर हम बार-बार ( x , y ) को बदल देते हैं ( x , बाएँ मुड़ते हैं और आगे बढ़ते हैं, y ) और ( x , दाएँ मुड़ते हैं और आगे बढ़ते हैं, y )। दस पुनरावृत्तियों के बाद, दोनों x और y एक नौ पुनरावृत्ति ड्रैगन वक्र रखते हैं।
कुछ माइक्रो-ऑप्टिमाइज़ेशन और अंडरलोड-विशिष्ट ट्रिक्स भी हैं। स्टैक के शीर्ष के साथ बहुत अधिक खिलवाड़ से बचने के लिए, प्रत्येक लूप पुनरावृत्ति, हम x और y को फ़ंक्शन में जोड़कर शुरू करते हैं "कंक्रीटिंग द्वारा बनाई गई स्ट्रिंग लौटाएं: x , एक टर्न इंस्ट्रक्शन, फ़ंक्शन तर्क, एक चाल- आगे का निर्देश, और y । " यह फ़ंक्शन केवल स्टैक पर एक स्थान में समा जाता है, तो हम यह नकल कर सकते हैं, से कॉल करने की -90
एक तर्क के रूप, डुप्लिकेट के तहत वापसी मान स्वैप, और से कॉल करने की 90
एक तर्क के रूप, के लिए नए मूल्यों की पकड़ पाने के लिए एक्स और वाईस्टैक के शीर्ष दो तत्वों (जो अब तक सबसे अधिक सुलभ हैं) से अधिक को छूने की आवश्यकता के बिना। यह फ़ंक्शन रनटाइम पर कोड-जनरेट किया गया है। जनरेटर स्वयं भी रन-टाइम पर कोड-जनरेट किया जाता है, ताकि <g transform="translate
छवि के मूल को सेट करने के लिए उपयोग किए जाने वाले स्ट्रिंग का पुन: उपयोग करने की अनुमति मिल सके । हम पहले सभी खुले टैग उत्पन्न करते हैं, और क्योंकि सभी नज़दीकी टैग बस हैं </g>
, हम 1024 नज़दीकी टैग को केवल स्ट्रिंग को दोहराकर, उन्हें खुले टैग से मिलान करने की चिंता किए बिना आउटपुट कर सकते हैं। (अंडरलोड में कुशलता से संख्या लिखना अपने आप में एक दिलचस्प समस्या है; (:*)::*:**:*
संभवतः 1024 लिखने का सबसे कुशल तरीका है, हालांकि, "2 की शक्ति (1 + 2 × 2) × 2" में अनुवाद करना)।
अंडरलोड में कोई ग्राफिक्स लाइब्रेरी नहीं है, इसलिए मैं एक निश्चित स्थिति में ड्राइंग लाइनों के संयोजन का उपयोग करके एसवीजी का उत्पादन करता हूं, और किसी दिए गए बिंदु के चारों ओर छवि को घुमाता हूं; कलम को मोड़ने के बजाय हम कागज को मोड़ देते हैं। विचार यह है कि एक रेखा खींचकर, पूरी छवि को घुमाना, दूसरी रेखा खींचना, चित्र को फिर से घुमाना आदि, हम किसी भी अंकगणित को करने या किसी भी ग्राफिक्स पुस्तकालयों का उपयोग किए बिना प्रभावी ढंग से कछुए ग्राफिक्स का अनुकरण कर सकते हैं, क्योंकि सभी रेखाएँ खींची गई हैं। उसी स्थान पर। बेशक, इसका मतलब है कि हमारे पास कुछ बहुत ही नेस्टेड रोटेट-द-इमेज टैग हैं, जो कई एसवीजी दर्शकों को भ्रमित करते हैं।
छवि को स्टाइल करना बाइट काउंट के खिलाफ गिना जाएगा, इसलिए मुझे छवि प्रदर्शित करने के लिए आवश्यक न्यूनतम स्टाइल देने की आवश्यकता थी। यह पता चला है stroke="#"
, जो "कम से कम कुछ रंग की आवश्यकता है" के रूप में अधिक या कम अनुवाद करता है; यह इसे काले रंग में चित्रित करने के लिए विस्तारित किया जा रहा है। (सामान्य रूप से आप रंग निर्दिष्ट करेंगे, जैसे कि, "# 000"।) पृष्ठभूमि डिफ़ॉल्ट रूप से पारदर्शी है। हम एक स्ट्रोक की चौड़ाई निर्दिष्ट नहीं करते हैं, लेकिन आँख से सूक्ति द्वारा चुना गया विकल्प सब कुछ दिखाई देता है।
कई अंडरलोड दुभाषिए इस कार्यक्रम के साथ संघर्ष करते हैं, उदाहरण के लिए यह ऑनलाइन प्रयास पर क्रैश हो जाता है, क्योंकि यह आंतरिक रूप से कुछ बहुत बड़े तार उत्पन्न करता है। मूल ऑनलाइन अंडरलोड दुभाषिया काम करता है, हालांकि। (दिलचस्प बात यह है कि बहुत पहले दुभाषिया ऑनलाइन था, इसलिए यह भाषा ऑनलाइन प्रयोग करने योग्य होने से पहले ऑफ़लाइन थी)।
कुछ ऐसा है जिसके बारे में मुझे थोड़ी बेचैनी है कि यहाँ केवल 1023 लाइन सेगमेंट ही प्रतीत होते हैं, और हम 1024 की उम्मीद करेंगे। ऐसा हो सकता है कि अंत में से एक सेगमेंट को इस एल्गोरिथ्म के साथ तैयार नहीं किया जा रहा है (यह होगा) इसके बजाय अगले पुनरावृत्ति पर तैयार)। यदि यह अयोग्य है, तो कार्यक्रम को अनुकूलित करना संभव हो सकता है, लेकिन यह अच्छी तरह से लंबे समय तक समाप्त हो सकता है। (ऐसा नहीं है कि यह चुनौती वैसे भी प्रतियोगिता जीतने वाली है; पहले से ही कई छोटी प्रविष्टियाँ हैं।)