Eine 1-up-Quine ist ein Programm, das einer Quine sehr ähnlich ist. Der einzige wesentliche Unterschied besteht darin, dass das Ergebnis n + 1- mal das ursprüngliche Programm druckt , anstatt sich selbst einmal zu drucken, wenn n Kopien des Programms verkettet werden .
Beispiel
Wenn Ihr Programm ist Abc123
:
Abc123 -> Abc123Abc123
Abc123Abc123 -> Abc123Abc123Abc123
Abc123Abc123Abc123 -> Abc123Abc123Abc123Abc123
Herausforderung
Ihre Herausforderung besteht darin, das kürzeste gültige 1-up-Quine in jeder Sprache zu erstellen. Es gelten die üblichen Quine-Regeln. Sie dürfen also nicht:
- Senden Sie das leere Programm.
- Lesen Sie direkt oder indirekt 1 den Quellcode.
- Verwenden Sie Quining-Built-Ins.
Das ist Code-Golf, also gewinnt der kürzeste Code in Bytes.
1 Dies beinhaltet nicht die Verwendung einer fest codierten Zeichenfolge oder eines Codeblocks als Teil Ihres Programms.
code-golf
quine
code-generation
ETHproductions
quelle
quelle
n
eine Einschränkung des Datentyps vorliegt (maximale Ganzzahlgröße usw.)?Antworten:
GolfScript, 12 Bytes
Probieren Sie es online!
Erläuterung
Dies kombiniert Ideen aus dem Standard GolfScript Quine:
Und meine kürzlich entdeckte Quine :
Die Hauptidee ist wieder,
n
die implizit am Ende des Programms gedruckt wird, um die zusätzliche Kopie des Quine zu erhalten. Da die Zuweisung der Variablen nichts ändert, wenn sie in nachfolgenden Kopien erneut ausgeführt wird, wird nur eine Kopie hinzugefügt. Hier ist eine Aufschlüsselung des Codes:quelle
GolfScript, 12 Bytes
Probieren Sie es online!
Wie der Quellcode funktioniert
Wenn der obige Quellcode einmal ausgeführt wird, endet der Stack als
Dabei entspricht die leere Zeichenfolge am Anfang dem Anfangszustand des Stapels (leere Eingabe).
Zwei Kopien des Quellcodes würden einen endgültigen Zustand von
drei Kopien ein Endzustand von
und so weiter.
Was passiert als nächstes
Nach dem Ausführen des Quellcodes führt der Interpreter die folgenden Schritte aus.
Es umschließt den gesamten Stapel in einem Array und verschiebt dieses Array auf den Stapel.
Für zwei Kopien des Quellcodes enthält der Stapel jetzt
Es wurde
puts
mit der Absicht ausgeführt, den verpackten Stapel zu drucken, gefolgt von einem Zeilenvorschub.puts
ist definiert als{print n print}
, so macht es das Folgende.print
druckt die eingepackte Kopie des Stapels, ohne ihn zu untersuchen (dh ohne ihn in seine Zeichenfolgendarstellung zu konvertieren). Das schickt(der Quellcode) zu STDOUT und fügt die Stapelkopie oben im Stapel ein.
Der Stapel enthält jetzt
führt den zuvor definierten Codeblock aus.
:
Beginnt mit dem Speichern[{: ".~"][} ".~"]
des Leerzeichens, verschiebt sich dann".~"
selbst,]
umschließt".~"
ein Array und[
setzt einen neuen Array-Marker.n
Drückt eine Zeichenkette, die aus einem einzelnen Zeilenvorschub besteht.Der Stapel enthält jetzt
wird noch einmal ausgeführt. Es wurde jedoch beim ersten Aufruf neu definiert und enthält nun ein Array, keinen Codeblock.
Tatsächlich drückt es
[{: ".~"][} ".~"]
und lässt den Stapel unverändertZum Schluss wird
print
das oberste Stapelelement gedruckt, ohne es zu untersuchen, und gesendetzu STDOUT, 1-up den Quellcode.
quelle
Javascript ES6 (REPL), 55 Byte
2 Bytes gespart dank @ user81655!
Erläuterung
Hier ist das Standard-Quine-Framework:
Sie sollten diesen Rahmen in der Übermittlung sehen können. Weitere Erklärung unten.
Dies ist der Zähler, der standardmäßig auf 1 eingestellt ist. Im Grunde sagt er uns, wie viel Quine und Inkremente gleichzeitig wiederholt werden müssen.
Dies ist der entscheidende Teil. Wir wiederholen den Quine-String im Wesentlichen um den Zähler + 1. Nachfolgende Funktionsaufrufe überschreiben die Ausgabe.
quelle
a
).var
CJam, 14 Bytes
Probieren Sie es online!
Wie es funktioniert
Nachdem die letzte Kopie des Programms ausgeführt wurde, befindet sich das Array, das den Block und die Zeichenfolge enthält, noch im Stapel, sodass es implizit gedruckt wird.
quelle
Groovy, 83 Bytes
Es gibt eine eingebettete und keine nachgestellte Newline. Dies druckt:
Die Funktion
f()
druckt eine Kopie des Quines. Das ursprüngliche Programm ruft es zweimal auf. Die erste Zeile des angehängten Codes wird zu einem Kommentar und nur der zweite Aufruf vonf()
wird ausgeführt.quelle
Ruby, 43 Bytes
Dies druckt sich selbst
2-0
oder2
mal. Wenn die endgültige Druckanweisung mit einer anderen Kopie von sich selbst verknüpft ist, sieht sie so aus$><<s%s*n=2-01
, dass sie sich nur einmal ausgibt (01
als Oktal 1). Es wird also nur die letzte Kopie der Zeichenfolge zweimal gedruckt, die anderen werden einmal gedruckt.Die Inline-Zuweisung zu
n
dient nur dazu, die Reihenfolge der Vorgänge korrekt zu bestimmen. Zustand wird nicht tatsächlich von einer Kopie zur nächsten weitergegeben.quelle
NodeJS,
63616055 BytesDies funktioniert auch in JavaScript (ES6), wenn Sie davon ausgehen, dass mehrere Konsolenmeldungen durch Zeilenumbrüche getrennt sind (kein REPL erforderlich).
2 Bytes dank @ dev-null gespeichert
Beachten Sie, dass sich am Ende des Codes eine neue Zeile befindet.
Dies war ein interessanter, definitiv einer meiner Favoriten für diese Site.
Ich bin ziemlich zuversichtlich, dass man nicht mehr viel Golf spielen kann. (Vielleicht SpiderMonkeys
print
Funktion ...)Erläuterung
quelle
(f=_=
Ich bin vielleicht etwas zu müde.Ruby, 55 Bytes
Hier ist nichts sehr Interessantes, es ist nur eine normale Rubin-Quine mit einer Theke.
quelle
JavaScript (ES6), 164 Byte
Funktioniert auf jeder JS-Testseite oder -Konsole in Firefox, vorausgesetzt, der Abstand zwischen zwei Konsolenmeldungen wird als Zeilenumbruch gewertet.
quelle
window
aufthis
.Perl 6 ,
5853 BytesDanke an Jo King für -5 Bytes.
Basierend auf Jo Kings Quine .
Probieren Sie es online!
quelle
Japt, 40 Bytes
Testen Sie es online! Erklärung zu kommen.
quelle
Y.
Nicht konkurrierend, 6 Bytes
Y ist eine Kopfkanone, die ich seit einiger Zeit besitze, und das hat mich dazu inspiriert, sie zu schreiben. Es ist für Herausforderungen gedacht, bei denen Sequenzierung eine Schlüsselrolle spielt. Der Code ist durch "Knoten" -Zeichen in Verknüpfungen unterteilt. In diesem Fall wird unser Code (ursprünglich) in zwei Ketten eingeteilt, wobei der Knoten ist
C
.U
zeichnet eine transzendentale Zeichenfolge auf, dh eine, die sich über Links erstreckt. Es zeichnet auf, bis es ein anderes trifftU
. Wenn aU
am Ende der Zeichenfolge nicht erfüllt ist, wird es umgebrochen. IstU
auch standardmäßig in der Zeichenfolge enthalten. Nach dem Aufzeichnen des Strings fahren wir mit dem Knoten fortC
, der uns nur zum nächsten Link bewegt.n
drückt die Anzahl der Ketten. Für unseren Basisfall ist dies 2. Für eine Folge vonK
Ketten gibt esK+2
Ketten, wie esK
Knoten gibt.*
ist Zeichenkettenwiederholung.p
druckt den gesamten Stapel (in diesem Fall einen String) undx
beendet das Programm.In einem Text:
Probieren Sie es hier aus!
quelle
U
neben dem Quinten? (Glückwunsch zu 7k, übrigens)Brachylog , 20 Bytes
Probieren Sie es online!
Geändert von diesem Quine.
Wenn dies mit sich selbst verknüpft ist, schlägt jede Route mit Ausnahme der letzten fehl und das Programm fährt mit der nächsten fort, wobei jede Route ausgeführt
w₃
und jede mitw₅
Ausnahme der allerletzten zurückverfolgt wird.Probieren Sie es online!
Probieren Sie es online!
Probieren Sie es online!
quelle