विकिरण कठोर क्विन


39

जैसा कि आपको (उम्मीद है) पता होना चाहिए, एक विकिरण कठोर क्वीन एक क्वीन है जिसे आप किसी भी एक चरित्र को हटा सकते हैं और फिर भी इसके मूल, पूर्व-संशोधित स्रोत को प्रिंट कर सकते हैं। बात यह है कि इनमें से अधिकांश के साथ आप केवल एक चरित्र को हटा सकते हैं; अन्यथा सब कुछ टूट जाता है। यह वह जगह है जहाँ यह आता है; आपका लक्ष्य एक विकिरण-कठोर क्वीन का निर्माण करना है जो कि अधिक से अधिक चरित्र निष्कासन ले सकता है। कोई भी भाषा जो नियमों का अनुपालन करती है, ठीक है।

नियम

  • कार्यक्रम कम से कम एक वर्ण लंबा होना चाहिए
  • उपयोग की जाने वाली भाषा पूर्ण रूप से ट्यूरिंग होनी चाहिए (इसलिए HQ9 जैसी भाषाएं योग्य नहीं हैं)
  • अन्य सभी नियम जो सामान्य quines पर लागू होते हैं, वे भी यहाँ लागू होते हैं।
  • कम से कम के साथ समाधान program_length^(2/n)है, जिसमें किसी भी बिल्कुल के सेट nअभी भी प्रिंट करते समय मूल स्रोत कोड जीत पात्रों हटाया जा सकता है।

1
मैं एक समाधान के साथ आने की कोशिश कर रहा हूं Subleq। मुझे लगता है कि यह इस तरह की चुनौती के लिए आदर्श होगा!


हो सकता है कि नाम बदल दें, यह देखते हुए कि यह विकिरण कठोर क्वीन के समान नहीं है? शायद "विकिरण- सबूत क्वीन"?
साइओस

@ केवल अंतर मैं बता सकता हूं कि यह चुनौती किसी भी संख्या को हटाने के लिए है, जबकि अधिकांश (यदि सभी नहीं) अन्य विकिरण-कठोर quines केवल एक के लिए अनुमति देते हैं।
टेकरा

प्रसिद्ध "मैम" से रूबी समाधान। github.com/mame/radiation-hardened-quine
mbomb007

जवाबों:


57

पर्ल, 1116 1124 बाइट्स, n = 3, स्कोर = 1124 ^ (2/3) या लगभग 108.1

अपडेट : मैंने अब सत्यापित किया है कि यह br = बल के माध्यम से n = 3 के साथ काम करता है (जिसमें कुछ दिन लगे); इस परिसर में एक कार्यक्रम के साथ, हाथ से विकिरण-प्रतिरोध की जांच करना कठिन है (और मैंने पिछले संस्करण में एक गलती की थी, यही वजह है कि बाइट की गिनती में वृद्धि हुई है)। अद्यतन समाप्त करें

मैं कहीं न कहीं आप इसे देख नहीं होगा कि stderr पुनर्निर्देशित करने की सलाह देते हैं; जब आप इसमें से वर्णों को नहीं हटा रहे हैं , तब भी यह प्रोग्राम संदिग्ध सिंटैक्स के बारे में चेतावनी देता है।

यह संभव है कि कार्यक्रम को छोटा किया जा सकता है। इस पर काम करना काफी दर्दनाक है, जिससे संभव सूक्ष्म अनुकूलन को याद करना आसान हो जाता है। मैं अधिक से अधिक हटाने योग्य वर्णों की संख्या को अधिक से अधिक प्राप्त करने का लक्ष्य बना रहा था (क्योंकि यह कार्यक्रम का वास्तव में चुनौतीपूर्ण हिस्सा है), और टाईब्रेक को कुछ ऐसा माना गया, जिसका लक्ष्य अच्छा था, लेकिन मैं ऐसा कुछ नहीं करूंगा। अनुकूलन में हास्यास्पद प्रयास (इस आधार पर कि दुर्घटना द्वारा विकिरण प्रतिरोध को तोड़ना बहुत आसान है)।

कार्यक्रम

नोट: _प्रत्येक चार घटनाओं के तुरंत पहले एक शाब्दिक नियंत्रण- चरित्र (ASCII 31) है -+। मुझे नहीं लगता कि इसे StackOverflow पर कॉपी-पेस्ट किया गया है, इसलिए आपको प्रोग्राम चलाने से पहले इसे फिर से जोड़ना होगा।

eval+<eval+<eval+<eval+(q(FoPqOlengthFoBBPP181XXVVVVJJJKKKNdoWchopJFtPDevalMODx4KNFrPIPA-MN-TUV-ZPINFsPIFoPqOI.Fo.IQNevalFoINevalIFsPZyI.Fr.IT-UPINsayDFtJqJFsKPZyPT-UFWrYrKD.DEEEEQDx6NsayDNDforB1..4YforB1..4NexitQNevalFo)=~y=A-Z=-+;-AZz-~=r)####>####>####>####>####>####>
;
;
;
;
eval+<eval+<eval+<eval+(q(FoPqOlengthFoBBPP181XXVVVVJJJKKKNdoWchopJFtPDevalMODx4KNFrPIPA-MN-TUV-ZPINFsPIFoPqOI.Fo.IQNevalFoINevalIFsPZyI.Fr.IT-UPINsayDFtJqJFsKPZyPT-UFWrYrKD.DEEEEQDx6NsayDNDforB1..4YforB1..4NexitQNevalFo)=~y=A-Z=-+;-AZz-~=r)####>####>####>####>####>####>
;
;
;
;
eval+<eval+<eval+<eval+(q(FoPqOlengthFoBBPP181XXVVVVJJJKKKNdoWchopJFtPDevalMODx4KNFrPIPA-MN-TUV-ZPINFsPIFoPqOI.Fo.IQNevalFoINevalIFsPZyI.Fr.IT-UPINsayDFtJqJFsKPZyPT-UFWrYrKD.DEEEEQDx6NsayDNDforB1..4YforB1..4NexitQNevalFo)=~y=A-Z=-+;-AZz-~=r)####>####>####>####>####>####>
;
;
;
;
eval+<eval+<eval+<eval+(q(FoPqOlengthFoBBPP181XXVVVVJJJKKKNdoWchopJFtPDevalMODx4KNFrPIPA-MN-TUV-ZPINFsPIFoPqOI.Fo.IQNevalFoINevalIFsPZyI.Fr.IT-UPINsayDFtJqJFsKPZyPT-UFWrYrKD.DEEEEQDx6NsayDNDforB1..4YforB1..4NexitQNevalFo)=~y=A-Z=-+;-AZz-~=r)####>####>####>####>####>####>
;
;
;
;

स्पष्टीकरण

