भाव-सुरक्षित भाव


17

आपका कार्य सरल है: एक प्रोग्राम (या फ़ंक्शन) लिखें जो कोई इनपुट नहीं लेता है और इसके स्रोत कोड को आउटपुट (या रिटर्न) लेता है। पकड़ यह है कि जब प्रोग्राम "quotes"(यूनिकोड वर्ण 34) में लपेटा जाता है , तो उसे फिर से (अब उद्धृत) स्रोत कोड आउटपुट करना चाहिए।

खदानों के लिए मानक नियम लागू होते हैं। ये है , इसलिए सबसे छोटा कार्यक्रम (बाइट्स में) जीतता है।


8
@ATaco रचनात्मक रूप से सोचते हैं। उद्धरण में कोड सामान्य रूप से निष्पादित नहीं कर रहा है, लेकिन जब पूरे कार्यक्रम उद्धरण से घिरा हुआ है उन वर्गों रहे हैं मार डाला।
पावेल

1
हम्म, गुड पॉइंट।
ATaco

यह बीएफ के साथ काम कर सकता है जो कि समर्थन पर लागू होता है !...
फल

1
आप का उपयोग करना चाहिए "? कुछ भाषाएं दो या तीन उद्धरण वर्णों का समर्थन करती हैं।
नील

1
@tkellehe मेटा: एक उचित क्वीन के रूप में क्या मायने रखता है? जहां तक ​​मैं आपकी 1-बाइट क्वीन को समझता हूं, यह उच्चतम मत वाली पोस्ट में तैयार किए गए कोड / डेटा की आवश्यकता का उल्लंघन करता है।
लैकोनी

जवाबों:


4

नूडल , 9 7 बाइट्स

यह संस्करण अन्य की तरह ही काम करता है, बस मैं यह भूल गया था कि नूडल में एक बार कोड ब्लॉक करने का तरीका है और मैंने भाषा बनाई ...

Ḷ1ḥ-Ð1ḥ@€

ḷḥ-Ðḥ@ḅ

कोशिश करो:)


यह काम किस प्रकार करता है

ḷḥ-Ðḥ@ḅ # Single statement that builds itself as a string.
ḷ       # Loop the following block of code unconditionally.
 ḥ-     # Push the string literal of the token preceding this one which pushes "ḷ" onto the stack.
   Ð    # Push the stack as an array to stdout (since is an array it is done by reference).
    ḥ@  # Push the string literal for this block of code which pushes "ḥ-Ðḥ@ḅ" onto the stack.
      ḅ # Break out of the given loop. (The stack is now ["ḷ", "ḥ-Ðḥ@ḅ"]).

        # The top of the stack is popped off and displayed which modifies the array to produce {["ḷ"], "ḥ-Ðḥ@ḅ"} in stdout.

बोली-सुरक्षा

रखने "से पहले और कार्यक्रम काम करता है क्योंकि के बाद चरित्र Noodel मैं क्या कॉल करने के लिए समर्पित पात्रों में से का एक सेट है printables । इन्हें तुरंत स्ट्रिंग शाब्दिक के रूप में रखा जाता है जब स्वयं द्वारा रखा जाता है और स्क्रीन पर आसानी से कुछ प्रिंट करने की अनुमति देता है। इसलिए अधिकांश भाषाओं के विपरीत, नूडेल सामान्य ASCII सेट को देखता है, जिसे प्रिंट योग्य माना जाता है, सीधे स्ट्रिंग शाब्दिक के रूप में (अंतरिक्ष और लाइन फ़ीड को छोड़कर) कोड के हवाले से केवल स्ट्रिंग पर जोर देने के रूप में देखा जाता है।

"ḷḥ-Ðḥ@ḅ"

