Inkrementelles Quine

23

Ihre Aufgabe ist es, ein Programm oder eine Funktion zu schreiben, die bei jeder Ausführung das erste Zeichen ihres Quellcodes, das zweite und das dritte ausgibt.

Wenn Ihr Programm beispielsweise in einer Datei fooin einer Sprache barvorliegt baz.bar, sollten Sie eine Ausgabe ähnlich der folgenden erhalten:

λ bar baz.bar
f
λ bar baz.bar
o
λ bar baz.bar
o

Ihr Programm kann alles tun, sobald es seinen Quellcode auf diese Weise gedruckt hat. Sie können den Quellcode für die Datei ändern, denken Sie jedoch daran, dass der zu druckende Quellcode der ursprüngliche Quellcode ist.

Dies ist ein Code-Golf, also gewinnt das kürzeste Programm in Bytes.

Conor O'Brien
quelle
1
Wenn wir den Quellcode für die Datei ändern können, heißt das, dass wir ihn auch lesen können?
FlipTack
1
@ Flp.Tkc Gute Frage. Ich habe ehrlich gesagt keine Ahnung. Ich möchte nicht, dass Sie die Quine durch Lesen der Quelle konstruieren, aber ich bin in Ordnung, wenn Sie die Quelle nur für die Änderung der Datei lesen.
Conor O'Brien

Antworten:

6

Gelee , 12 Bytes

“;⁾vṾ®ȯ©Ḣ”vṾ

Dies ist eine Niladische Verbindung. Probieren Sie es online! (Enthält Code zum zwölfmaligen Aufrufen des Links.)

Wie es funktioniert

“;⁾vṾ®ȯ©Ḣ”vṾ  Niladic link.

“;⁾vṾ®ȯ©Ḣ”    Set the left argument and the return value to s =: ';⁾vṾ®ȯ©Ḣ'.
           Ṿ  Uneval; yield r =: '“;⁾vṾ®ȯ©Ḣ”', a string representation of s.
          v   Eval; execute s as a Jelly program with argument r.

 ⁾vV          Yield 'vṾ'.
;             Concatenate r and 'vṾ', yielding q =: '“;⁾vṾ®ȯ©Ḣ”vṾ'.
    ®ȯ        Take the flat logical OR of the register (initially 0) and q.
              This replaces 0 with q in the first run, but it will yield the
              content of the register in subsequent runs.
      ©       Copy the result to the register.
       Ḣ      Head; pop and yield the first character of the register.
              This modifies the string in the register, so it holds one fewer
              character after each call.

Als zusätzlichen Bonus ist das Register nach dem zwölften Aufruf wieder falsch und der Link kann von vorne beginnen, da es eine leere Zeichenfolge enthält. Wenn Sie den Link 24 Mal aufrufen, wird der Quellcode zweimal ausgegeben, 36 Mal usw.

Dennis
quelle
Ich kenne Jelly nicht, also was macht die Fußzeile genau? Warum ^ 17?
Conor O'Brien
Rufen Sie den obigen Link auf ( ¢), die Identitätsfunktion ( ¹die nach dem ersten Aufruf nicht wirklich benötigt wird), setzen Sie den Rückgabewert auf Zeilenvorschub ( gibt implizit den vorherigen Rückgabewert aus), und wiederholen Sie den Vorgang. ¹und sind beide hochgestellt, aber sie haben nichts miteinander zu tun. Ich habe sie durch die weniger verwirrenden ersetzt ¢;¢;¢;¢;¢;¢;¢;¢;¢;¢;¢;¢(aufrufen, verketten, wiederholen).
Dennis
12

Javascript - 26 Bytes

Definiert, f()dass der Quellcode zeichenweise zurückgegeben wird.

n=0;f=x=>("n=0;f="+f)[n++]

Gibt undefined zurück, nachdem die Zeichen aufgebraucht sind.

n=0;f=x=>("n=0;f="+f)[n++]
for(i=0;i<30;i++){console.log(f())} //test harness

