7 , एन्कोडिंग में 7 , 410 वर्ण, 154 बाइट्स, 0 अक्षर = स्कोर 154
55104010504200144434451510201304004220120504005434473340353241135014335450302052254241052253052244241052335452241114014241310052340435303052335442302052335500302052335430302052313340435303135014243241310335514052312241341351052302245341351525755102440304030434030421030442030424030455733413512410523142410523030523112411350143355142410523414252410523102410523002410523413342411145257551220304010420030455741403
इसे ऑनलाइन आज़माएं!
एक चुनौती में जो अक्षरों का उपयोग करना नापसंद करता है, केवल एक अंक से मिलकर किस भाषा का उपयोग करना बेहतर है?
यह एक पूर्ण कार्यक्रम है जो दुर्घटनाग्रस्त होने से बाहर निकलता है, इसलिए स्टडर के लिए बाहरी उत्पादन होता है, लेकिन स्टडआउट सही है।
व्याख्या
एक 7 कार्यक्रम, अपने पहले पुनरावृत्ति पर, बस ढेर सारे तत्वों को स्टैक में धकेलता है (क्योंकि 12 में से 12 कमांड जो 7 में मौजूद हैं, उनमें से केवल 8 को एक सोर्स प्रोग्राम में दर्शाया जा सकता है, और वे 8 कोड लिखने के लिए विशेष हैं। स्टैक के लिए विशेष डेटा संरचनाओं को पुश करने के लिए)। यह प्रोग्राम 6
कमांड का उपयोग नहीं करता है (जो नेस्टेड संरचनाओं को बनाने का सबसे सरल तरीका है, लेकिन अन्यथा स्रोत प्रोग्राम में शाब्दिक रूप से प्रकट नहीं होता है), इसलिए यह केवल 7
कमांड है जो संरचना का निर्धारण करता है; 7
स्टैक के शीर्ष पर एक नया खाली तत्व धकेलता है (जबकि 0
... 5
कमांड केवल स्टैक के शीर्ष पर संलग्न होता है)। इस प्रकार हम इसकी संरचना दिखाने के लिए कार्यक्रम में व्हॉट्सएप जोड़ सकते हैं:
551040105042001444344515102013040042201205040054344 7
33403532411350143354503020522542410522530522442410523354522411140142413100523
40435303052335442302052335500302052335430302052313340435303135014243241310335
514052312241341351052302302245341351525 7
5510244030403043403042423030442030424030455 7
33413512410523142410523030523112411350143355142410523414252410523102410523002
41052341334241114525 7
551220304010420030455 7
41,403
कार्यक्रम के अंत के पास वाले तत्व अंतिम रूप से धकेल दिए जाते हैं, इसलिए दूसरी पुनरावृत्ति की शुरुआत में स्टैक के शीर्ष पर होते हैं। इस पुनरावृत्ति, और भविष्य के सभी पुनरावृत्तियों पर, 7 दुभाषिया स्वचालित रूप से ढेर के शीर्ष की एक प्रति बनाता है और इसे एक कार्यक्रम के रूप में व्याख्या करता है। शाब्दिक 41403
(गैर-शाब्दिक, लाइव कोड) को धक्का देता है ( 47463
7 में 12 कमांड हैं लेकिन उनमें से केवल 8 में ही पहुंच है, जैसे, मैं कोड दिखाने के लिए बोल्ड का उपयोग करता हूं, और उस कोड को उत्पन्न करने वाले शाब्दिक को दिखाने के लिए गैर-बोल्ड, अर्थ वह, उदाहरण 4
के लिए कमांड है जो 4
शीर्ष स्टैक तत्व को जोड़ता है)। तो दूसरा पुनरावृत्ति पर चलने वाला कार्यक्रम है 47463
। यहाँ है कि क्या करता है:
47463
4 शीर्ष दो स्टैक तत्वों को जोड़ें, 7 के बीच में एक खाली तत्व
जोड़ें। स्टैक के शीर्ष पर एक खाली स्टैक तत्व जोड़ें
4 शीर्ष दो स्टैक तत्वों को जोड़ें, 6 के बीच में एक खाली तत्व जोड़ें,
जो शीर्ष स्टैक तत्व उत्पन्न करेगा कमांड का कार्य करें;
नीचे तत्व में जोड़ें (और स्टैक के पुराने शीर्ष को पॉप करें)
3 शीर्ष स्टैक तत्व को आउटपुट करें, नीचे दिए गए तत्व को पॉप करें
यह समझना आसान है कि क्या हम स्टैक के साथ देखते हैं:
- ... घ c ख एक
47463
(चलाने के लिए कोड: 47463
)
- ... घ ग ख खाली एक (चलाने के लिए कोड: )
47463
7463
- ... घ ग ख खाली एक खाली (चलाने के लिए कोड: )
47463
463
- ... घ ग ख खाली खाली खाली एक (कोड को चलाने के लिए: )
47463
63
- ... घ ग ख खाली खाली " एक " (कोड को चलाने के लिए: )
47463
3
- … D c b खाली (चलाने के लिए कोड: खाली )
47463
दूसरे शब्दों में, हम स्टैक ए के शीर्ष पर ले जाते हैं , यह पता लगाने के लिए कि किस कोड ने सबसे अधिक उत्पादन किया है, और उस कोड को आउटपुट करता है। 7 दुभाषिया स्वचालित रूप से एक पुनरावृत्ति के अंत में स्टैक के शीर्ष से खाली तत्वों को पॉप करता है, इसलिए हम 47463
स्टैक के शीर्ष पर पीठ के साथ समाप्त होते हैं , जैसे कि मूल कार्यक्रम में। यह देखना आसान होना चाहिए कि आगे क्या होता है: हम हर स्टैक तत्व के माध्यम से एक के बाद एक मंथन करते हैं, उन सभी को आउटपुट करते हैं, जब तक कि स्टैक अंडरफ्लो न हो जाए और प्रोग्राम क्रैश हो जाए। तो हमने मूल रूप से एक साधारण आउटपुट लूप बनाया है जो प्रोग्राम के सोर्स कोड को यह निर्धारित करने के लिए देखता है कि आउटपुट क्या है (हम डेटा स्ट्रक्चर्स को आउटपुट नहीं कर रहे हैं जो हमारे द्वारा स्टैक को पुश किए गए थे 0
...5
कमांड, हम इसके बजाय यह बता रहे हैं कि कौन सी संरचनाएं बनाई गई थीं, और जो आउटपुट दे रही हैं, उन्हें देखकर क्या कमांड का उपयोग किया गया था। इस प्रकार, डेटा आउटपुट का पहला टुकड़ा है 551220304010420030455
(स्रोत कोड जो दूसरे-से-शीर्ष स्टैक तत्व को उत्पन्न करता है), दूसरा है 3341351…114525
(स्रोत कोड जो तीसरे से-टॉप स्टैक तत्व उत्पन्न करता है), और इसी तरह।
जाहिर है, हालांकि, स्रोत कोड के इन टुकड़ों का उत्पादन अनएन्कोडेड नहीं किया जा रहा है। 7 में एन्कोडिंग आउटपुट के लिए कई अलग-अलग डोमेन-विशिष्ट भाषाएं हैं; एक बार एक डोमेन-विशिष्ट भाषा चुने जाने के बाद, यह स्पष्ट रूप से साफ़ होने तक उपयोग में रहता है, लेकिन यदि कोई भी भाषा अभी तक चुनी नहीं गई है, तो कोड का पहला अंक आउटपुट होना यह निर्धारित करता है कि कौन सी भाषा का उपयोग करना है। इस कार्यक्रम में, केवल दो भाषाओं का उपयोग किया जाता है: 551
और 3
।
551
यह बहुत सरल है: यह मूल रूप से पुराने Baudot / teletype कोड है, जिसका उपयोग 5-बिट कैरेक्टर सेट के रूप में teletypes पर अक्षरों को प्रसारित करने के लिए किया जाता है, लेकिन सभी अक्षरों को कम करने के लिए संशोधित किया जाता है। तो कोड का पहला हिस्सा इस तरह से आउटपुट डीकोड होना चाहिए:
551 22 03 04 01 04 20 03 04 55
c a SP e SP n a SP reset output format
जैसा कि देखा जा सकता है, हम प्रत्येक चरित्र को दो अष्टक अंकों में फिट कर रहे हैं, जो कि एक अच्छा सभ्य संपीड़न अनुपात है। 0-5 श्रेणी में अंकों के जोड़े हमें 36 संभावनाएं देते हैं, क्योंकि 32 संभावनाओं के विपरीत, जो बॉडोट की आवश्यकता है, इसलिए शेष चार का उपयोग विशेष आदेशों के लिए किया जाता है; इस मामले में, 55
अंत में याद किया आउटपुट प्रारूप को साफ करता है, जिससे हम अपने द्वारा उत्पादित उत्पादन के अगले टुकड़े के लिए एक अलग प्रारूप का उपयोग करते हैं।
3
वैचारिक रूप से भी सरल है, लेकिन एक मोड़ के साथ। मूल विचार तीन अंकों के समूहों (फिर से, 0-5 श्रेणी में, जैसे कि वे अंक हैं, जिनके लिए हम गारंटी दे सकते हैं कि हम इसके स्रोत से मूल स्रोत कोड को फिर से बना सकते हैं), उन्हें तीन अंकों के रूप में व्याख्या कर सकते हैं। आधार 6 में संख्या, और बस इसे बाइनरी में बाइट के रूप में आउटपुट करें (इस प्रकार हमें मल्टीबाइट वर्णों को वांछित आउटपुट में बस एकाधिक बाइट्स आउटपुट करके देना चाहिए)। ट्विस्ट, हालांकि, इस तथ्य से आता है कि बेस 6 में केवल 216 तीन-अंकीय संख्या (संभावित अग्रणी शून्य के साथ) हैं, लेकिन 256 संभव बाइट्स हैं। 7 को 332 round = 128wards से दो अलग-अलग बाइट्स से संख्याओं को जोड़कर इसे गोल किया जाता है; 332
उत्पादन या तो बाइट 128 या 192, 333
या तो बाइट 129 या 193, और इसी तरह, 515
बाइट 191 या 255 या तो आउटपुट कर सकता है।
प्रोग्राम कैसे जानता है कि आउटपुट के लिए दोनों में से कौन सी संभावनाएं हैं? यह 520
स्पष्ट रूप से नियंत्रित करने के लिए ऊपर से अंकों के ट्रिपल का उपयोग करना संभव है , लेकिन इस कार्यक्रम में हमारे पास नहीं है: 7 का डिफ़ॉल्ट सभी अस्पष्ट बाइट्स को इस तरह से चुनना है कि आउटपुट UTF-8 मान्य है! यह पता चला है कि ऐसा करने के लिए हमेशा एक ही तरीके से होता है, इसलिए जब तक यह UTF-8 है, हम चाहते हैं (और हम इस मामले में करते हैं), हम इसे केवल अस्पष्ट छोड़ सकते हैं और कार्यक्रम वैसे भी काम करता है।
प्रत्येक 3…
अनुभाग का अंत है 525
, जो आउटपुट स्वरूप को रीसेट करता है, जिससे हमें 551
अगले अनुभाग के लिए वापस जाना है ।
a
- या नहीं, कितने पर निर्भर करता है यह अक्षर ले जाएगा, क्योंकि 20 अक्षर वास्तव में एक बड़ा दंड है (हालांकि जब बाइट्स द्वारा सब कुछ बनाया जाता है, तो यह बहुत अच्छी तरह से परिभाषित नहीं है ...)!