इंटरवाइविंग क्वीन बनाओ


17

आपका कार्य एक ऐसा प्रोग्राम बनाना है, जो जब चलता है, तो आउटपुट के रूप में खुद को लौटाता है (यह एक क्वीन के रूप में जाना जाता है)। हालाँकि, यह क्वीन, जब इसे कॉपी किया जाता nहै, तो क्वीन को लौटाता है, लेकिन इसके प्रत्येक पात्र के साथ जगह nसमय में दोहराई जाती है , जहां nएक सकारात्मक पूर्णांक होता है।

यदि आपका मूल कार्यक्रम है Derp:

Derp -> Derp (must return itself as output to be a quine)

DerpDerp -> DDeerrpp
(the "Derp" is copied twice, so each character in the output has to be copied twice)

DerpDerpDerp -> DDDeeerrrppp
etc. etc.

ध्यान रखें कि आपको अपने "आधार" कार्यक्रम में व्हॉट्सएप की अनुमति है, लेकिन "इंटरव्यूइंग" के समय उन्हें गिना जाता है। बोलो तुम्हारा कार्यक्रम है

Derp 
{newline}

(न्यूलाइन एक अनुगामी न्यूलाइन को दर्शाता है, और इसके बाद एक अतिरिक्त स्थान है Derp)। जब बनने के लिए दोहराया गया

Derp 
Derp 
{newline}

आपको आउटपुट चाहिए

DDeerrpp  
{newline}
{newline}

ध्यान रखें कि इसके 2बाद अतिरिक्त स्थान हैंDDeerrpp

नियम और विनिर्देश:

  • आपके प्रोग्राम में कम से कम दो अलग-अलग वर्ण होने चाहिए (जिसका अर्थ है कि आपका कोड कम से कम 2 बाइट्स लंबा होना चाहिए)।
  • मानक क्वीन नियम लागू होते हैं।

यह , इसलिए बाइट्स जीत में सबसे छोटा कोड है!


1
"मानक नियम लागू होते हैं" - क्या इसका मतलब स्रोत कोड को पढ़ना नहीं है?
FlipTack

@FlipTack इसका मतलब यह है कि - अधिक जानकारी के लिए लिंक पढ़ें।
क्लिस्मिक्स

जवाबों:


12

विखंडन , 6 बाइट्स

'!+OR"

इसे ऑनलाइन आज़माएं! दो प्रतियों की कोशिश करो! तीन कोशिश करो!

व्याख्या

यह सिर्फ Fission standard quine है । यह इस चुनौती के लिए काम करता है, क्योंकि विखंडन में कार्यक्रम में स्पष्ट प्रवेश बिंदु हैं। विशेष रूप से, प्रोग्राम को डुप्लिकेट करके, हम एक और जोड़ते Rहैं जो एक और परमाणु (निर्देश सूचक) जोड़ता है। चूंकि स्रोत कोड टॉरॉयडल है, इसलिए निष्पादित प्रभावी कोड अन्यथा नहीं बदलता है - प्रत्येक परमाणु के लिए, कोड अभी भी स्थानीय रूप से समान दिखता है। हालांकि, परमाणुओं को लॉक स्टेप में निष्पादित किया जाता है, ताकि वे जो चीजें प्रिंट करते हैं, वे इंटरलेयर्ड हो और हमें आउटपुट में प्रत्येक वर्ण की एक अतिरिक्त प्रतिलिपि मिलती है।

पूर्णता की खातिर मैं जल्द ही दोहराऊंगा कि कार्यक्रम कैसे काम करता है। भले ही हम कार्यक्रम दोहराएं या नहीं (उदाहरण के लिए '!+OR"'!+OR"'!+OR"), प्रत्येक परमाणु निम्नलिखित कोड देखता है:

R"'!+OR"'!+O

