Rebmu : 79 वर्ण या (37 + लंबाई (p1) + 2 * अधिकतम (लंबाई (P2), लंबाई (p3)))
पहले मैं एक 79 अक्षर का समाधान दूंगा जो पूछता है कि आपको कौन सी भाषाएं सीखनी चाहिए? (एन्ट्रापी ४.०, ३० पत्र शामिल नहीं हैं ?
) और आपको रेबोल और [रेड] के सुझाव प्रदान करते हैं :
DD 11 DD :do dd {dd {p{Which languages must you learn?}qt}} pp{{[RReebdo]l}}
यहां उपलब्ध एक अनोखी युक्ति जो अन्य भाषाओं में नहीं है, इस तथ्य का लाभ उठाने से आती है कि घुंघराले ब्रेसिज़ एक असममित स्ट्रिंग सीमांकक हैं, जो कानूनी रूप से घोंसला बना सकते हैं:
my-string: {"It's cool," said {Dr. Rebmu}, "for MANY reasons--like less escaping."}
मुझे एक सामान्यीकृत समाधान तैयार करने दें, जो किसी भी प्रोग्राम पर आसानी से काम कर सकता है जो एस्केप सीक्वेंस का उपयोग नहीं करता है। 79 वर्ण संस्करण शॉर्टकट के लिए पर्याप्त सरल था, लेकिन प्रोग्राम पी 2 और पी 3 के लिए उचित रूप से मनमाने ढंग से प्रोग्राम स्रोत शामिल करने के लिए आपको पूर्ण टेम्पलेट की आवश्यकता होगी। अगर हमने इसका उपयोग किया होता, तो यह 87 वर्ण होते:
DD 11 DD :do dd {dd {p{Which languages must you learn?}qt}} ddoo{{pp{{[RReebdo]l}}}}
इस सामान्य रूप का उपयोग करने के लिए पैटर्न यह है कि अगर आपके पास चर लंबाई के अनुक्रमिक वर्णों के तीन स्रोत ग्रंथ हैं (चलो एक उदाहरण का उपयोग करें AAA
, जैसे ) BBBBB
, CCCCCCC
तो आप उन्हें कुछ के रूप में इनकोड कर सकते हैं:
DD 11 DD :do dd {dd {AAAqt}} ddoo{{BCBCBCBCBC C C}}
(ध्यान दें: हालांकि यह पैटर्न उन कार्यक्रमों पर ट्विक किए बिना काम नहीं करेगा जो एस्केप पात्रों का उपयोग करते हैं, यह एक घातक दोष नहीं है। ब्रेसिज़ द्वारा सीमांकित एक स्ट्रिंग में एक बेजोड़ बाएं ब्रेस प्राप्त करना कुछ इस तरह की आवश्यकता होती है {Foo ^{ Bar}
... लेकिन आप आसानी से फिर से लिखना कर सकते हैं कि उपयोग करना वैकल्पिक स्ट्रिंग संकेतन "Foo { Bar"
, और संयुक्त मामलों को एक साथ चिपके हुए के साथ प्रबंधित किया जा सकता है।
तो ... कैसे एक उदाहरण के बारे में? एक बार सामान्य रूप उपलब्ध होने के बाद, यह 573 चरित्र कार्यक्रम 3 पूर्व कोड गोल्फ समाधान से केवल कुछ मिनट में इकट्ठा किया गया था:
DD 11 DD: dd {dd {rj N 0% rN Wa1m2j S {\ x /} D00 Hc & [u [Ze? Wa Qs ~ rpKw [isEL00c [skQdc]] [eEV? KQ [tlQ]] pcSeg - b00 [b00] eZ 1 5] 3] prRJ [si ~ dSPscSqFHs] eZ 1 [s + dCa + wM2cNO]]] | Va | [mpAp2j] prSI ~ w { } LL2w Wl h01tiVsb01n -1 chRVs { } hLceVn01qt}} [sn [{N sbeo [tIt0l1eV} 0e5gXN1 01L {5s0} C {1} 0 {0 Do5f0 0bMe1e0r0} 0]]]: tMw9C9 न्यूमज़ Jl [paN + [KperlCJBn] [NoSwull] {के, जे} बी पी {। } lf EZ - - n [N m {G otothestoreandbuysome more}] {T akeonedownandpassitar ound} c B w P lf]]}}
यदि कोई अपनी पसंद की भाषा में उस कार्यक्रम को लिखने का प्रयास करना चाहता है, और सोचता है कि वे 573 को हरा सकते हैं, तो मुझे बताएं। यदि आप ऐसा करते हैं तो मैं आपको भारी मात्रा में प्रतिष्ठा प्रदान करूंगा - अपनी पसंद की भाषा मान लेना रेम्बु नहीं है, क्योंकि मुझे पता है कि वे कार्यक्रम न्यूनतम नहीं हैं। :-)
कि "बेकार" रिक्ति आपको अंत में मिलती है जब P2 और p3 असंतुलित लंबाई के होते हैं। लेकिन इस मामले में सभी 3 कार्यक्रम अलग-अलग आकार के हैं, इसलिए पी 2 / पी 3 के लिए चुनने के लिए एक विशेष अच्छी जोड़ी नहीं है। (मैंने इन्हें चुना क्योंकि इनपुट के रूप में कोई बाहरी डेटा नहीं था, जैसे भूलभुलैया या जो भी हो, नहीं कि वे समान लंबाई के थे। जबकि मैं नए प्रोग्राम लिख सकता था जो अधिक इष्टतम थे, मैंने पर्याप्त समय बिताया है और बिंदु था आपको नए कार्यक्रम लिखने की ज़रूरत नहीं है ...)
यह काम किस प्रकार करता है
(नोट: मैंने एक और "रचनात्मक" दृष्टिकोण के साथ शुरू किया था जो सुव्यवस्थित नहीं था लेकिन अधिक दिलचस्प-दिखने वाला था। मैंने इसे अपने ब्लॉग पर एक प्रविष्टि में स्थानांतरित कर दिया क्योंकि इस दृष्टिकोण का वर्णन करना पहले से ही लंबा है।)
यहां एक कुंजी कुछ अन्य प्रविष्टियों की तरह "स्ट्रिंग के रूप में eval कोड" प्रवंचना है, इसमें बस असममित स्ट्रिंग सीमांकक का तुरुप का पत्ता है। मैं 80 चरित्र के मामले के कामकाज की व्याख्या करके शुरू करूँगा।
इस मामले की पठनीयता के लिए व्हाट्सएप को समायोजित करते हुए, "संपूर्ण" कार्यक्रम यहां दिया गया है:
DD 11 ; assign 11 to dd (about to overwrite again)
DD :do ; make dd a synonym for DO (a.k.a. "eval")
; eval a string as source code that ends with QUIT (QT)
dd {dd {p{Which languages must you learn?}qt}}
; we'll never get here, but whatever's here must be legally parseable
pp{{[RReebdo]l}}
यहाँ हम डीडी को एक पर्यायवाची के रूप में स्थापित करते हैं (aka "eval")। लेकिन चाल यह है कि जब आधा कार्यक्रम चलते हैं, तो वे रनिंग कोड को हवा देते हैं जिसका एकमात्र प्रभाव डी को हानिरहित शाब्दिक 1 में परिभाषित करना है।
यहां बताया गया है कि विषम-वर्ण कोड क्या है, व्हॉट्सएप फिर से समायोजित किया गया है:
D 1 ; assign 1 to d
D d ; assign d to itself, so it's still 1
d ; evaluates to integer, no side effect
{d pWihlnugsms o er?q} ; string literal, no side effect
p {Rebol} ; print "Rebol"
और यहाँ भी समान वर्ण है:
D 1 ; assign 1 to d
D:od ; URL-literal (foo:...), no side effect
d ; evaluates to integer, no side effect
{{hc agae utyulan}t} ; string literal (well-formed!), no side effect
p {[Red]} ; print "[Red]"
यह वास्तव में ऐसा मामला है कि गैर-आधा कार्यक्रम के लिए, dd {dd {(arbitrary code)qt}}
आप जो भी कोड चाहते हैं उसे निष्पादित करेंगे। हालांकि, केवल एक के बजाय मूल्यांकन करने के लिए दो कॉल हैं। ऐसा इसलिए है क्योंकि इंटरेस्टेड कोड में नेस्टेड ब्रेसेस शानदार काम करते हैं, वे डीओ के स्पष्ट व्यवहार को गड़बड़ कर देते हैं। इसलिये:
do {{print "Hello"}}
स्ट्रिंग को एक प्रोग्राम के रूप में लोड करेगा, लेकिन वह प्रोग्राम केवल स्ट्रिंग स्थिर होने के लिए हवा देता है {print "Hello"}
। इस प्रकार मैं यहां जिस ट्रिक का उपयोग करता हूं, वह मेरा डीडी (डीओ के समान फ़ंक्शन मान को पकड़े हुए) है और इसे दो बार चलाएं। हालेवर्स स्ट्रिंग के विभिन्न भागों में चबाते हैं, लेकिन वे दोनों को नहीं चबाते हैं यदि सामग्री के लिए सम / विषमता सही है, और क्योंकि हेजिंग के बाद स्ट्रिंग के बाहर जो बचा है वह सिर्फ अभिन्न निरंतर है जो d
वे हानिरहित हैं।
इस पैटर्न के साथ कार्यक्रम के व्यवहार को लिखने में कोई चुनौती नहीं है जब यह आधा में नहीं काटा जाता है - आप कुछ भी डाल सकते हैं जब तक कि कोड की वर्ण लंबाई भी समान हो (विषम यदि आप क्यूटी की गिनती कर रहे हैं, जो कि क्वेट है)। यदि आपको विषम संख्या से समान संख्या प्राप्त करने की आवश्यकता है, तो एक स्थान पर फेंक दें (इसलिए पी 1 पर विषम कार्यक्रम लंबाई पी 1 पर मेरे सूत्र में वास्तव में +1 है) । ट्रिक उस इंटरलेस्ड कोड को बाद में लिखती प्रतीत होगी, जिसे पार्सर को पास करना होगा यदि इसे आधा नहीं किया गया है। (इसे क्यूटी के कारण नहीं चलाया जाएगा, लेकिन इसे निष्पादित करने से पहले इसे लोड किया जाना होगा।)
यह मामला तुच्छ है; pp
भले ही अपरिभाषित हो, एक प्रतीक के रूप में ठीक लोड होता है, और p
प्रत्येक आधे कार्यक्रम में प्रिंट के लिए विभाजित होता है । लेकिन हम फिर से एक स्ट्रिंग शाब्दिक का उपयोग करके एक और चाल कर सकते हैं। आधा कार्यक्रम अभी भी सामान्य रूप से परिभाषित किया गया है, इसलिए हम यह भी कह सकते हैं:
ddoo{{pp{{[RReebdo]l}}}}
पूरे मामले में पार्सर द्वारा उठाया गया एकमात्र हिस्सा होने से प्रतीकात्मक शब्द ddoo
और एक स्ट्रिंग शाब्दिक हो सकता है, फिर हम उस स्ट्रिंग शाब्दिक के अंदर हम जो भी दो कार्यक्रम चाहते हैं उन्हें इंटरलेवे कर सकते हैं और पार्सर को क्रोधित नहीं कर सकते हैं। आधा संस्करण केवल कहेंगे:
do{p{Rebol}}
..तथा...
do{p{[Red]}}
जैसा कि मैं कहता हूं, यह भाग अन्य समाधानों से परिचित है जो कार्यक्रमों को तार के रूप में मानते हैं और उन्हें निकालते हैं। लेकिन प्रतियोगिता के मामले में, जब आप जो प्रोग्राम पैक कर रहे हैं, उसमें नेस्टेड स्ट्रिंग्स होते हैं, जो उनके लिए रिंच में फेंकता है। यहां केवल वही चीजें हैं जो आपको परेशानी में डालती हैं, कैरेट्स ( ^
) के माध्यम से भागने का उपयोग किया जाता है ... जिसे आसानी से चारों ओर काम किया जा सकता है।
(छोटा 'धोखा' नोट: मैंने इस समस्या के जवाब में "QUIT" के लिए qt को जोड़ा। वास्तव में, मैंने उद्देश्यपूर्ण तरीके से पहले छोड़ने के लिए संक्षिप्त नाम हटा दिया था ... क्योंकि किसी तरह मैंने सोचा था कि यह केवल कंसोल उपयोग के लिए अच्छा था और सिर्फ ऊपर ले रहा था। दो-अक्षर का स्थान अगर यह एक REPL में नहीं था। मैं इसे जोड़ रहा हूं क्योंकि मुझे लगता है कि मैं गलत था, विशेष रूप से इस मामले के लिए नहीं जोड़ रहा। फिर भी, उस परिवर्तन से पहले यह 2 वर्णों से अधिक लंबा होगा। जब मैंने पहली बार समाधान पोस्ट किया था, तो रेम्बु में एक बग था जिसने इसे वास्तव में काम करने से रखा, भले ही यह होना चाहिए ... अब यह काम करता है।)
x0=00;;
। बड़ी चुनौती!