Maltysen
quelle
Wenn ich mich nicht irre, müssen Sie den Funktionsaufruf als Teil des Codes einfügen.
Mama Fun Roll
@MamaFunRoll Link zu relevantem Meta Post?
Downgoat
Ich kenne keine: P Ich habe jedoch immer gedacht, dass der Funktionsaufruf selbst Teil des Quines war; Vielleicht fehlt mir etwas?
Mama Fun Roll
@MamaFunRoll Die Spezifikation ermöglicht speziell Funktionen, sodass ein Aufruf nicht erforderlich sein sollte. Für diese besondere Herausforderung würde es sowieso keinen Sinn machen.
Dennis
Okay, ich stelle nur sicher.
Mama Fun Roll
2

gestapelt , nicht konkurrierend, 34 Bytes

[tostr ':!' + execCounter # out]:!

Eine Variation der Standard-Quine. Dies ist ein volles Programm. Hiermit wird ermittelt execCounter, wie oft dieses Programm speziell ausgeführt wurde. Fehler nach der Ausgabe alles.

Probieren Sie es hier aus!

Conor O'Brien
quelle
2

Pip , 31 Bytes

{Y"{Y (yRsRPy++v)}"(yRsRPy++v)}

Eine anonyme Funktion. Testen Sie es auf TIO!

Erläuterung

Beginnen Sie mit diesem Standard-Pip-Quine:

Y"Y yRsRPy"yRsRPy
Y"Y yRsRPy"        Yank that string into y
           yRsRPy  In y, replace the space with repr(y)

Wickeln Sie dies in geschweifte Klammern, um es zu einer Funktion zu machen. Anstatt nun die gesamte Quelle zurückzugeben, müssen wir sie indizieren. Wenn Sie eine globale Variable für den Index verwenden und jedes Mal inkrementieren, wird die Anforderung erfüllt, dass jedes Mal, wenn der Index aufgerufen wird, das nächste Zeichen verwendet wird. vist der beste Kandidat, weil es vorinitialisiert ist -1. Wenn Sie es das erste Mal inkrementieren, erhalten Sie einen Index für 0, das nächste Mal 1usw.

Pip hat eine zyklische Indizierung. Sobald die Funktion das letzte Zeichen druckt, beginnt sie am Anfang von vorne.

DLosc
quelle
1

Python, 90 Bytes

Eine Erweiterung des Standard Python Quine (Golftipps willkommen):

def f(n=0,s='def f(n=0,s=%r):\n while 1:yield(s%%s)[n];n+=1'):
 while 1:yield(s%s)[n];n+=1

Dies ist eine Python- Generator-Funktion , dh, Sie iterieren darüber, und jede Iteration enthält das nächste Zeichen im Quellcode. Wenn alle Zeichen zurückgegeben wurden, stürzt dies mit ab IndexError.

Fügen Sie zum Testen einfach dieses Skript an das Ende des Programms an:

source = ''
try:
    # Call generator, add characters to the string
    for char in f():
        source += char
except IndexError:
    # Generator has reached end of source code
    pass

print(source)

Oder versuchen Sie es online!

FlipTack
quelle
1

*> <> , 13 21 Bytes

" r:2+a1Fi1+:1F1+[ro;

Erstellt eine Datei mit dem Namen \n, um den Index zu verfolgen.

Damit kann man vielleicht mehr Golf spielen, aber nichts springt sofort auf mich los ...

Ausgabe

$ starfish incrementalquine.sf 
"$ starfish incrementalquine.sf 
 $ starfish incrementalquine.sf 
r$ starfish incrementalquine.sf 
:$ starfish incrementalquine.sf 
2$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
a$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
F$ starfish incrementalquine.sf 
i$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
:$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
F$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
[$ starfish incrementalquine.sf 
r$ starfish incrementalquine.sf 
o$ starfish incrementalquine.sf 
;$ starfish incrementalquine.sf

Erläuterung

" r:2+                 build the quine
      a1F              open file named "\n"
         i1+:          read input, increment by 1, duplicate
             1F        save incremented input to file
               1+[     increment input, copy that many values to a new stack
                  ro   output the character at the beginning of the new stack
                    ;  end

Inkrementelle Quine betrügen

a1Fi1+:0go1F;

Erläuterung

a1F            open file named "\n"
   i1+         read input and add 1 to it
      :0g      push the value at (input,0) to the stack
         o     output the value
          1F   save the incremented input to the file
            ;  exit
redstarcoder
quelle
haha, ich hatte keine Ahnung, dass Sie eine Datei "\ n" nennen könnten. Obwohl dies technisch den Quellcode liest, durch die gAnweisung.
Conor O'Brien
@ ConorO'Brien, ah fair genug. hmm ...
redstarcoder
Hat *> <> eine Art Stack-Indizierung? Oder Befehlswiederholung? Dann können Sie das Standard-Quine-Framework "your code goes here;für> <> verwenden und dann auf das n-te Mitglied auf dem Stack zugreifen
Conor O'Brien,
@ ConorO'Brien yeah Teal Pelican hat mir diese quine Variante meiner anderen quine Antwort gezeigt :).
Redstarcoder
1
@redstarcoder Ich habe mehr an Quines gearbeitet (YAY!) und mir einen netten Trick ausgedacht, wenn Sie r für # ersetzen, können Sie: 1- das # like; #; oder [+ 1F1: + 1iF1a-1: "Ich kann dies derzeit nicht testen, aber ich glaube, es schneidet 1 Byte aus Ihrem Code.> <> Quines können wie #o <-1:" etc: D
Teal
1

Mathematica, 91 Bytes

Kommentare sehr willkommen; Ich lerne immer noch, was Quines eigentlich sind.

(If[!NumberQ[q], q = 0]; StringTake[ToString[#0]<>FromCharacterCode[{91, 93}], {++q}]) & []

Definiert eine Funktion, die wiederholt ohne Argumente aufgerufen wird. Nach dem 91. Aufruf wird ein großer Fehler ausgegeben und unbewertet zurückgegeben.

Es gab zwei Probleme zu lösen: Erstens wollte ich nur verwenden StringTake[ToString[#0]<>"[]"], ToString[]scheint aber die Anführungszeichen zu löschen; so musste ich ersetzen "[]"durch FromCharacterCode[{91, 93}]. Zweitens beginnen Mathematica-Variablen nicht initialisiert, sodass ich sie nicht aufrufen kann, ++qbevor sie qdefiniert sind. Aus diesem Grund wird die Initiale If[!NumberQ[q], q = 0]benötigt.

Irrelevante Coda: Während NumberQich nach oben schaute , erfuhr ich, dass Mathematica eine Funktion namens TrueQ... hat, die, ja, zurückgibt, Truewenn das Argument ist Trueund Falsewenn das Argument ist False! (Das Dienstprogramm gibt auch Falsealle anderen Argumente zurück.)

Greg Martin
quelle
1

Microscript II, 40 33 Bytes

Ein Codeblockliteral, das einer Funktion am nächsten kommt:

{ss1K+>K>s#<v{o}sl*v!(123v)lKp<o}

Nach dem Ausführen wird es wieder xaktiviert, um das erneute Aufrufen zu vereinfachen.

SuperJedi224
quelle
0

Bash (und zsh, ksh), 39 Byte

a=`<$0`;pwd>>0;echo ${a:`wc -l<0`-1:1}

Sobald das Programm ausgedruckt ist, wird nichts mehr gedruckt.

Stellen Sie sicher, 0dass das aktuelle Verzeichnis nicht vorhanden ist, und führen Sie Folgendes aus:

bash iquine.bash
Kaito Udagawa
quelle
Willkommen bei PPCG! Sie haben eine clevere Idee, den Index zu erhöhen. Leider sieht es so aus, als würde diese Antwort durch Lesen des eigenen Quellcodes funktionieren, was bedeutet, dass es nach unseren Standards keine gültige Quine ist . Wenn Sie es so modifizieren, dass es andere Quine-Techniken als das Lesen seiner eigenen Quelle verwendet, ist dies eine gute Antwort.
DLosc