"टॉगल स्ट्रिंग मुद्रण मोड, ताकि कार्यक्रम मुद्रण से शुरू होता है '!+ORSTDOUT, सभी बोली को छोड़कर Quine की है जो करने के लिए सीधे। फिर '!परमाणु के द्रव्यमान को वर्ण के कोड में सेट करता है !, +इसे बढ़ाता है, जो देता है ", और Oपरमाणु को नष्ट करते हुए इसे प्रिंट करता है। कार्यक्रम तब समाप्त होता है, क्योंकि कोई परमाणु नहीं बचे हैं।


11

पायथन 2.7, 377 310 304 194 191 बाइट्स!

यह मेरा पहला गोल्फ है, इसलिए मुझे उम्मीद नहीं थी कि यह बहुत अच्छा होगा। लेकिन मुझे लगा कि जिस समाधान के साथ मैं आया था उसमें अवधारणा कुछ मज़ेदार थी, इसलिए मैं इसे वैसे भी पोस्ट कर रहा हूं।

def f():
 import threading as T,inspect as i;global t,a,i
 try:t.cancel()
 except:a=0
 a+=1;t=T.Timer(1,d);t.start()
def d():print''.join(c*a for c in i.getsource(f)+i.getsource(d)+"f()")
f()

वास्तव में, यह एक विचित्रता है; आप इसे यहाँ आज़मा सकते हैं । यह निरीक्षण मॉड्यूल को बहुत मुश्किल से गाली देता है।

यदि हम इसे समान स्रोत कोड x2 के साथ चलाने का प्रयास करते हैं, तो हमें सही आउटपुट भी मिलता है; आप यहाँ कोशिश कर सकते हैं । x3, x4, आदि सभी अपेक्षा के अनुरूप काम करते हैं।

स्पष्टीकरण के साथ अपुष्ट:

def f():                                   # Defines a central function f
    import threading as T,inspect as i     # Imports threading and inspect
    global t,a,i                           # Global vars
    try:
        t.cancel()                         # Tries to cancel Timer from previous code
    except:
        a = 0                              # Reached when code is 1st copy; initializes a.
    a += 1                                 # a++; this is the number of copies thus far.
    t = T.Timer(1,d)               # Creates, then starts a timer to call function
    t.start()                              # d in 1 second.

def d():                                   # Prints out the source code; the quine part.
    print''.join(c*a for c in i.getsource(f)+i.getsource(d)+"f()")

f()                                        # Calls f()!

क्या यह एक धोखा देने वाली रानी नहीं है, क्योंकि यह अपने स्वयं के कार्यों के स्रोत कोड का उपयोग करके पढ़ती है inspect? ( संबंधित मेटा पोस्ट देखें )। PPCG पर हमारे पास विशिष्ट परिभाषाएँ हैं जो एक वैध को वैध बनाती हैं, और 'स्रोत को पढ़ना' को आमतौर पर धोखा माना जाता है।
फ्लिपकैक

@FlipTack मुझे यकीन नहीं है कि फ़ंक्शन का निरीक्षण करना स्रोत कोड पढ़ने के समान है। जावास्क्रिप्ट और स्टैक-आधारित भाषाओं में यह हर समय होता है।
डेनिस

ठीक है :)। मैंने आपके पोस्ट के लिए वाक्य रचना हाइलाइटिंग जोड़ा है। थ्रेडिंग का उपयोग करके अच्छा विचार!
18 दिसबंर को

import threading,inspect as iहो सकता हैimport threading as T,inspect as i
nedla2004

@FlipTack उप्स, धन्यवाद।
कालकोम डिक

3

CJam , 19 बाइट्स

{]W=s"_~"+T):Te*}_~

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

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

{               }_~  Define an anonymous code block (function).
                 _~  Push a copy, and execute the copy.
 ]W=                 Wrap the entire stack in an array and select its last element.
                     This discards whatever was on the stack before the original
                     code block, which is needed for subsequent iterations.
    s"_~"+           Cast the code block to string, push "_~", and concatenate.
                     This pushes the stringified source code on the stack.
          T):T       Push T (initially 0), increment it, and save the result in T.
              e*     Repeat each character in the stringified source code T times.

क्या ... कैसे ... इतनी जल्दी ... कृपया कोड की व्याख्या करें, इसलिए आप मुझे सीजेएम के तरीके सिखा सकते हैं।
क्लिस्मिक्स