"         # Pushes on the string literal "\"" onto the stack.

 ḷḥ-Ðḥ@ḅ  # Same execution as before, simply builds the Quine for this loop.
 ḷ        # Loop the following block of code unconditionally.
  ḥ-      # Push the string literal of the token preceding this one which pushes "ḷ" onto the stack.
    Ð     # Push the stack as an array to stdout (since is an array it is done by reference).
     ḥ@   # Push the string literal for this block of code which pushes "ḥ-Ðḥ@ḅ" onto the stack.
       ḅ  # Break out of the given loop. (The stack is now ["\"", "ḷ", "ḥ-Ðḥ@ḅ"]).

        " # Pushes on the string literal "\"" onto the stack.

          # The top of the stack is popped off and displayed which modifies the array to produce {["\"", "ḷ", "ḥ-Ðḥ@ḅ"], "\""} in stdout.

"कोशिश करो:)"


स्निपेट्स

<div id="noodel" code='ḷḥ-Ðḥ@ḅ' input="" cols="10" rows="1"></div>
<script src="https://tkellehe.github.io/noodel/noodel-latest.js"></script>
<script src="https://tkellehe.github.io/noodel/ppcg.min.js"></script>


<div id="noodel" code='"ḷḥ-Ðḥ@ḅ"' input="" cols="10" rows="1"></div>
<script src="https://tkellehe.github.io/noodel/noodel-latest.js"></script>
<script src="https://tkellehe.github.io/noodel/ppcg.min.js"></script>


मुझे नहीं लगता कि उपयोग eकरना मान्य है। प्रश्न बाइट 34 के रूप में एन्कोड किए गए चरित्र के लिए नहीं पूछता है, लेकिन यूनिकोड चरित्र 34 के लिए। कोई फर्क नहीं पड़ता कि आप किस एन्कोडिंग का उपयोग करते हैं, केवल एक ही है:"
डेनिस

@ डेनिस, मैं अनुमान लगा रहा हूं कि आप जो कह रहे हैं, वह यूनिकोड चरित्र 34 का संदर्भ है, यह सुनिश्चित करने के लिए कि हर कोई उसी का उपयोग कर रहा था "? (क्षमा करें, बस यह सुनिश्चित करने की कोशिश कर रहा हूं कि मैं समझ रहा हूं कि आप क्या कह रहे हैं) साथ ही, क्या मुझे उत्तर में उपयोग किए जाने वाले सभी पाठों को हटा देना चाहिए e?
tkellehe

1
हां, हजारों एनकोडिंग हैं, लेकिन केवल एक यूनिकोड वर्ण सेट है। चूंकि "काम करता है, मैं सिर्फ चर्चा को हटा दूंगा और बस उपयोग करूंगा "
डेनिस

11

पायथन 2 3, 181 152 130 124 122 बाइट्स

""" """>" "or exec("oct=0");p='"""" """>" "or exec("oct=0");p=%r;a=oct==0;print(p[a:~a]%%p)#".';a=oct==0;print(p[a:~a]%p)#

इसे ऑनलाइन आज़माएं!TIO एक हेडर और फुटर के साथ आता है जो स्वचालित रूप से क्वीन की वैधता का परीक्षण करता है। आप उन्हें केवल क्वीन चलाने के लिए साफ़ कर सकते हैं।

यह कोड पायथन में ट्रिपल-उद्धृत स्ट्रिंग्स का उपयोग करके काम करता है। """ """के बराबर है ' 'और """" """बराबर है'" '

कोड का उपयोग करता है exec, लेकिन डेटा को कोड के रूप में निष्पादित करने के "गैर-क्वीन" तरीके के लिए नहीं, बस एक अभिव्यक्ति के अंदर से एक चर सेट करने के लिए। execठीक से, भी डेटा में एन्कोड किया गया है।

पहला कथन स्ट्रिंग की तुलना करता है, संभवतः एक उद्धरण के साथ " ", चर के octअनुसार , और सेट करता है । (चर किसी भी छोटे से बनाया गया हो सकता है।)