यह कार्यक्रम काफी स्पष्ट है, एक साथ मिलकर बनाए गए चार समान छोटे कार्यक्रमों में से एक है। मूल विचार यह है कि कार्यक्रम की प्रत्येक प्रतिलिपि यह सत्यापित करेगी कि इसे चलाने के लिए बहुत बुरी तरह से क्षतिग्रस्त किया गया है या नहीं; यदि यह हो गया है, तो यह कुछ भी नहीं करेगा (संभवतः संभावित चेतावनियों के अलावा) और अगली कॉपी को चलने देगा; यदि यह नहीं किया गया है (अर्थात कोई विलोपन नहीं है, या हटा दिया गया वर्ण वह है जो प्रोग्राम के संचालन में कोई अंतर नहीं करता है), यह अपनी क्वीन बात करेगा (पूर्ण प्रोग्राम के स्रोत कोड को प्रिंट करना; यह एक उचित क्वीन है; प्रत्येक भाग के साथ पूरे स्रोत कोड का एन्कोडिंग है) और फिर बाहर निकलें (स्रोत कोड को फिर से प्रिंट करने से किसी भी अन्य अप्रकाशित प्रतियों को रोकना और इस प्रकार बहुत अधिक पाठ को मुद्रित करके क्वीन को बर्बाद करना)।

प्रत्येक भाग बारी-बारी से दो भागों से बना होता है जो प्रभावी रूप से कार्यात्मक रूप से स्वतंत्र होते हैं; एक बाहरी आवरण और कुछ आंतरिक कोड। जैसे, हम उन पर अलग से विचार कर सकते हैं।

बाहर का आवरण

बाहरी आवरण, मूल रूप से, eval<+eval<+eval< ... >####>####...>###(साथ ही अर्धविरामों और न्यूलाइन्स का एक समूह है, जिसका उद्देश्य बहुत स्पष्ट होना चाहिए; यह सुनिश्चित करना है कि कार्यक्रम के कुछ हिस्सों की परवाह किए बिना अलग-अलग बने रहेंगे यदि कुछ अर्धविराम, या उनसे पहले की नई सूची, हटाए जाएं) )। यह काफी सरल लग सकता है, लेकिन यह कई मायनों में सूक्ष्म है, और इस चुनौती के लिए मैंने पर्ल को चुना।

सबसे पहले, आइए देखें कि प्रोग्राम की एक अप्रकाशित प्रतिलिपि में रैपर कैसे कार्य करता है। evalएक अंतर्निहित फ़ंक्शन के रूप में पर्स करता है, जो एक तर्क लेता है। क्योंकि एक तर्क की उम्मीद की जाती है, +यहां एक एकता है +(जो अब तक पर्ल गोल्फर्स के लिए बहुत परिचित होगी; वे अक्सर उपयोगी आश्चर्यजनक रूप से आते हैं)। हम अभी भी एक तर्क की उम्मीद कर रहे हैं (हमने सिर्फ एक संयुक्त संचालक को देखा है), इसलिए जो <अगले आता है उसे <>ऑपरेटर की शुरुआत के रूप में व्याख्या की जाती है (जो कि कोई उपसर्ग या पोस्टफ़िक्स तर्क नहीं लेता है, और इस तरह से ऑपरेटर की स्थिति में उपयोग किया जा सकता है)।

<>काफी अजीब ऑपरेटर है। इसका सामान्य उद्देश्य फ़ाइलहैंडल्स पढ़ना है, और आप फ़ाइल नाम को कोन कोष्ठक के अंदर रखते हैं। वैकल्पिक रूप से, यदि अभिव्यक्ति एक फ़ाइलहैंडल नाम के रूप में मान्य नहीं है, तो यह ग्लोबिंग करता है (मूल रूप से, एक ही प्रक्रिया जिसे UNIX शेल उपयोगकर्ता द्वारा दर्ज किए गए पाठ का उपयोग कमांड-लाइन तर्कों के अनुक्रम में करता है; पर्ल के पुराने संस्करण वास्तव में उपयोग किए गए हैं; इसके लिए शेल, लेकिन आजकल पर्ल आंतरिक रूप से ग्लोबिंग को संभालता है)। इसलिए, इच्छित उपयोग, की तर्ज पर है <*.c>, जो आम तौर पर एक सूची की तरह लौटाएगा ("foo.c", "bar.c")। एक स्केलर संदर्भ में (जैसे कि तर्कeval), यह केवल पहली प्रविष्टि को चलाता है जो पहली बार इसे चलाने (पहली दलील के बराबर) पाता है, और काल्पनिक भविष्य के रन पर अन्य प्रविष्टियों को लौटाता है जो कभी नहीं होता है।

अब, गोले अक्सर कमांड-लाइन तर्कों को संभालते हैं; यदि आप -rबिना किसी तर्क के साथ कुछ देते हैं , तो यह केवल प्रोग्राम वर्बेटिम को दिया जाएगा, भले ही उस नाम के साथ कोई फ़ाइल हो या नहीं। पर्ल उसी तरह से कार्य करता है, इसलिए जब तक हम यह सुनिश्चित करते हैं कि ऐसे अक्षर नहीं हैं जो शेल और पर्ल के बीच <और मिलान के लिए विशेष हैं >, तो हम इसे प्रभावी रूप से स्ट्रिंग शाब्दिक के अजीब रूप में उपयोग कर सकते हैं। इससे भी बेहतर, पर्ल जैसे पार्सर को कोट-जैसे ऑपरेटरों के लिए संदर्भों में भी ब्रैकेट्स से मिलान करने की एक अनिवार्य प्रवृत्ति होती है, जहां इसका कोई मतलब नहीं है, इसलिए हम <>सुरक्षित रूप से घोंसला बना सकते हैं (जो इस कार्यक्रम के लिए आवश्यक खोज संभव है)। इन सभी नेस्टेड के प्रमुख नकारात्मक पक्ष यह <>है कि सामग्री से बचना<>लगभग असंभव है; ऐसा लगता है कि प्रत्येक के साथ अनसेफिंग की दो परतें हैं <>, इसलिए सभी तीनों के अंदर कुछ बच निकलने के लिए, इसे 63 बैकस्लैश के साथ पूर्ववर्ती होना चाहिए। मैंने तय किया कि भले ही कोड का आकार इस समस्या में एक माध्यमिक विचार है, लेकिन यह लगभग निश्चित रूप से मेरे स्कोर के लिए इस तरह के दंड का भुगतान करने के लायक नहीं था, इसलिए मैंने सिर्फ आक्रामक चरित्रों का उपयोग किए बिना बाकी कार्यक्रम लिखने का फैसला किया।