@ Qwerp-Derp मैंने एक स्पष्टीकरण जोड़ा है।
डेनिस

3

RProgN , 66 बाइट्स

महत्वपूर्ण व्हॉट्सएप मेरी मौत है

[ "[ %q ] F 0 1 + `0 = `. { 0 m } R " ] F 0 1 + `0 = `. { 0 m } R 

व्याख्या की

[ "[ %q ] F 0 1 + `0 = `. { 0 m } R " ] F 0 1 + `0 = `. { 0 m } R   #
[                                                                   # Pop whatever is already on the stack, if anything.
  "[ %q ] F 0 1 + `0 = `. { 0 m } R "                               # This string contains basically the entire function.
                                      ] F                           # ] F duplicates the string, and then F formats it, which in this case puts the first string into the second at %q, surrounded by qoutes.
                                          0 1 + `0 =                # I needed an Incrementer, so I chose 0. 0, is conveniently, pre initilized at 0. And because RProgN is horrifying, you can remap the number functions as they're just more variables. So this increments 0 every time the group is called.
                                                     `. { 0 m } R   # Replace each character with itself repeated '0' times. Because '0' is an incrementer, each time the script is called, the amount of times the characters are repeated increase.

अच्छा भगवान मैं एक राक्षस हूँ ...

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


हालांकि, ~["[%q]F01+`0=`.{0m}R"]F01+`0=`.{0m}Rआम तौर पर ठीक काम करता है, यह एक वैध समाधान नहीं है, क्योंकि ZSS मार्कर को दोहराने का कोई तरीका नहीं है।
ATaco


2

पायथन 3 , 122 121 112 बाइट्स

s='try:from atexit import*;n+=1\nexcept:n=1;register(lambda:[print(end=c*n)for c in"s=%r;exec(s);"%s])';exec(s);

इसे ऑनलाइन आज़माएं: एक प्रति | दो प्रतियाँ | तीन प्रतियाँ | चार प्रतियाँ, स्वचालित सत्यापन के साथ

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

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

स्ट्रिंग s के माध्यम से निष्पादित कोड निम्नलिखित है।

try:from atexit import*;n+=1
except:n=1;register(lambda:[print(end=c*n)for c in"s=%r;exec(s);"%s])

पहली पंक्ति बिना शर्त आयात करती है atexit मॉड्यूल है, जो हमें एक निकास हैंडलर रजिस्टर करने के लिए अनुमति देगा। एक ही मॉड्यूल को कई बार आयात करने की कोशिश करना स्क्रिप्ट को किसी भी तरह से प्रभावित नहीं करता है। फिर यहचर n को बढ़ाने की कोशिश करता है , ताकि स्रोत कोड की कितनी प्रतियों का निष्पादन किया जा सके।

दूसरी पंक्ति को केवल तभी निष्पादित किया जाता है जब पहले वाले में कोई त्रुटि हो। यह पहली पुनरावृत्ति में मामला होगा, क्योंकि n अभी भी अपरिभाषित है। इस मामले में, हम n को 1 के रूप में आरंभीकृत करते हैं और एक मेमने का पंजीकरण करते हैं जो वास्तविक जादू करता है।

पंजीकृत निकास हैंडलर

lambda:[print(end=c*n)for c in"s=%r;exec(s);"%s]

कार्यक्रम खत्म होने से ठीक पहले बुलाया जाएगा। लैम्ब्डा स्वयं स्ट्रिंग बनाता है "s=%r;exec(s);"%s- %rसही तर्क ( एस ) का एक स्ट्रिंग प्रतिनिधित्व बनाता है , जिसमें एकल उद्धरण और खुद को उद्धरण के बीच सब कुछ शामिल है - फिर अपने पात्रों पर ध्यान केंद्रित करता है। प्रत्येक वर्ण c के लिए , हम बस c की n प्रतियाँ मुद्रित करते हैं । पासिंग नामित तर्क के रूप में करने के लिएc*nendprint मतलब है कि कोई भी लाइनफीड संलग्न नहीं किया जाएगा।


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