फिर बाकी कोड %rस्ट्रिंग फॉर्मेटिंग का उपयोग करके पारंपरिक पायथन क्वीन को लागू करता है , कुछ अतिरिक्त कोड के साथ जो अतिरिक्त उद्धरण स्ट्रिप्स यदिoct को अपरिवर्तित करता है।

"चीटी" का उपयोग करने वाला एक वैकल्पिक संस्करण exec126 बाइट्स में कम दोहराया कोड के साथ आता है:

""" """>" "and exec("oct=0");s='"""" """>" "and exec("oct=0");s=%r;p=%r;exec(p)#".';p='a=oct!=0;print(s[a:~a]%(s,p))';exec(p)#

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


7

स्टैंडर्डएमएल , 182 176 108 बाइट्स

";str(chr 34)^it;(print(it^it);fn x=>print(x^it^x^it))";str(chr 34)^it;(print(it^it);fn x=>print(x^it^x^it))

निर्विरोध संस्करण: कोडिंगग्राउंड पर इसे आज़माएं।
उद्धृत संस्करण: कोडिंग ग्राउंड पर इसे आज़माएं।

ध्यान दें कि आउटपुट कुछ इस तरह दिखता है

> val it = "{some string}" : string
> val it = "{some string}" : string
{output to stdout}> val it = fn : string -> unit

क्योंकि कोड घोषणा द्वारा व्याख्या की गई है (प्रत्येक ; एक घोषणा समाप्त होती है) और प्रत्येक घोषणा के मूल्य और प्रकार को दर्शाता है।


पृष्ठभूमि

SML में फॉर्म की एक क्वीन है <code>"<code in quotes>":

str(chr 34);(fn x=>print(x^it^x^it))"str(chr 34);(fn x=>print(x^it^x^it))" 

और फॉर्म में एक "<code in quotes>"<code>:

";str(chr 34)^it;print(it^it)";str(chr 34)^it;print(it^it)

दोनों इस तथ्य पर भरोसा करते हैं कि <code>-पार में कोई उद्धरण नहीं है और इस प्रकार कुछ भी बचने की आवश्यकता के साथ उद्धृत किया जा सकता है, ए" क्वीन के उत्पादन के आवश्यक है str(chr 34)

वे निहित पहचानकर्ता पर भी बहुत भरोसा करते हैं it जिसका उपयोग तब किया जाता है जब किसी घोषणा में कोई स्पष्ट पहचानकर्ता नहीं दिया जाता है।

पहले क्वीन में स्ट्रिंग युक्त str(chr 34);बांधता itहै ", fn x=>एक अनाम फ़ंक्शन शुरू करता है एक तर्क लेता है x, फिर x^it^x^itपरिणामी स्ट्रिंग को समेटता है और प्रिंट करता है। यह अनाम फ़ंक्शन सीधे प्रोग्राम कोड वाले स्ट्रिंग पर लागू किया जाता है, इसलिए समवर्ती x^it^x^itपैदावार<code>"<code>"

दूसरी क्विन स्ट्रिंग के रूप में सिर्फ प्रोग्राम कोड से शुरू होती है ";str(chr 34)^it;print(it^it)";जो कि बाध्य है it। फिर str(chr 34)^it;स्ट्रिंग की शुरुआत के लिए एक उद्धरण को व्यक्त करता है और फिर से कोई स्पष्ट पहचानकर्ता नहीं दिया जाता है, जिसके परिणामस्वरूप स्ट्रिंग "<code>बाध्य है it। अंत में print(it^it)पैदावार के साथ स्ट्रिंग को समेटता है"<code>"<code> करता है जो फिर मुद्रित होता है।


व्याख्या

संपादित करें: अब 108-बाइट संस्करण के साथ अद्यतित नहीं है, हालांकि कोई भी इस स्पष्टीकरण को पढ़ने के बाद भी इसे समझ सकता है।

