अपठनीय , 3183 3001 बाइट्स
यह क्रिसमस समारोह के बीच, चालू और बंद काम करने के लिए एक मजेदार चुनौती थी। प्रविष्टि के लिए धन्यवाद! यह दिलचस्प था क्योंकि विनिर्देश अपवादों और विशेष मामलों से भरा है, जिनके लिए बहुत सारी स्थितियों की आवश्यकता होती है। इस समय, जबकि मुझे इस समय दशमलव से और उससे अधिक रूपांतरण करने की आवश्यकता नहीं थी, मुझे प्रत्येक स्थान में अंकों की सबसे बड़ी संख्या और प्रत्येक स्थान के अंकों के सबसे बड़े मूल्य को निर्धारित करने के लिए "अधिकतम" फ़ंक्शन की आवश्यकता थी ।
इसका पहला संस्करण 4844 बाइट्स था, बस आपको यह अंदाजा लगाने के लिए कि मैंने इसे कितना गॉल्फ़ किया है।
कार्यक्रम इनपुट को पूर्णांक की अल्पविराम से अलग सूची के रूप में उम्मीद करता है । कोई रिक्त स्थान या newlines। उन का उपयोग अपरिभाषित व्यवहार का उत्पादन होगा।
' "" "" "" ""' "" ' ""' "" ' ""' "" " '" "" "" "" ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" "" "" ' ""' "" ' ""' "" ' ""' "" ' "" "'" " ' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" '"" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' ""' "" "" "" ' " "" "" "" "" "" ' ""' "" ' ""' "" ' ""' "" "" "" ' ""' "" " '" "'" " '" "' "" ' ""' "" ' ""' "" ' "" "'" "" "" ' "" "" ""' "" " '" "" "" "" "" "" """ "" "" ' "" "" "" "" "" "" "" "" "'" " '" "'" "" "" "" "" "" "" "" ' "" "" "" "" ""' "" "" "" ' ""' "" ' ""' "" " '" "" "" "" "" "" "" "' "" "" "" "" ' ""' "" " '" "" "" "" ""' "" ' ""' "" ' ""' "" ' "" "'""" "" "" "" "" "" "" ' "" "" ""' "" ' "" "'" " '" "" "" "" ""' "" " '" " ' "" "" "'" "" "" " '" "'" " '" ""' "" "" "" "" "" "" "" " '" "'" " '" "" ' "" "" "" ""' "" ' ""' "" " '" "" "" "" "" "" "" "" ""' "" ' ""' """ ' "" "" "" "" "" ""' "" " '" "" "" "" "" "" "" "" "" "'" "" "" "" "" ' "" "" "" "" "" "" ""' "" "" "" "" ' ""' "" " '" "" ""' "" "" "" " ' "" "" "" "" ""' "" "" "" "" " '" "" "" "" "" "" "" "" "" "'" """ "" "" "" " '" ""' "" ' "" "" "" "" ""' "" "" "" "" "" ' ""' "" ' "" ' "" "" "" "" "" "" ""' "" "" " '" "" "" "" "" "" "" "'" "" "" "" "" " '" "'" "" "" "" "" "" "" "" "" ' "" "" "" "" "'" "" "" "" "" """" "" " '" "" "" "" "" "'" "" "" "" "" "" "" " '" "" "" "" "" "'" "" ' "" "" "" "" "" "'" "" "" "" "" "" "" " '" "'" "" ' ""' "" ' ""' "" ' "" ' ""' "" ' ""' "" "" "" "" "" "" "" "" "" "" " '" "'" "" ' ""' """ "" "" ' ""' "" "" "" "" "" "" "" "" "" "" "" ' ""' "" ' ""' "" ' " " '" "'" " '" ""' "" "" "" "" ' ""' "" ' ""' "" " '" "" "" "" "" "" ""' "" ' "" "" "'" "" "" "" ' ""' "" "" "" ' "" "" "'" "" "" "" "" "" "" '" "'" "" ' "" "" "" "" "" "" "" "'" " '" "" "" "" "" "" "" "" "" "" " '" "" "" "" "" "" ""' "" ' ""' "" ' ""' "" ' ""' "" ' "" "'" "" "" "" " ' "" "" "" "" "'" " '" "'" " '" "'" " '" "'" "" ' "" "" "" "" "'" "" """ "" "" "" "" "" "" "" "" "" "" "" "" "" " '" "" "" "" ""' "" "" "" " '" "'" " '" "'" "" ' "" "" "" ""' "" ' ""' "" ' "" "'" ' "" "" "" "" "' "" ' "" "" "" "" "" "" ""' "" ' "" "" "" "" "" "" ""' "" ' "" "" """ ' "" "" "" "" "'" "" ' "" "" "" "" ""' "" "" "" " '" "'" "" "" "" " "" "" "" "" "" "" "" " '" "" "" "" "" "'" "" "" "" "" "" "" " '" "' "" "" "" "" "" "" "" "" " '" "" "" "" "" "" "" "'" " '" "'" "" """ "" "" "" "" ' ""' "" "" "" ' "" "" "" "" "" "'" " '" "" "" "" "" " "" "" "" ' "" "'" "" "" "" "" "" "" "" "" "" ' "" "" "" "" "" "" "" " ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" "" "" ' ""' "" "" "" "" ""' "" "" "" "" " '" "'" " '" "'" " '" "'" "" ' ""' "" ' " "" "" "" "" ' ""' "" ' ""' "" ' "" "'" "" "" "" "" "" "" "" "" " '" "" "" "" "" ' ""' "" ' ""' "" ' "" "'" "" "" "" "" "" "" "" "" "" "" "' ""' "" "" " '" "" "" "" "" "" ""' "" ' ""' "" " '" "" "" "" "" "" "" " " '" "'" " '" ""' "" "" "" "" "" "" " '" "'" "" "" "" "" "" "" "" "" " ' "" "" "" "" "'" "" ' "" "" "" "" "" "" "" "" "" "" "'" " '" "'"" '" "'" "" "" "" "" ' ""' "" " '" "" "" "" "" "" "" "'" "" "" "" "" " '" ""' "" "" "" "" "" " '" "" "" "" "" "" ""' "" ' "" "" "" "" "" "' "" "" "" "" "" "" "" ' ""' "" "" "" ' "" "" "'" "" "" "" "" "" ""' ""' "" ' "" "'" " '" "" "" "" ""' "" ' "" "'" "" "" "" "" "" "" "" " '" "" "" "'" "" "" "" ' ""' "" "" "" "" "" "" "" "" "" "" "" "" " '" " '" ""' "" "" "" "" "" "" ' ""' "" ' "" "'" "" "" "" "" "" "" "" ' "" '" "'" "" ' "" "" "" "" "" "" "" "" "" "" "'" " '" "'" "" ' ""' "" " "" "" "" ' ""' "" " '" "" "" "" "" "" "" ""' "" " '" "'" "" "" "" "" "" "" " '" "'" "" ' "" "" "" "" "'" " '" "" "" "" "" "'" "" "" "" """" "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""' "" ' ""' "" " ' "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' ""' "" " ' ""' "" "" "" "" " '" ""' "" "" "" "" " '" "'" " '" "'" "" ' "" "'""" "" "" "" "" "" "" "" " '" "'" " '" ""' " '" "" "" "" "" "" "" ""' " "" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '" "" "" "" "" "'" "" "" "" "" ' "" "" "" "" "'" " '" "'" "" ' "'"" ' ""' "" ' ""' "" ' ""' "" ' ""' "" ' "" "'" "" "" "" "" ' "" "" "" "' "" "" "" "" "" "" "" "" " '" "'" " '" "'" "" ' "" "" "'" "" "" "" "" " "" "" " '" "'" "" ' "" "" "" "" "" "" "" "" "'" " '" ""' "" "" "" '"" "" "" "" "" ' "" "" "" "" "" "" "" "" "" "" "" "" "'" ""
व्याख्या
मैं आपको दिखाने जा रहा हूं कि प्रोग्राम आपको कैसे दिखाता है कि यह विशिष्ट इनपुट को कैसे संसाधित करता है 202,100,1
।
शुरुआत में, हम कुछ मानों का निर्माण करते हैं जिनकी हमें बाद में आवश्यकता होगी - ज्यादातर ASCII वर्ण जो हम आउटपुट करेंगे।
जैसा कि आप देख सकते हैं, '8'
और '.'
पहले से ही उपलब्ध हैं। '|'
हालाँकि, यह वास्तव में 124 है, 14. नहीं। हम 124 पाने के लिए इस पर स्लॉट # 1 में दो बार अस्थायी मान जोड़ने के लिए थोड़ी देर के लूप का उपयोग करते हैं (जो कि 14 + 55 × 2 है, क्योंकि लूप 56−1 = 55 के लिए चलता है पुनरावृत्तियों)। यह कुछ बाइट्स बचाता है क्योंकि बड़े पूर्णांक शाब्दिक जैसे 124 वास्तव में लंबे होते हैं। निम्नलिखित चित्र में, मैं उस प्रोग्राम का उपयोग करने वाले प्रत्येक चर का स्थान दिखाता हूं।
अगला, हम सभी वर्णों को इनपुट करना चाहते हैं और सेल # 12 पर शुरू होने वाले टेप पर संग्रहीत करते हैं ( पी इसके लिए रनिंग पॉइंटर है)। साथ ही हम यह जानना चाहते हैं कि सबसे लंबी संख्या (कितने अंक) है। इसे प्राप्त करने के लिए, हम सेल # starting1 पर शुरू होने वाले लेयर में एक कुल रनिंग करते हैं (हम रनिंग पॉइंटर के रूप में q का उपयोग करते हैं )। पहले इनपुट नंबर ( 202
) के बाद, टेप अब इस तरह दिखता है:
आपने देखा होगा कि संख्याएँ 4 से बंद हैं। खैर, जब हम पहली बार उन्हें इनपुट करते हैं, तो वे उनके ASCII मान हैं, इसलिए वे 48 से "बंद" हैं और अल्पविराम 44 है। प्रत्येक चरित्र के लिए, हम 46 से कॉपी करते हैं '.'
में आर और फिर थोड़ी देर के पाश (जो 45 घटा देती है) के साथ यह घटाना और फिर हम 1. जोड़ने हम जानते हैं कि ताकि अल्पविराम (हमारे विभाजक) 0 है, इसलिए हम एक सशर्त उपयोग कर सकते हैं यह पहचान करने के लिए है।
इसके अलावा, आपने देखा होगा कि हम सेल # 11 को 0. पर छोड़ देते हैं। हमें पहले नंबर की सीमा को पहचानने की आवश्यकता है।
अगला चरित्र अल्पविराम होगा, इसलिए हम # 15 में 0 स्टोर करते हैं, लेकिन निश्चित रूप से इस बार हम q को अग्रिम नहीं करते हैं । इसके बजाय, हम q को 0 पर सेट करते हैं और 1s को "ओवरराइटिंग" शुरू करते हैं जो हमने पहले ही रखा है।
शेष सभी पात्रों को संसाधित करने के बाद, हमें यह मिलता है:
जैसा कि आप देख सकते हैं, q द्वारा लिखे गए 1s अब इंगित करते हैं ( एकात्मक में) सबसे लंबी संख्या की लंबाई।
अब हम कुछ समय के लिए q को स्थानांतरित करने के लिए थोड़ी देर के लूप का उपयोग करते हैं , और फिर वहां एक और पॉइंटर लगाते हैं जिसे मैं r2 कहूंगा । R2 का उद्देश्य बाद में स्पष्ट हो जाएगा।
इस बिंदु पर, मुझे उस शब्दावली को स्पष्ट करना चाहिए जो मैं इस पूरे उपयोग में लाऊंगा।
- तक नंबर , मैं इनपुट संख्या कि अल्पविराम के द्वारा अलग कर रहे हैं में से एक मतलब है। हमारे उदाहरण में, वे 202, 100 और 1 हैं।
- द्वारा अंकों , मैं नंबर की एक विशिष्ट एक में एक एकल अंक मतलब है। पहले नंबर पर 3 अंक होते हैं।
- द्वारा जगह , मैं इकाई के स्थान, दहाई के स्थान, सैकड़ों जगह, आदि तो इसका मतलब यह है कि अगर मैं कहते हैं कि "वर्तमान जगह में अंक", और वर्तमान जगह लोगों को जगह है, उन अंकों 2, 0 कि में हैं, और 1 आदेश।
अब वापस हमारे नियमित प्रोग्रामिंग पर जाएँ। कार्यक्रम का पूरा बाकी एक बड़ा लूप है जो q को आगे बढ़ाता है जब तक कि यह सेल # 0 तक नहीं पहुंच जाता। रास्ते में मौजूद प्रत्येक कोशिका एक स्थान का प्रतिनिधित्व करती है, जिसके सबसे दाईं ओर जगह होती है, और q सबसे महत्वपूर्ण स्थान पर शुरू होगा। हमारे उदाहरण में, वह सैकड़ों जगह है।
हम (यानी, * q ) पर सेल q अंक बढ़ाकर आगे बढ़ते हैं ।
अब हम "स्टेज 2" में सैकड़ों स्थान पर हैं। इस चरण में, हम यह पता लगाएंगे कि सैकड़ों अंकों में सबसे बड़ा अंक क्या है। हम इसके लिए एक ही यूनिरी काउंटिंग ट्रिक का उपयोग करते हैं, इस समय को छोड़कर पॉइंटर को r कहा जाता है और पॉइंटर r2 इसकी शुरुआती स्थिति को चिन्हित करता है जिसके लिए हमें हर बार अगले नंबर पर जाने के लिए इसे रीसेट करने की आवश्यकता होती है।
पहले नंबर से शुरू करते हैं। हम पी से 11 (सभी संख्याओं की हार्ड-कोडित शुरुआती स्थिति) की स्थापना करते हैं । फिर हम संख्या के अंत का पता लगाने के लिए थोड़ी देर के लूप का उपयोग करते हैं और वहां स्थिति को चिह्नित करने के लिए P2 सेट करते हैं। उसी समय, हमने q2 को 0 पर भी सेट किया :
इस तथ्य से विचलित न हों कि q2 vars में इंगित हो रहा है। हमारे पास वहाँ एक रिक्त कक्ष की गद्दी नहीं है क्योंकि हम सेल का पता लगा सकते हैं क्योंकि यह संख्या शून्य है।
इसके बाद, हम p और q2 को एक साथ घटाकर वर्तमान संख्या से गुजरते हैं जब तक कि * p शून्य नहीं होता। प्रत्येक स्थान पर, * q2 का मान बताता है कि हमें क्या करने की आवश्यकता है। 1 का अर्थ है "कुछ मत करो", इसलिए हम चलते रहते हैं। अंततः हम सेल # 2 में 2 का सामना करते हैं। हर बार * q2 1 के बराबर नहीं होता, q2 हमेशा q के बराबर होता है ।
जैसा कि मैंने पहले ही कहा था, स्टेज 2 "इस जगह का सबसे बड़ा अंक है"। इसलिए हम r2 को r पर सेट करते हैं, जबकि थोड़ी देर के लूप का उपयोग * पी से घटाएं और r को बाईं ओर ले जाएं और 1s के साथ टेप भरें, और फिर r का उपयोग करें जबकि r को दाईं ओर वापस ले जाएं और मूल्य को बहाल करने के लिए फिर से * p फिर से बढ़ाएं। याद रखें कि हर बार लूप उस मूल्य से एक कम पुनरावृत्ति के लिए चलता है, जिस पर हम उसका उपयोग करते हैं; इस वजह से, लिखे गए 1s की संख्या अंकों के मूल्य से 3 अधिक (4 के बजाय) होगी, और * p में वापस संग्रहीत अंतिम मान 2 और होगा। इस प्रकार, इसने प्रभावी रूप से 2 से * p घटाया है ।
उसके बाद, हम सेट पी के मूल्य के p2 और फिर हम सभी इसे पुन: करें। दूसरी बार, q2 को 0 पर सेट करें, दाईं ओर p स्थानांतरित करके संख्या का अंत ज्ञात करें , और फिर p और q2 को एक साथ घटाकर इस संख्या के अंकों के माध्यम से जाएं। एक बार फिर हम सेल # −3 में 2 का सामना करेंगे और लिखेंगे कि * r के कई 1s बचे हैं ।
तीसरे नंबर के मामले में, हम कुछ भी नहीं कर रहे हैं क्योंकि इसमें सैकड़ों जगह नहीं है (इसलिए q2 कभी भी q तक नहीं पहुंचता है ), लेकिन यह ठीक है क्योंकि यह अधिकतम अंकों के मूल्य की गणना को प्रभावित नहीं करता है।
हमने सेल * (r - 4) भी सेट किया है , जिसे मैंने यहां एक अनलिस्टेड एरो के साथ 1 के रूप में चिह्नित किया है (भले ही यह पहले से ही 1 है)। मैं आपको यह बताने नहीं जा रहा हूं कि अभी तक क्यों, लेकिन शायद आपने पहले ही अनुमान लगा लिया है?
* Q की अगली वृद्धि हमें स्टेज 3 तक ले जाती है, जो "वर्तमान स्थान के सभी अंकों से अधिकतम अंक घटाना" है। पहले की तरह, हम पी को 11 और q2 से 0 पर रीसेट करते हैं और फिर सभी संख्याओं से गुजरते हैं जैसे हमने पिछले चरण में किया था; इस समय को छोड़कर, * क्ष = 3 के बजाय 2. हर बार जब Q2 को पूरा करती है क्ष और पी एक सैकड़ों जगह में है, हम का उपयोग कुछ समय घटती को पाश * पी के रूप में वहाँ ब्लॉक के बाएँ में 1s हैं कई बार के रूप * r2 (5 हमारे उदाहरण में) r का उपयोग करकेएक रनिंग पॉइंटर के रूप में। हम वास्तव में इसे एक बार से अधिक घटाते हैं ताकि सबसे बड़ा अंक ,2 पर समाप्त हो जाए, इस कारण से कि बाद में स्पष्ट हो जाएगा:
हमने सभी नंबरों को संसाधित करने के बाद, अब हम चरण 3 के अंत में हैं। यहां हम दो विलक्षण चीजें करते हैं।
- सबसे पहले, हम r -block (प्लस 1) के आकार को भी * q से घटाते हैं , लेकिन r2 पॉइंटर का उपयोग करते हुए , जो इसे बाईं ओर छोड़ देता है। * q इस तरह नकारात्मक हो जाता है। हमारे मामले में, r -block के पांच 1s हैं, इसलिए * q −3 हो जाता है।
- दूसरा, हम एक चर सेट बाहर से संकेत मिलता है कि हम अब उत्पादन चरण में प्रवेश कर रहे हैं एक गैर शून्य मान के लिए। (तकनीकी रूप से, यह तथ्य कि * q ऋणात्मक है, पहले से ही आउटपुट अवस्था को इंगित करता है, लेकिन यह जाँच करना बहुत मुश्किल है, इसलिए अतिरिक्त चर है।)
अब आप समझते हैं कि हम संख्याओं से गुजर रहे हैं, प्रत्येक स्थान के भीतर वर्तमान स्थान ( * q के गैर -1 मान द्वारा दर्शाया गया है ) को खोजें, और * q के मूल्य के आधार पर कुछ करें । हम देखते हैं कि * q पहले 2 (= अधिकतम अंक मूल्य की गणना) में वृद्धि की जाती है, फिर 3 (इस स्थान में प्रत्येक अंक से अधिकतम अंक मूल्य घटाएं) और फिर हम इसे नकारात्मक बनाने के लिए इसे घटाते हैं। वहां से, यह 1 तक पहुंचने तक जारी रहेगा, इस प्रकार मूल्य को बहाल करने का मतलब है कि "कुछ भी नहीं"। उस बिंदु पर, हम अगले स्थान पर जाते हैं।
अब, जब * q ऋणात्मक है, हम आउटपुट कर रहे हैं। * q बिल्कुल सही मूल्य पर है ताकि हम 1 तक पहुँचने से पहले वर्णों की सही संख्या का उत्पादन कर सकें; यदि सबसे बड़ा अंक 2 है, तो हमें 3 पंक्तियों को आउटपुट करने की आवश्यकता है। आइए देखें कि प्रत्येक मूल्य पर क्या होता है * क्ष :
- * q = −2:
- पहले नंबर के लिए, * p ,2 है, जो इंगित करता है कि हमें a
'.'
(dot) या a ':'
(colon) आउटपुट करने की आवश्यकता है । हम तय करते हैं कि क्यू को देखकर : यदि यह we're1 है, तो हम एक ही स्थान पर हैं, इसलिए आउटपुट ':'
(जिसे हम '8'
+2 के रूप में गणना करते हैं ), अन्यथा ए '.'
।
- दूसरे नंबर के लिए, * p −3 है। कुछ भी जो −2 नहीं है, इसका मतलब है कि हम
'|'
(पाइप) आउटपुट करते हैं और फिर मूल्य बढ़ाते हैं। इस तरह यह सही जगह पर −2 तक पहुंच जाएगा और फिर हम उस अंक के बाकी हिस्सों के लिए '.'
s / ':'
s आउटपुट करते हैं।
- प्रत्येक मामले में, हम नंबर को प्रोसेस करने से पहले एक वैरिएबल पीडी को भी 0 पर सेट करते हैं, और एक गैर-शून्य मान के लिए पीडी (= "प्रिंटेड") सेट करके यह दर्शाते हैं कि हमने एक कैरेक्टर प्रिंट किया है।
- तीसरे नंबर के लिए, कोई प्रोसेसिंग नहीं होती है क्योंकि तीसरे नंबर में सैकड़ों जगह नहीं होती है। इस मामले में, पीडी अभी भी नंबर संसाधित करने के बाद 0 रहेगी, जिसका अर्थ है कि हम अभी भी उत्पादन एक करने की जरूरत है
'|'
(लेकिन केवल तभी बाहर है गैर शून्य, क्योंकि अन्यथा हम चरण 2 या 3 में अब भी कर रहे हैं)।
- सभी नंबरों को प्रसंस्करण के बाद, यदि बाहर गैर शून्य, उत्पादन एक नई पंक्ति है। ध्यान दें कि हमें आउट वेरिएबल की जरूरत है ताकि हम स्टेज 2 या 3 में न्यूलाइन को आउटपुट न करें।
- * q = * 1: पहले की तरह ही, सिवाय इसके कि * p both2 है जो दोनों पहले दो संख्याओं के लिए है, इसलिए दोनों आउटपुट a
'.'
(और तीसरा आउटपुट'|'
पहले जैसा है)।
- * q = 0: जब * q 0 होता है, इसका मतलब है "कुछ भी नहीं अगर हम एक ही स्थान पर हैं, अन्यथा
'|'
एसकी एक पंक्ति का उत्पादन करें,भले ही * p "। इस तरह हमें अंकों के बीच पैडिंग मिलती है।
अब हम आगे बढ़ने के लिए q को बढ़ाते हैं , अगले स्थान पर दसवें स्थान पर जाते हैं, और वहां * qrement * बढ़ाते हैं । स्टेज 2 की शुरुआत में, टेप इस तरह दिखता है:
फिर हम पहले की तरह ही स्टेज 2 का प्रदर्शन करते हैं। यह याद रखें कि इस स्थान के प्रत्येक अंक से प्रभावी रूप से 2 घटाएं और अधिकतम अंक का संकेत देने वाले * r2 के बचे हुए संख्या को भी छोड़ देता है । हम पिछले एकाकी संख्या को अकेले छोड़ देते हैं और बस टेप को बाईं ओर बढ़ाते रहते हैं; यह केवल "साफ" करने के लिए अनावश्यक अतिरिक्त कोड खर्च होंगे। जब हम कर रहे हैं और हम वृद्धि * * , स्टेज 3 की शुरुआत में अब टेप है:
दरअसल, यह एक झूठ है। पहले याद रखें कि मैंने कहां कहा कि हमने * (r - 4) को 1 पर सेट किया है और मैंने आपको क्यों नहीं बताया? अब मैं आपको बताता हूँ कि क्यों। यह इस तरह के मामलों के लिए है, जहां सबसे बड़ा अंक वास्तव में 0 है, जिसका अर्थ है कि इस जगह के सभी अंक 0. सेटिंग * (आर - 4) हैं , जो ऊपर दिए गए गैर-लिंक किए गए तीर द्वारा इंगित किया गया है, 1 को 1 से एकतरफा संख्या को बढ़ाता है, लेकिन केवल इस विशेष मामले में। इस तरह हम दिखावा करते हैं जैसे कि सबसे बड़ा अंक 1 था, जिसका मतलब है कि हम एक अतिरिक्त पंक्ति का उत्पादन करेंगे।
चरण 3 के बाद (वर्तमान स्थान में सभी अंकों से अधिकतम अंक घटाएं), अतिरिक्त चरण जो * q नकारात्मक बनाता है, सहित टेप इस तरह दिखता है। पिछली बार * p ब्लॉक में * 2 द्वारा सबसे बड़े अंक का प्रतिनिधित्व किया गया था , लेकिन इस बार वे सभी because3 हैं क्योंकि वे सभी वास्तव में शून्य हैं लेकिन हम दिखावा कर रहे हैं जैसे कि अधिकतम अंक 1 था।
अब देखते हैं कि क्या होता है * q 1 की ओर बढ़ता है:
- जब * q = * 1, * p मान सभी which3 हैं, जिसका अर्थ है कि हम
'|'
उन्हें आउटपुट करते हैं और बढ़ाते हैं।
- जब * q = 0, हम आउटपुट करते हैं
'|'
क्योंकि यही हम हमेशा करते हैं जब * q = 0, * p की परवाह किए बिना ।
इस प्रकार, हमें पाइप की दो पंक्तियाँ मिलती हैं।
अंत में, हम * q को एक स्थान पर ले जाते हैं। यह एक दिलचस्प हो जाता है क्योंकि हमें ':'
वास्तविक उत्पादन कुछ भी नहीं है '8'
अगर 1 अंक है, लेकिन अगर यह 1. है तो आइए देखें कि कार्यक्रम कैसे आगे बढ़ता है। सबसे पहले, हम स्टेज 2 को शुरू करने के लिए * q बढ़ाते हैं :
स्टेज 2 ("अधिकतम अंक मान की गणना करें") के बाद, हम इसके साथ बचे हैं:
चरण 3 के बाद ("वर्तमान स्थान के सभी अंकों से अधिकतम अंकों का मूल्य घटाएं") टेप इस तरह दिखता है:
अब बारी में * q के प्रत्येक पुनरावृत्ति के माध्यम से चलते हैं:
- * q = −2:
- सबसे पहले नंबर: पर -2 पहले से ही है, तो उत्पादन एक
':'
(बजाय एक '.'
क्योंकि क्ष = -1)।
- दूसरी संख्या: ,4 पर, इसलिए एक
'|'
और वेतन वृद्धि।
- तीसरा नंबर: ,3 पर, इसलिए आउटपुट ए
'|'
। हालांकि, इस बार, वेतन वृद्धि के बजाय, एक विशेष मामला ट्रिगर होता है। केवल तब जब हम अंतिम स्थान ( q = −1) का उत्पादन कर रहे हैं , और हम उस ( * q = q2) के लिए दूसरी-अंतिम पंक्ति में हैं , और अंक वास्तव में 1 ( * p = −3) है , फिर इसे instead2 तक बढ़ाने के बजाय, हमने इसे re1 पर सेट किया। दूसरे शब्दों में, हम ,1 का उपयोग एक विशेष मान के रूप में करते हैं ताकि यह पता चले कि अगले पुनरावृत्ति में, हमें '8'
इसके बजाय आउटपुट की आवश्यकता होगी ':'
।
- * q = −1:
- पहली संख्या: पहले से ही −2 पर, इसलिए आउटपुट ए
':'
।
- दूसरी संख्या: ,3 पर, इसलिए आउटपुट a
'|'
। विशेष स्थिति ट्रिगर नहीं करती है क्योंकि * q अब trigger2 नहीं है। इसलिए वेतन वृद्धि।
- तीसरा नंबर: .1 पर, इसलिए आउटपुट
'8'
।
- * q = 0: आमतौर पर, हम
'|'
यहाँ sकी पैडिंग पंक्ति को आउटपुट करेंगे, लेकिन विशेष स्थिति में जहाँ हम एक ही स्थान पर हैं ( q = −1), हम इसे छोड़ देते हैं।
इसके बाद, क्यू 0 में वृद्धि होती है और लूप समाप्त होने पर बड़ा होता है।
अब आप जानते हैं कि इनपुट कैसे 202,100,1
काम करता है। हालाँकि, एक और विशेष मामला है जिसे हमने अभी भी कवर नहीं किया है। आपको याद हो सकता है कि जब हम अंतिम स्थान का प्रसंस्करण कर रहे थे, जब * p set3 था तो हमने इसे −1 के लिए to1 पर सेट किया 1
(बजाय इसे (2 में वृद्धि के) ताकि अगली पुनरावृत्ति '8'
इसके बजाय आउटपुट करेगी । यह केवल इसलिए काम करता है क्योंकि हमारे पास एक पुनरावृत्ति है जिसमें * p we3 है और हम एक निर्णय लेते हैं कि क्या इसे बढ़ाना है या इसे −1 पर सेट करना है। हम नहीं है इस तरह के एक यात्रा है, तो सभी इकाई के स्थान में अंकों की 0 या 1. हैं इस तरह के एक मामले में सभी * p 1s हैं के लिए मूल्यों से शुरू -2 में; इसे no1 पर सेट करने का निर्णय लेने का कोई अवसर नहीं हैबल्कि इसे बढ़ाने के लिए ment3 से । इस वजह से, स्टेज 3 के अंदर एक और विशेष आवरण स्थिति है ("वर्तमान स्थान में प्रत्येक अंक से अधिकतम अंक घटाएं")। मैंने दावा किया कि प्रत्येक अंक से अधिकतम अंकों के मूल्य को घटाकर (जिस बिंदु पर अधिकतम अंक )1 पर है), हम इसे एक बार फिर से घटाते हैं, लेकिन वास्तव में इस पर एक शर्त है जो निम्नानुसार है:
यदि हम जो अंक देख रहे हैं, वह इस जगह ( * p = )1) के अधिकतम अंक के बराबर है , और यह स्थान लोगों का स्थान ( q = −1) है, और अधिकतम अंक 1 ( * (r +) है 5) = 0, (बहुत बाईं ओर गैरी ब्लॉक केवल 5 सेल लंबा है), तभी हम उत्पादन की एकमात्र पुनरावृत्ति को इंगित करने के लिए ie1 पर * p छोड़ते हैं '8'
। अन्य सभी मामलों में हम इसे एक बार फिर घटाते हैं।
किया हुआ। नया साल मुबारक हो!
1 संपादित करें (3183 → 3001): कुछ नया साल मुबारक! मैं चर p2 और r2 से पूरी तरह से छुटकारा पाने में कामयाब रहा ! p अब संख्याओं की शुरुआत और अंत खोजने के लिए आगे और पीछे दौड़ता रहता है, लेकिन यह कोड में छोटा लगता है। मैंने q2 से भी छुटकारा पाने की कोशिश की , लेकिन मैं कोड को इस तरह छोटा नहीं बना सका।
मुझे कुछ और जगहें भी मिलीं, जहाँ मैं कुछ समय के लिए लूप के अंतिम मूल्य का फिर से उपयोग करने जैसे विशिष्ट अपठनीय गोल्फिंग गुर लगा सकता था। इसके बदले आपको एक उदाहरण देना है
while *(++p) { 1 } // just increment p until *p is 0; the 1 is a noop
if (pd) { x } else { y } // where pd is a variable
मैं इसे इस तरह से लिखकर ( '""""
पहले, फिर दूसरे) और '"""
(लगातार 1) बचा सकता हूं
if (while *(++p) { pd }) { x } else { y }
बेशक, यह केवल तभी काम करता है जब मुझे पता है कि जबकि लूप कम से कम एक पुनरावृत्ति के लिए चलेगा, लेकिन अगर यह होता है, तो इसका रिटर्न वैल्यू पीडी है इसलिए मैं इसे इफ़ेक्ट के रूप में उपयोग कर सकता हूं।