तो क्या होगा अगर रैपर के कुछ हिस्सों को हटा दिया जाए?

  • शब्द में विलोपन evalइसका कारण नंगेपन में बदल जाता है , एक स्ट्रिंग जिसका कोई अर्थ नहीं है। पर्ल को ये पसंद नहीं है, लेकिन यह उन्हें व्यवहार करता है जैसे कि वे उद्धरणों से घिरे थे; इस प्रकार eal<+eval<+...व्याख्या की जाती है"eal" < +eval<+...। इसका कार्यक्रम के संचालन पर कोई प्रभाव नहीं पड़ता है, क्योंकि यह मूल रूप से केवल भारी नेस्टेड (जो हम वैसे भी उपयोग नहीं करते हैं) से परिणाम ले रहे हैं, इसे एक पूर्णांक में कास्टिंग कर रहे हैं, और इस पर कुछ व्यर्थ तुलना कर रहे हैं। (इस तरह की चीज़ों के कारण बहुत सी चेतावनी स्पैम का कारण बनती है क्योंकि यह स्पष्ट रूप से सामान्य परिस्थितियों में करने के लिए एक उपयोगी चीज नहीं है; हम इसे हटाने को अवशोषित करने के लिए उपयोग कर रहे हैं।) इससे हमें आवश्यक कोष्ठक कोष्ठक बंद करने की संख्या में परिवर्तन होता है (क्योंकि उद्घाटन ब्रैकेट अब इसकी तुलना एक तुलना ऑपरेटर के रूप में की जा रही है), लेकिन अंत में टिप्पणियों की श्रृंखला सुनिश्चित करती है कि स्ट्रिंग सुरक्षित रूप से समाप्त हो जाएगी चाहे कितनी बार नेस्टेड हो। (यहां #कड़ाई से आवश्यक से अधिक संकेत हैं; मैंने इसे लिखा था जैसे मैंने कार्यक्रम को और अधिक संकुचित करने के लिए किया था, मुझे क्वीन को स्टोर करने के लिए कम डेटा का उपयोग करने की अनुमति देता है।)
  • यदि कोई <हटा दिया जाता है, तो कोड अब पार्स हो जाता है eval(eval<...>)। माध्यमिक, बाहर evalका कोई प्रभाव नहीं है, क्योंकि जिन कार्यक्रमों का हम मूल्यांकन कर रहे हैं, वे किसी भी चीज को वापस नहीं करते हैं, जिसका कोई भी वास्तविक प्रभाव एक कार्यक्रम के रूप में होता है (यदि वे सामान्य रूप से सभी पर लौटते हैं, तो यह आमतौर पर एक अशक्त स्ट्रिंग या एक नंगेपन है; और आमतौर पर वे के माध्यम से लौटते हैं; अपवाद, जो evalएक अशक्त स्ट्रिंग को वापस करने का कारण बनता है, या exitसभी पर लौटने से बचने के लिए उपयोग करता है)।
  • यदि +हटा दिया जाता है, तो इसका कोई तत्काल प्रभाव नहीं पड़ता है यदि आसन्न कोड बरकरार है; +कार्यक्रम पर यूनरी का कोई प्रभाव नहीं है। (मूल +एस वहाँ कारण है कि मरम्मत की क्षति में मदद करने के लिए; वे परिस्थितियों की संख्या में वृद्धि करते हैं जिसमें एक रिलेशनल ऑपरेटर के बजाय <एक यूनरी के रूप में व्याख्या की जाती है <>, जिसका अर्थ है कि आपको अमान्य प्रोग्राम का उत्पादन करने के लिए अधिक विलोपन की आवश्यकता है।)

रैपर को पर्याप्त विलोपन के साथ क्षतिग्रस्त किया जा सकता है, लेकिन आपको कुछ ऐसा करने के लिए कुछ विलोपन करने की आवश्यकता है जो पार्स नहीं करता है। चार विलोपन के साथ, आप यह कर सकते हैं:

eal<evl<eval+<...

और पर्ल में, रिलेशनल ऑपरेटर <गैर-सामाजिक है, और इस प्रकार आपको एक सिंटैक्स त्रुटि मिलती है (वही जिसे आप प्राप्त करेंगे 1<2<3)। जैसे, प्रोग्राम के लिए कैप n = 3 है। अधिक unary +s जोड़ना इसे बढ़ाने के लिए एक आशाजनक तरीका लगता है, लेकिन जैसा कि यह तेजी से संभावना बना देगा कि आवरण के अंदर भी टूट सकता है, यह सत्यापित करते हुए कि कार्यक्रम का नया संस्करण बहुत मुश्किल हो सकता है।

आवरण इतना मूल्यवान है कि evalपर्ल अपवादों को पकड़ता है, जैसे कि (उदाहरण के लिए) अपवाद जो आपको तब मिलता है जब आप सिंटैक्स त्रुटि को संकलित करने का प्रयास करते हैं। क्योंकि यह evalएक स्ट्रिंग शाब्दिक है, स्ट्रिंग का संकलन रनटाइम पर होता है, और यदि शाब्दिक संकलन करने में विफल रहता है, तो परिणामस्वरूप अपवाद पकड़ा जाता है। यह evalएक अशक्त स्ट्रिंग को वापस करने और त्रुटि संकेतक सेट करने का कारण बनता है $@, लेकिन हम कभी भी (या कभी-कभी प्रोग्राम के कुछ उत्परिवर्तित संस्करणों में लौटे नल स्ट्रिंग को छोड़कर) की जाँच नहीं करते हैं। गंभीर रूप से, इसका मतलब है कि अगर कोड के अंदर कुछ होना चाहिएआवरण, एक वाक्यविन्यास त्रुटि पैदा करता है, तो आवरण केवल कोड के बजाय कुछ भी नहीं करने का कारण होगा (और कार्यक्रम स्वयं की एक अप्रकाशित प्रतिलिपि खोजने के प्रयास में निष्पादन करेगा)। इसलिए, अंदर के कोड को रैपर के रूप में लगभग विकिरण-सबूत नहीं होना चाहिए; हम इस बात की परवाह करते हैं कि यदि क्षतिग्रस्त है, तो यह या तो प्रोग्राम के नामांकित संस्करण के लिए समान रूप से कार्य करेगा, या फिर यह दुर्घटनाग्रस्त हो जाएगा ( evalअपवाद को पकड़ने और जारी रखने की अनुमति देता है) या सामान्य रूप से कुछ भी छपाई किए बिना बाहर निकलें।

रैपर के अंदर

रैपर के अंदर कोड, मौलिक रूप से, इस तरह दिखता है (फिर से, वहाँ एक नियंत्रण है - _कि स्टैक एक्सचेंज तुरंत पहले नहीं दिखाएगा -+):

eval+(q(...)=~y=A-Z=-+;-AZz-~=r)

यह कोड पूरी तरह से ग्लोब-सुरक्षित वर्णों के साथ लिखा गया है, और इसका उद्देश्य विराम चिह्नों की एक नई वर्णमाला जोड़ना है जो एक वास्तविक कार्यक्रम लिखना संभव है, एक स्ट्रिंग शाब्दिक का अनुवाद और मूल्यांकन करके (हम उपयोग नहीं कर सकते हैं 'या "हमारे उद्धरण के रूप में) अंक, लेकिन q(... )पर्ल में एक स्ट्रिंग बनाने का एक वैध तरीका भी है)। (अनप्रेडिबल कैरेक्टर का कारण यह है कि हमें प्रोग्राम में शाब्दिक स्पेस के बिना स्पेस कैरेक्टर में कुछ ट्रांसलेट करना होगा। इस प्रकार हम ASCII 31 से शुरू होने वाली रेंज बनाते हैं, और रेंज के दूसरे एलिमेंट के रूप में स्पेस पकड़ते हैं।) जाहिर है, अगर हम लिप्यंतरण के माध्यम से कुछ पात्रों का निर्माण कर रहे हैं, हम उन्हें लिप्यन्तरण के लिए पात्रों का बलिदान करने के लिए है से, लेकिन अपरकेस अक्षर बहुत उपयोगी नहीं हैं और विराम चिह्नों तक पहुंच के बिना उन तक पहुंच के बिना लिखना बहुत आसान है।

यहाँ ग्लोब के परिणामस्वरूप उपलब्ध होने वाले विराम चिह्नों की वर्णमाला है (ऊपरी रेखा एन्कोडिंग को दर्शाती है, निचली पंक्ति जिस वर्ण को एनकोड करती है):

BCDEFGHIJKLMNOPQRSTUVWXYZ
 ! "# $% & '() * +;? <=> @ Azz {|} ~ 

सबसे विशेष रूप से, हमारे पास विराम चिह्नों का एक गुच्छा है जो ग्लोब-सुरक्षित नहीं हैं, लेकिन पर्ल चरित्र लिखने में उपयोगी हैं, साथ में अंतरिक्ष चरित्र। मैं भी दो पत्र अपरकेस, शाब्दिक बचाया Aऔर Z(जो एनकोड खुद को नहीं है, लेकिन करने के लिए Tऔर Uहै, क्योंकि Aएक ऊपरी और साथ ही एक कम रेंज समाप्ति बिंदु की जरूरत थी); यह हमें नए एन्कोडेड वर्ण सेट का उपयोग करके लिप्यंतरण निर्देश को स्वयं लिखने की अनुमति देता है (हालाँकि अपरकेस अक्षर उस उपयोगी नहीं हैं, वे अपरकेस अक्षरों में परिवर्तन निर्दिष्ट करने में उपयोगी हैं)। सबसे उल्लेखनीय अक्षर है कि हम उपलब्ध नहीं है कर रहे हैं [, \और ], लेकिन कोई भी जरूरत है (जब मैं उत्पादन में एक नई पंक्ति की जरूरत है, मैं इसे से निहित न्यू लाइन का उपयोग कर उत्पादन कियाsayलिखने की आवश्यकता के बजाय \n; chr 10काम भी किया होगा लेकिन अधिक क्रिया है)।

हमेशा की तरह, हमें इस बारे में चिंता करने की ज़रूरत है कि अगर रैपर के अंदर स्ट्रिंग शाब्दिक के बाहर क्षतिग्रस्त हो जाता है तो क्या होगा। एक भ्रष्ट व्यक्ति evalकुछ भी चलने से रोकेगा; हम इसके साथ ठीक हैं। यदि उद्धरण चिह्न क्षतिग्रस्त हो जाते हैं, तो स्ट्रिंग के अंदर वैध पर्ल नहीं होता है, और इस प्रकार आवरण इसे पकड़ लेगा (और तार पर कई घटाव का मतलब है कि भले ही आप इसे वैध पर्ल बना सकते हैं, यह कुछ भी नहीं करेगा, जो एक स्वीकार्य परिणाम है)। लिप्यंतरण में नुकसान, अगर यह एक सिंटैक्स त्रुटि नहीं है, तो स्ट्रिंग का मूल्यांकन किया जाएगा, आमतौर पर यह सिंटैक्स त्रुटि बनने का कारण बनता है ; मुझे यकीन नहीं है कि ऐसे कोई मामले नहीं हैं जिनमें यह टूटता है, लेकिन मैं यह सुनिश्चित करने के लिए इस समय पर मजबूर हूं और अगर ऐसा है तो इसे ठीक करना आसान होना चाहिए।

एन्कोडेड प्रोग्राम

स्ट्रिंग शाब्दिक के अंदर देखते हुए, मैंने जो एन्कोडिंग का इस्तेमाल किया था, उसे उलट दिया और इसे और अधिक पठनीय बनाने के लिए व्हॉट्सएप को जोड़ा, हमें यह मिलता है (फिर से, नियंत्रण-अंडरस्कोर की कल्पना करें -+, जो कि इनकोडेड है A):

$o=q<
  length$o  ==181 || zzzz((()));
  do {
    chop ($t = "eval+<"x4);
    $r = '=-+;-AZz-~=';
    $s = '$o=q<' . $o . '>;eval$o';
    eval '$s=~y' . $r . 'A-Z=';
    say "$t(q($s)=~y=A-Z${r}r)" . "####>"x6;
    say ";" for 1..4
  } for 1..4;
  exit>;
eval $o

जिन लोगों का उपयोग किया जाता है, वे इस सामान्य संरचना को पहचानेंगे। सबसे महत्वपूर्ण हिस्सा शुरुआत में है, जहां हम यह सत्यापित करते हैं कि $ o अप्रयुक्त है; यदि पात्रों हटा दिया गया है, इसकी लंबाई से मेल नहीं खाएगी 181, तो हम चलाते हैं zzzz((())), जो अगर यह बेजोड़ कोष्ठक की वजह से एक सिंटैक्स त्रुटि नहीं है, भले ही आप क्योंकि कोई भी, किसी भी तीन वर्णों को हटाने के एक रनटाइम त्रुटि हो जाएगा zzzz, zzz, zz, और zएक फ़ंक्शन है, और इसे हटाने के अलावा एक फ़ंक्शन के रूप में पार्स करने (((और एक अप्रिय सिंटैक्स त्रुटि पैदा करने का कोई तरीका नहीं है । चेक खुद भी क्षति के लिए प्रतिरक्षा है; ||को क्षतिग्रस्त किया जा सकता |लेकिन यह है कि कारण होगा zzzz((()))बिना शर्त को चलाने के लिए कॉल; हानिकारक चर या स्थिरांक एक बेमेल का कारण बनेंगे क्योंकि आप इनमें से किसी एक की तुलना कर रहे हैं 0,180, 179, 178के अंकों में से कुछ सबसेट के लिए समानता के लिए 181; और एक =को हटाने से एक पार्स विफलता का कारण होगा, और दो =अनिवार्य रूप से एलएचएस का कारण बनता है कि या तो पूर्णांक 0 या शून्य स्ट्रिंग का मूल्यांकन करें, जो दोनों ही गलत हैं।

अद्यतन : यह जाँच कार्यक्रम के पूर्ववर्ती संस्करण में थोड़ी गलत थी, इसलिए मुझे इस समस्या को ठीक करने के लिए इसे संपादित करना पड़ा। पिछले संस्करण डिकोड के बाद इस तरह दिखे:

length$o==179||zzzz((()))

और इसे पाने के लिए पहले तीन विराम चिह्नों को हटाना संभव था:

lengtho179||zzz((()))

lengtho179नंगे होने के नाते, सत्य है और इस तरह चेक को तोड़ता है। मैंने अतिरिक्त दो Bवर्णों को जोड़कर इसे ठीक किया (जो कि अंतरिक्ष वर्णों को कूटबद्ध करता है), जिसका अर्थ है कि क्वीन का नवीनतम संस्करण यह करता है:

length$o  ==181||zzzz((()))

अब सिंटैक्स त्रुटि उत्पन्न करने के बिना =संकेत और संकेत दोनों को छिपाना असंभव है $। (मुझे एक के बजाय दो स्थान जोड़ना था क्योंकि लंबाई में 180एक शाब्दिक 0वर्ण स्रोत में रखा जाएगा , जिसे इस संदर्भ में दुरुपयोग किया जा सकता है एक पूर्णांक के साथ शून्य की तुलना करें, जो सफल होता है।) अंतिम अद्यतन।

एक बार जब लंबाई की जाँच हो जाती है, तो हमें पता चलता है कि यह कॉपी अप्रकाशित है, कम से कम इसके चरित्र विलोपन के संदर्भ में, इसलिए यह सब वहाँ से सीधा सीधा क्विनिंग है (एक भ्रष्ट डिकोडिंग टेबल के कारण विराम चिह्नों के प्रतिस्थापन इस चेक को नहीं पकड़ा जाएगा। , लेकिन मैंने पहले ही पाशविक-बल के माध्यम से सत्यापित कर दिया है कि केवल डिकोडिंग टेबल से कोई तीन विलोपन क्वीन को नहीं तोड़ते हैं, संभवतः उनमें से अधिकांश सिंटैक्स त्रुटियों का कारण बनते हैं)। हमारे पास $oपहले से ही एक चर है, इसलिए हमें बस इतना करना है कि बाहर के रैपरों को हार्डकोड करें (कुछ छोटी-छोटी डिग्री संपीड़न के साथ; मैंने प्रश्न के भाग को पूरी तरह से बाहर नहीं छोड़ा )। एक चाल यह है कि हम एन्कोडिंग तालिका के थोक को स्टोर करते हैं$r; अंदर के आवरण के एन्कोडिंग टेबल सेक्शन को जनरेट करने के लिए या तो हम इसके बारे में जान सकते हैं या इसके चारों ओर कुछ कोड समेट सकते हैं और evalडिकोडिंग प्रक्रिया को रिवर्स में चलाने के लिए (हमें यह पता लगाने की अनुमति देते हैं कि $ o का एन्कोडेड संस्करण क्या है) , इस बिंदु पर उपलब्ध केवल डिकोड किया गया संस्करण)।

अंत में, यदि हम एक अक्षुण्ण प्रति हैं और इस प्रकार पूरे मूल कार्यक्रम का उत्पादन कर सकते हैं, तो हम कार्यक्रम exitको प्रिंट करने की कोशिश कर रही अन्य प्रतियों को भी रोकने के लिए कॉल करते हैं।

सत्यापन स्क्रिप्ट

बहुत सुंदर नहीं, लेकिन इसे पोस्ट करना क्योंकि किसी ने पूछा। मैंने इसे कई बार कई प्रकार की सेटिंग्स (आमतौर पर बदलने $minऔर $maxब्याज के विभिन्न क्षेत्रों की जांच करने के लिए) के साथ चलाया ; यह पूरी तरह से स्वचालित प्रक्रिया नहीं थी। यह भारी सीपीयू लोड के कारण कहीं और चलने से रोकने की प्रवृत्ति है; जब ऐसा हुआ, तो मैंने $minपहले मूल्य को बदल दिया $xऔर पूरी तरह से जाँच नहीं की और स्क्रिप्ट चलाना जारी रखा (इस तरह यह सुनिश्चित करना कि रेंज के सभी कार्यक्रम अंततः जांच लिए गए)। मैंने केवल कार्यक्रम की पहली प्रति से विलोपन की जाँच की है, क्योंकि यह काफी स्पष्ट है कि अन्य प्रतियों से विलोपन अधिक नहीं कर सकते हैं।

use 5.010;
use IPC::Run qw/run/;
undef $/;
my $program = <>;
my $min = 1;
my $max = (length $program) / 4 - 3;
for my $x ($min .. $max) {
    for my $y ($x .. $max) {
        for my $z ($y .. $max) {
            print "$x, $y, $z\n";
            my $p = $program;
            substr $p, $x, 1, "";
            substr $p, $y, 1, "";
            substr $p, $z, 1, "";
            alarm 4;
            run [$^X, '-M5.010'], '<', \$p, '>', \my $out, '2>', \my $err;
            if ($out ne $program) {
                print "Failed deleting at $x, $y, $z\n";
                print "Output: {{{\n$out}}}\n";
                exit;
            }
        }
    }
}

say "All OK!";

3
ओपी थोड़ा अस्पष्ट है; लेकिन मुझे लगा कि स्कोर (1116 * 1116) / 3 होगा।
ग्रेग मार्टिन

@GregMartin: (1116 * 1116) / 3 415152 है, इसलिए यह प्रविष्टि अभी भी उन परिस्थितियों में जीत रही होगी। हालाँकि, मुझे नहीं लगता कि ओपी का मतलब यह हो सकता है कि क्योंकि यह कई पात्रों को हटाने में सक्षम होने के लिए बहुत कम प्रोत्साहन देगा। यदि आप केवल एक चरित्र को हटाने के लिए इसकी आवश्यकता रखते हैं तो यह कुनैन आधे से भी कम हो सकती है; अगर हम इसे उस तरह से व्याख्यायित करते हैं, तो मुझे स्कोर पर एक प्रभावी on 4 मिलेगा, जो कि from 3 को पछाड़ देगा जो कि मुझे n = 3 से मिलता है, और इस प्रकार इसका मतलब है कि कम दिलचस्प n = 1 प्रविष्टियां वास्तव में बेहतर स्कोरिंग हैं।

2
मैंने स्कोरिंग क्लियर किया। वैसे भी, यह बिल्कुल अविश्वसनीय है; नहीं सोचा था कि किसी को भी n> 1.
takra

1
यह पर्ल के बारे में कुछ कहता है कि बिना विराम चिह्नों के बिना किसी कार्यक्रम को लिखना आसान है
रॉबर्ट फ्रेजर

35

बेफुज -98 , 884, एन = 14, स्कोर। 2.636

f00f00f00f00f00f00f00f00f00f00f00f00f00f00f0xxxxxxxxxxxxxxx"""""""""""""""fffffffffffffff'''''''''''''''000000000000000\\\\\\\\\\\\\\\'''''''''''''''000000000000000\\\\\\\\\\\\\\\'''''''''''''''fffffffffffffff\\\\\\\\\\\\\\\111111111111111---------------:::::::::::::::!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!000000000000000aaaaaaaaaaaaaaa---------------bbbbbbbbbbbbbbb---------------***************jjjjjjjjjjjjjjj$$$$$$$$$$$$$$$'''''''''''''''+++++++++++++++kkkkkkkkkkkkkkk,,,,,,,,,,,,,,,333333333333333kkkkkkkkkkkkkkk$$$$$$$$$$$$$$$000000000000000{{{{{{{{{{{{{{{'''''''''''''''888888888888888uuuuuuuuuuuuuuu'''''''''''''''!!!!!!!!!!!!!!!111111111111111+++++++++++++++'''''''''''''''xxxxxxxxxxxxxxx###############;;;;;;;;;;;;;;;:::::::::::::::!!!!!!!!!!!!!!!kkkkkkkkkkkkkkk@@@@@@@@@@@@@@@dddddddddddddddkkkkkkkkkkkkkkk:::::::::::::::eeeeeeeeeeeeeeekkkkkkkkkkkkkkk,,,,,,,,,,,,,,,;;;;;;;;;;;;;;;

इसे ऑनलाइन आज़माएं!

यह केवल तब काम नहीं करता है जब आप ठीक 14 वर्णों को हटाते हैं, लेकिन तब भी जब आप 14 वर्णों तक की राशि निकालते हैं ।

n = 14एक बहुत ही मनमाने विकल्प की तरह लग सकता है, लेकिन मैंने जो तकनीक का उपयोग किया है वह वास्तव में केवल 1 से 14 तक विकिरण-सख्त आदेशों के लिए उपयोग किया जा सकता है, लेकिन आसानी से उससे परे नहीं है (यह संभव हो सकता है लेकिन मेरे पास कोई सुराग नहीं है)। आदेश -1 क्वीन केवल 73 बाइट्स है (हालांकि इसमें कुछ गोल्फिंग चालें हैं जो बड़े पर लागू नहीं होती हैं n):

200 20 xx""''ÈÈ..aa22**..33kk$$00{{''!!uu''!!11++''xx##;;::!!kk@@::,,,,;;

व्याख्या

जब मैं इस जवाब पर काम कर रहा था, तो मैंने पाया कि निर्देश सूचक के डेल्टा को (2,0)निम्न स्निपेट के साथ विकिरण-कठोर परिस्थितियों में सेट करना संभव है :

20020xx

यह उत्तर देखें कि यह क्यों काम करता है। मुझे यह सिर्फ थोड़ा सा हाथ के साथ मिल गया, लेकिन इसने यह सवाल उठाया कि क्या ऐसे ही पैटर्न हैं जो कई वर्णों को हटाने के तहत मजबूत हैं। इसलिए मैंने पाशविक बल द्वारा इनकी खोज करने के लिए एक लघु गणित लिपि लिखी:

n = 14;
m = 4;
Print @ FromDigits @ {
      m + 1, 0, 
      ## & @@ ((m + 1) IntegerDigits[#, 2, n - 4]),
      m + 1, 0
} & /@ Select[
   Range[0, 2^(n - 4) - 1], 
   AllTrue[
     Subsets[{
         m + 1, 0, 
         ## & @@ ((m + 1) IntegerDigits[#, 2, n - 4]),
         m + 1, 0
       }, 
       {n - m, n - 1}
     ] //. {a___, _, m + 1} | {a___, 0, _} :> {a}, 
     MatchQ@{___, m + 1, 0}
  ] &
];

यह बहुत जल्दी एक पैटर्न का पता चला। एक समान स्निपेट प्राप्त करने के लिए जो nवर्णों को हटाने के लिए काम करता है , आप उपयोग कर सकते हैं (m0x){n}m0कि कहां mहै n+1और क्या xहै mया 0। तो निम्नलिखित में से सभी दो वर्णों को हटाने के लिए काम करेंगे:

30030030
30030330
30330030
30330330

मुझे यकीन है कि यह साबित करना संभव है, लेकिन मैंने बस इसके लिए सत्यापित किया nहै 7। बेशक, यह केवल तब तक काम करता है जब तक हम n+1एक अंक के रूप में प्रतिनिधित्व कर सकते हैं , और Befunge 98 में सबसे बड़ा ऐसा अंक है fजो 15. का प्रतिनिधित्व करता है। यही कारण है कि मेरा दृष्टिकोण सीमित है n = 14। अगर किसी को डेल्टा को मज़बूती से बड़ा करने का रास्ता मिल जाता है n+1, तो संभवतः इस विकिरण-कठोर क्वीन के क्रम को अनिश्चित काल तक बढ़ाना संभव होगा।

आइए वास्तविक कोड को देखें। मूल रूप से इसके दो हिस्से हैं। पहले हमने डेल्टा को सेट किया (15,0)जैसा कि मैंने अभी बताया:

f00f00f00f00f00f00f00f00f00f00f00f00f00f00f0xxxxxxxxxxxxxxx

और कोड के शेष में प्रत्येक कमांड 15 बार दोहराया गया है और स्रोत को प्रिंट करता है। यदि हम पुनरावृत्ति को दूर करते हैं, तो यह इस तरह दिखता है:

"f'0\'0\'f\1-:!!0a-b-*j$'+k,3k$0{'8u'!1+'x#;:!k@dk:ek,;

"एक मानक 2 डी quining तकनीक है: यह स्ट्रिंग मोड शुरू होता है, सभी वर्णों (अपने आप को छोड़कर) ढेर और समाप्त होता है स्ट्रिंग मोड पर फिर से चारों ओर लपेटकर के बाद धक्का। यह हमें दूसरे हाफ के सभी कोड पॉइंट्स प्राप्त करने में मदद करता है, लेकिन यह हमें पहले हाफ से कुछ भी उपयोगी बनाने में विफल होगा, क्योंकि पूरे f00f00...f0बिट में, यह केवल दो वर्णों को रिकॉर्ड करेगा (जो fया तो हो सकता है या 0इस पर निर्भर करता है कि कौन से वर्ण हटाए गए हैं) )। लेकिन चूंकि यह हिस्सा 15 बार दोहराया जा रहा है, इसलिए हमें इसे अलग से प्रिंट करने की आवश्यकता होगी।

अधिक सुविधाजनक रूप से, अनमॉडिफाइड क्विन में, स्ट्रिंग की लंबाई पहले होती "है -1 (mod 15)। यह गारंटी देता है कि कोई फर्क नहीं पड़ता कि कितने वर्ण (14 तक) हम निकालने के लिए, कि संख्या दर्ज की गई पात्रों में से वहाँ हमेशा है 3 (एक xऔर के दो fऔर 0)। यह 14 तक के किसी भी विकिरण आदेश के लिए वास्तव में सच है।

अब हम इस f00f00...f0भाग की छपाई शुरू करते हैं :

f'0\'0\'f\1-:!!0a-b-*j$'+k,

f          Push 15, a loop counter.
'0\'0\'f\  Put "00f" underneath the loop counter.
1-         Decrement the loop counter.
:!!        Copy it, and turn it into a 1 if it's positive.
0a-b-      Push -21.
*          Multiply by 0 if the loop counter is zero, or by 1 otherwise.
j          Jump that many steps. If the value was 0, this is a no-op and
           the loop ends. Otherwise, this brings us back after the f.
$          Pop the loop counter (which is now 0).
'+k,       Print the top of the stack 43 times, which gives us all of
           the "f00f00...f0" and leaves one "0" on top of the stack.

अगला 3k$बस यह बताता है कि कार्यक्रम की शुरुआत से 0तीन पात्रों को भी शामिल किया "गया था। स्टैक में अब केवल अक्षर होते हैं और "साथ ही मूल के नीचे से कुछ कबाड़ होते हैं, f00f00...f0जिसके आधार पर वर्ण हटा दिए जाते थे।

अब हमें केवल स्टैक के शीर्ष (शेष वर्णों) को उल्टा करना होगा और उनमें से प्रत्येक को 15 बार प्रिंट करना होगा।

0{     Start a new, empty stack. This pushes two zeros onto the original stack.
'8u    Move the top 56 values from the original stack to the new one, which
       is the 54 characters after the " as well as those two zeros. This is
       implemented as pop-push loop, so it reverses the order of those elements.
'!1+   Push a " by incrementing a !.
'x     Push an x. Now we've got all the characters that are repeated 15 times.
#;     Enter a loop. This is a standard technique for Befunge-98: the ; is
       a bit like a comment character, that ignores everything until the next
       ;, but we jump over the first one with #, so that from now on only
       the code inside will be executed (over and over).
  :!     Copy the top of the stack, and compute logical NOT (1 if 0, 0 otherwise).
  k@     Terminate the program that many times (i.e. when the top of the
         stack is zero).
  dk:    Make 14 copies of the top of the stack.
  ek,    Print 15 characters from the top of the stack.
;

और बस। :)


16

जावास्क्रिप्ट (ईएस 6), 927 बाइट्स, एन = 1, स्कोर = 859329

नोट: इसे चलाने के लिए एक REPL (एक ब्राउज़र कंसोल की तरह) का उपयोग न करें।

कोड लंबाई एक कारक होने से पहले यह लिखा गया था, इसलिए यह अभी तक गोल्फ नहीं है।

यह बहुत मुश्किल था , और पूरी तरह से स्पष्टीकरण के योग्य है। जो मैं बाद में लिखूंगा, मैं इस चुनौती का थोड़ा और पता लगाने के बाद!

etTimeout=stTimeout=seTimeout=setimeout=setTmeout=setTieout=setTimout=setTimeut=setTimeot=setTimeou=unescape=>42;
setTimeout
`c="function f(){x=String.fromCharCode(96);n=String.fromCharCode(10);q=String.fromCharCode(34);y='etTimeout=stTimeout=seTimeout=setimeout=setTmeout=setTieout=setTimout=setTimeut=setTimeot=setTimeou=unescape=>42;'+n;z='setTimeout'+n+x+'c='+q+f+';f();_=1'+q+';if(window._);else if(c.length>339)eval(c)//'+x+'///'+x+n+n;console.log(y+z+z)};f();_=1";if(window._);else if(c.length>339)eval(c)//`///`

setTimeout
`c="function f(){x=String.fromCharCode(96);n=String.fromCharCode(10);q=String.fromCharCode(34);y='etTimeout=stTimeout=seTimeout=setimeout=setTmeout=setTieout=setTimout=setTimeut=setTimeot=setTimeou=unescape=>42;'+n;z='setTimeout'+n+x+'c='+q+f+';f();_=1'+q+';if(window._);else if(c.length>339)eval(c)//'+x+'///'+x+n+n;console.log(y+z+z)};f();_=1";if(window._);else if(c.length>339)eval(c)//`///`

नोट: एक अनुगामी न्यूलाइन है

मूल रूप से, पहली पंक्ति को सावधानीपूर्वक setTimeoutवैध कार्यों के सभी 'गलत विवरणों' का नाम बदलने के लिए बनाया गया है , ताकि यदि किसी चरित्र को setTimeoutएस कोड से हटा दिया जाए तो त्रुटि नहीं आएगी और अनचाही संस्करण चल सकता है। यह भी लिखा जाता है कि यदि किसी एक वर्ण को पहली पंक्ति से हटा दिया जाता है, तो कोई त्रुटि नहीं होगी और बाकी कोड अप्रभावित चल सकते हैं।

दूसरा और तीसरा ब्लॉक बिल्कुल बराबर हैं। यदि कोई पूरा होने के लिए दौड़ता है, _तो वह चर सेट करता है ताकि दूसरे को पता न चले कि वह क्वीन की नकल करेगा। यदि इनमें से कोई एक ब्लॉक त्रुटि करता है, तो यह दूसरे ब्लॉक को प्रभावित नहीं करता है क्योंकि इसे अतुल्यकालिक रूप से उपयोग किया जाता था setTimeout। त्रुटि के कारण _सेट नहीं किया जाएगा, इसलिए अन्य ब्लॉक सफलतापूर्वक समाप्त हो जाएगा। मुख्य कोड एक स्ट्रिंग में है, जिसे यह सुनिश्चित करने के लिए प्रत्येक ब्लॉक में लंबाई के लिए जांच की जाती है कि कोई निष्कासन नहीं था।

टेम्प्लेट स्ट्रिंग्स के अंत में कुछ टिप्पणियों के साथ अगली पंक्ति पर टेम्प्लेट स्ट्रिंग्स कोड को इरेट करने से बचाता है यदि टेम्पलेट स्ट्रिंग बनाने वाले बैकटिक्स में से एक को हटा दिया जाता है। यदि समाप्त होने वाली बैकटिक को हटा दिया जाता है, तो टेम्पलेट स्ट्रिंग को टिप्पणी में बैकटिक द्वारा समाप्त किया जाता है। यदि स्टार्टिंग बैकटिक को हटा दिया जाता है, तो सेटटाइमआउट का मूल्यांकन बिना कार्य किए गए फ़ंक्शन के रूप में किया जाता है (एक नो-ऑप) और कोड सेटटाइमआउट के बिना सामान्य रूप से चलता है। एक और टिप्पणी द्वारा अंतिम बैकटिक को शून्य कर दिया गया है।


आप क्या कहते हैं? आप इसे आज़माना चाहते हैं? और मत बोलो!

पूर्ण पेज मोड की सिफारिश की।

इनपुट बॉक्स पर ध्यान न दें, यह स्निपेट कोई इनपुट नहीं लेता है।

कोड से किसी एक वर्ण को हटाने का प्रयास करें!

यह विश्वास नहीं है? सामान्य कोड अभी भी काम करेगा (लेकिन यह नहीं होगा ...) कुछ इस तरह की कोशिश करो console.log(5)!

नोट: REPL सुविधा को अक्षम करने के लिए स्निपेट को थोड़ा संशोधित किया जाना था, इसलिए मैंने केवल इस उत्तर के लिए कई आउटपुट क्षमताओं को हटा दिया।

etTimeout=stTimeout=seTimeout=setimeout=setTmeout=setTieout=setTimout=setTimeut=setTimeot=setTimeou=unescape=>42;
setTimeout
`c="function f(){x=String.fromCharCode(96);n=String.fromCharCode(10);q=String.fromCharCode(34);y='etTimeout=stTimeout=seTimeout=setimeout=setTmeout=setTieout=setTimout=setTimeut=setTimeot=setTimeou=unescape=>42;'+n;z='setTimeout'+n+x+'c='+q+f+';f();_=1'+q+';if(window._);else if(c.length>339)eval(c)//'+x+'///'+x+n+n;console.log(y+z+z)};f();_=1";if(window._);else if(c.length>339)eval(c)//`///`

setTimeout
`c="function f(){x=String.fromCharCode(96);n=String.fromCharCode(10);q=String.fromCharCode(34);y='etTimeout=stTimeout=seTimeout=setimeout=setTmeout=setTieout=setTimout=setTimeut=setTimeot=setTimeou=unescape=>42;'+n;z='setTimeout'+n+x+'c='+q+f+';f();_=1'+q+';if(window._);else if(c.length>339)eval(c)//'+x+'///'+x+n+n;console.log(y+z+z)};f();_=1";if(window._);else if(c.length>339)eval(c)//`///`
<!--                               Try the test suite below!                              --><strong id="bytecount" style="display:inline; font-size:32px; font-family:Helvetica"></strong><strong id="bytediff" style="display:inline; margin-left:10px; font-size:32px; font-family:Helvetica; color:lightgray"></strong><br><br><pre style="margin:0">Code:</pre><textarea id="textbox" style="margin-top:5px; margin-bottom:5px"></textarea><br><pre style="margin:0">Input:</pre><textarea id="inputbox" style="margin-top:5px; margin-bottom:5px"></textarea><br><button id="testbtn">Test!</button><button id="resetbtn">Reset</button><br><p><strong id="origheader" style="font-family:Helvetica; display:none">Original Code Output:</strong><p><div id="origoutput" style="margin-left:15px"></div><p><strong id="newheader" style="font-family:Helvetica; display:none">New Code Output:</strong><p><div id="newoutput" style="margin-left:15px"></div><script type="text/javascript" id="golfsnippet">var bytecount=document.getElementById("bytecount");var bytediff=document.getElementById("bytediff");var textbox=document.getElementById("textbox");var inputbox=document.getElementById("inputbox");var testbtn=document.getElementById("testbtn");var resetbtn=document.getElementById("resetbtn");var origheader=document.getElementById("origheader");var newheader=document.getElementById("newheader");var origoutput=document.getElementById("origoutput");var newoutput=document.getElementById("newoutput");textbox.style.width=inputbox.style.width=window.innerWidth-50+"px";var _originalCode=null;function getOriginalCode(){if(_originalCode!=null)return _originalCode;var allScripts=document.getElementsByTagName("script");for(var i=0;i<allScripts.length;i++){var script=allScripts[i];if(script.id!="golfsnippet"){originalCode=script.textContent.trim();return originalCode}}}function getNewCode(){return textbox.value.trim()}function getInput(){try{var inputText=inputbox.value.trim();var input=eval("["+inputText+"]");return input}catch(e){return null}}function setTextbox(s){textbox.value=s;onTextboxChange()}function setOutput(output,s){output.innerHTML=s}function addOutput(output,data){output.innerHTML='<pre style="background-color:'+(data.type=="err"?"lightcoral":"lightgray")+'">'+escape(data.content)+"</pre>"}function getByteCount(s){return(new Blob([s],{encoding:"UTF-8",type:"text/plain;charset=UTF-8"})).size}function onTextboxChange(){var newLength=getByteCount(getNewCode());var oldLength=getByteCount(getOriginalCode());bytecount.innerHTML=newLength+" bytes";var diff=newLength-oldLength;if(diff>0){bytediff.innerHTML="(+"+diff+")";bytediff.style.color="lightcoral"}else if(diff<0){bytediff.innerHTML="("+diff+")";bytediff.style.color="lightgreen"}else{bytediff.innerHTML="("+diff+")";bytediff.style.color="lightgray"}}function onTestBtn(evt){origheader.style.display="inline";newheader.style.display="inline";setOutput(newoutput,"");setOutput(origoutput,"");var input=getInput();if(input===null){addOutput(origoutput,{type:"err",content:"Input is malformed. Using no input."});addOutput(newoutput,{type:"err",content:"Input is malformed. Using no input."});input=[]}doInterpret(getNewCode(),input,function(data){addOutput(newoutput,data)});doInterpret(getOriginalCode(),input,function(data){addOutput(origoutput,data)});evt.stopPropagation();return false}function onResetBtn(evt){setTextbox(getOriginalCode());origheader.style.display="none";newheader.style.display="none";setOutput(origoutput,"");setOutput(newoutput,"")}function escape(s){return s.toString().replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}window.alert=function(){};window.prompt=function(){};function doInterpret(code,input,cb){var workerCode=interpret.toString()+";function stdout(s){ self.postMessage( {'type': 'out', 'content': s} ); }"+" function stderr(s){ self.postMessage( {'type': 'err', 'content': s} ); }"+" function kill(){ self.close(); }"+" self.addEventListener('message', function(msg){ interpret(msg.data.code, msg.data.input); });";var interpreter=new Worker(URL.createObjectURL(new Blob([workerCode])));interpreter.addEventListener("message",function(msg){cb(msg.data)});interpreter.postMessage({"code":code,"input":input});setTimeout(function(){interpreter.terminate()},1E4)}setTimeout(function(){getOriginalCode();textbox.addEventListener("input",onTextboxChange);testbtn.addEventListener("click",onTestBtn);resetbtn.addEventListener("click",onResetBtn);setTextbox(getOriginalCode())},100);function interpret(code,input){_=undefined;window={};alert=function(s){stdout(s)};window.alert=alert;console.log=alert;prompt=function(s){if(input.length<1)stderr("not enough input");else{var nextInput=input[0];input=input.slice(1);return nextInput.toString()}};window.prompt=prompt;(function(){try{_=undefined;eval(code);if(typeof evalResult=="disabled_function_evaluation"){var callResult=evalResult.apply(this,input);if(typeof callResult!="undefined")stdout(callResult)}}catch(e){stderr(e.message)}})()};</script>

एक बेहतर व्याख्या आगामी है। इस बीच किसी भी टिप्पणी / प्रश्न / आलोचना के साथ चैट @jrich में मुझे पिंग करने के लिए स्वतंत्र महसूस करें!


आह ठीक है, वूप्स: |
डाउनग्रेड

4
के thisबजाय का उपयोग करें window
मामा फन रोल

3
अपने स्रोत कोड में जीवन के अर्थ को शामिल करने के लिए +1
साइओस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.