उद्धरण-सुरक्षित quine उपरोक्त दोनों दृष्टिकोणों को जोड़ता है और स्वयं प्रपत्र का है "<code>"<code>। इसे फिर से उद्धरण पैदावार में डालते हैं ""<code>"<code>", इसलिए हमें एक खाली स्ट्रिंग मिलती है और फिर दूसरे रूप की एक रानी।

इसका मतलब है कि प्रोग्राम को "<code>पहचानकर्ता द्वारा फार्म में अपना स्रोत दिया जाता है it, या itबस है "और हमें अपने स्वयं के स्रोत <code>को तर्क के रूप में दिया जाता है और इस प्रकार एक फ़ंक्शन होना चाहिए जो इस तरह के तर्क को संभालता है।

(if size it>1then(print(it^it);fn _=>())else fn x=>print(it^it^x^it^x^it))

में जो मामले हम कर रहे हैं की पहचान करने के लिए, हम जाँच करें कि क्या के आकार it1. से बड़ा तो नहीं है तो itहै "और हम दूसरे मामले में हैं, इसलिए elseभाग रिटर्न एक गुमनाम समारोह fn x=>print(it^it^x^it^x^it)जो तब कहा जाता है क्योंकि स्ट्रिंग के रूप में स्रोत से इसकी पीछा । ध्यान दें अग्रणीit^it^कार्यक्रम की शुरुआत में खाली स्ट्रिंग के लिए जो ।

यदि size it1 से बड़ा है तो हम-इन में हैं thenऔर सिर्फ प्रदर्शन करेंगे print(it^it), है ना? बिल्कुल नहीं, क्योंकि मैंने आपको यह बताने में उपेक्षा की है कि एसएमएल दृढ़ता से टाइप किया गया है जिसका अर्थ है कि एक सशर्त if <cond> then <exp_1> else <exp_2>हमेशा एक ही प्रकार का होना चाहिए, जिसका अर्थ है कि अभिव्यक्ति <exp_1>और <exp_2>उसी प्रकार का होना चाहिए। हम पहले से ही elseभाग के प्रकार को जानते हैं : एक अनाम फ़ंक्शन जो एक स्ट्रिंग लेता है और फिर कॉल printका प्रकार होता है string -> <return type of print>, और printइसमें टाइप होता है string -> unit( unitकिसी तरह voidअन्य भाषाओं में), इसलिए परिणामी प्रकार फिर से है string -> unit

तो अगर thenहिस्सा सिर्फ print(it^it)टाइप का होता है unit, तो हमें टाइप मिसमैच एरर मिलेगा। तो कैसा रहेगा fn _=>print(it^it)? ( _एक तर्क के लिए एक वाइल्डकार्ड है जिसका उपयोग नहीं किया जाता है) अपने स्वयं के अनाम फ़ंक्शन में वह प्रकार होता है 'a -> unitजहां 'aएक मनमाना प्रकार होता है, इसलिए हमारी स्थिति के संदर्भ में जो एक string -> unitप्रकार को लागू करता है जो यह काम करेगा। (प्रकार चर प्रकार के 'aसाथ त्वरित हो जाता है string।) हालांकि, इस मामले में हम कुछ भी नहीं छापेंगे क्योंकि अनाम फ़ंक्शन कभी नहीं कहा जाता है! याद रखें, जब हम then-आर्ट में जाते हैं तो समग्र कोड होता है"<code>"<code> , इसलिए<code> -पार्टर एक फ़ंक्शन का मूल्यांकन करता है, लेकिन जैसा कि इसके बाद कुछ भी नहीं आता है, इसे नहीं कहा जाता है।

इसके बजाय हम एक sequentialisation जो रूप है का उपयोग (<exp_1>; ...; <exp_n>)जहां <exp_1>के लिए <exp_n-1>मनमाने ढंग से प्रकार और प्रकार हो सकता है की <exp_n>पूरे sequentialisation के प्रकार प्रदान करता है। एक कार्यात्मक दृष्टिकोण से, मूल्यों <exp_1>को <exp_n-1>हमेशा के लिए त्याग दिया जाता है, हालांकि SML अनिवार्य निर्माणों का भी समर्थन करता है, इसलिए अभिव्यक्तियों के दुष्प्रभाव हो सकते हैं। संक्षेप में, हम -part के (print(it^it);print)रूप में लेते हैं then, इस प्रकार पहले मुद्रण करते हैं और फिर फ़ंक्शन को वापस करते हैं printजिसमें सही प्रकार होता है।


7

वी , 27 , 23 बाइट्स

éPñi"éP241"qpá"lxx|xÿ

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

चूँकि इसमें कुछ अनपेक्षित वर्ण हैं, यहाँ एक पठनीय संस्करण है:

éPñi"éP<C-v>241<esc>"qpá"lxx|xÿ

और यहाँ एक हेक्सडंप है:

00000000: e950 f169 22e9 5016 3234 311b 2271 70e1  .P.i".P.241."qp.
00000010: 226c 7878 7c78 ff                        "lxx|x.

तो सबसे पहली बात हमें यह निर्धारित करना है कि क्या पहला चरित्र एक उद्धरण है। éPएक 'P' वर्ण सम्मिलित करता है, लेकिन "éPएक NOOP है। उसके बाद, हम मानक विस्तार योग्य क्वीन पर एक मामूली संशोधन चलाते हैं, जो है:

ñi<C-v>241<esc>"qpÿ

हम इसे थोड़ा अलग तरीके से करने जा रहे हैं। सबसे पहले हमें "éP" पाठ को सम्मिलित करना होगा। तो हम करते हैं

ñ                        " Start recording into register 'q'
 i                       " Enter insert mode
  "éP<C-v>241<esc>       " Enter the following text: '"éPñ'
                  "qp    " Paste the text in register 'q'
                     á"  " Append a '"'

यहाँ वह जगह है जहाँ शाखाकरण होता है। वर्तमान में बफर में पाठ है

"éPñi"éP<C-v>241<esc>"qpá"P
Cursor is here ----------^

जब तक हम इसे उद्धरण में नहीं लपेटते, उस स्थिति में 'P' कभी भी सम्मिलित नहीं होगा, और बफर है:

"éPñi"éP<C-v>241<esc>"qpá"
Cursor is here ----------^

चूंकि हम अभी भी रिकॉर्डिंग कर रहे हैं, हम यहां जो कुछ भी चाहते हैं वह कर सकते हैं, और ऐसा होने पर बफर में जुड़ जाएगा "qp। तो यहाँ से यह बहुत आसान है के लिए सशर्त रूप से उद्धरण हटाएं:

l           " Move one character to the right. If there is no character to the right, 
            " then this is effectively a "break" statement, stopping playback of the recording
 xx         " Delete two characters (the '"P')
   |        " Move to the first character on this line
    x       " Delete one character
     ÿ      " End the program

3

जावास्क्रिप्ट (ईएस 6), 239 237 बाइट्स

Set=``;eval(";a='Set=``;eval(~;a=1;S=String.fromCharCode;q=S(34);r=Set&&q;s=S(39);alert(r+a.replace(/[^ -}]/g,q).replace(1,s+a+s)+r);~)';S=String.fromCharCode;q=S(34);r=Set&&q;s=S(39);alert(r+a.replace(/[^ -}]/g,q).replace(1,s+a+s)+r);")

ध्यान रखें कि प्रत्येक संस्करण को नए वातावरण में आज़माएं (जैसे, एक नया ब्राउज़र टैब)

इसे सरल बनाने के लिए कम से कम एक तरीका होना चाहिए ...


1
मुझे लगता है कि आप इस तरह की जगह के लिए एक सरणी का उपयोग कर सकते हैं: [x = "प्रतिस्थापित"]। चीजों को तोड़ सकता है, हालांकि, मैं बहुत अनुभवी नहीं हूँ ...
ल्यूक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.