Konzept
Schreiben Sie ein Programm, das Code in seiner Programmiersprache ausgibt. Wenn dieser Code ausgeführt wird, muss er das ursprüngliche Programm ausgeben.
Regeln
- Da es sich um eine Betrugs-Quine handelt, können Sie den Original-Quellcode lesen.
- Das erste Ausgabeprogramm muss in derselben Sprache wie das Originalprogramm sein.
- Sie können kein normales Quine ausgeben. Die beiden Programme müssen unterschiedlich sein.
- Es gelten Standardlücken.
- Dies ist Codegolf, daher gewinnt die kürzeste Antwort, sie wird jedoch nicht ausgewählt.
Antworten:
Bash + Coreutils, 11 Bytes
Dies wird gedruckt
Probieren Sie es online!
Das wiederum druckt
quelle
tr
Befehl umgeleitet wird, zu$0
dem sein eigener Quellcode ist. Es ist also "betrogen".Schnecken, 0 Bytes
Das zweite Programm ist
Das erste Programm zählt die Anzahl der Übereinstimmungen des leeren Musters auf der leeren Eingabe (die tatsächlich den Bereich 0 hat, aber das Muster wird immer mindestens einmal als Hack ausgeführt, damit Programme entscheiden können, was sie auf der leeren Eingabe drucken möchten). Das zweite Programm beginnt mit einem Quantifizierer (wie
{1}
in Regex), der einen Analysefehler verursacht. Da das Programm nicht erfolgreich analysiert, ist STDOUT die leere Zeichenfolge.quelle
7 , 2 Bytes
In 7 wird ein 3-Bit-Zeichensatz verwendet, die Eingabe wird jedoch in Bytes gepackt (und gemäß Meta werden Sprachen mit Sub-Byte-Zeichensätzen mit Bytes für die Datei auf der Festplatte gezählt ). Hier ist ein
xxd
Dump des Programms:Wenn Sie diese Datei an den Interpreter 7 übergeben, wird das folgende Programm ausgegeben:
Dieser gibt dann wiederum das ursprüngliche Programm wieder aus.
Also, was ist hier los? Es ist kein Quellenlesen involviert (eigentlich glaube ich nicht, dass es möglich ist, die Quelle in 7 zu lesen), obwohl das Programm wohl auf andere Weise schummelt; Lass mich wissen was du denkst. So funktioniert das Programm. (Beachten Sie, dass jeder 7-Befehl zwei Varianten hat, von denen einige keine Namen haben und nicht im Originalprogramm erscheinen können. Es gibt insgesamt zwölf Befehle in sechs Paaren. Ich verwende Fett für aktive Befehle, Fett nicht für passive Befehle, und in Fällen , in denen der aktive Befehl hat keinen Namen, ich habe es den gleichen Namen wie die entsprechende passive Befehl und unter Berufung auf die fett gebe. im Fall zu unterscheiden , wo beide benannt sind, zum Beispiel ,
7
die die aktive Variante ist1
, Jeder Befehl erhält einen eigenen Namen und die Fettschrift ist nur eine Hervorhebung der Syntax.)Zu diesem Zeitpunkt sieht der Interpreter 7, dass der obere Teil des Stacks Befehle enthält (
2
und3
) enthält, die nicht darstellbar sind. Daher wird der obere Bereich des Stapels verlassen und produziert723
(was ist). Die erste Befehlsausgabe wählt das Ausgabeformat aus; In diesem Fall ist es Format 7, "Formatieren Sie die Ausgabe auf die gleiche Weise wie das Programm". Die Befehle werden also in Bytes gepackt ausgegeben. Dann geht das Programm weiter:Zu diesem Zeitpunkt befinden sich nur leere Stapelelemente auf dem Stapel, sodass das Programm beendet wird. Wir geben
23
früher aus. Wenn wir entkommen237
(und wir müssen, weil es nicht darstellbare Befehle enthält), bekommen wir7231
. Das wird direkt ausgegeben, was die endgültige Ausgabe des Programms ergibt237231
(formatiert wie das Programm, dh in Bytes gepackt). Das ist4fa67f
. (Es ist anzumerken, dass das1
völlig sinnlos in Bezug auf die Auswirkung auf die Ausgabe war; der einzige Grund dafür ist, dass die beiden Programme unterschiedlich sind.)Das Laufen
237231
verläuft fast genauso; Der Unterschied besteht darin, dass das unbrauchbare1
Element direkt nach dem ersten Ausdruck ausgeführt wird (und das leere Element implizit gelöscht wird, wenn das aktuelle Programmende zum zweiten Mal erreicht wird). Wiederum gibt das231
Ende sich selbst aus, das23
Ende gibt sich selbst aus, gefolgt von einem7
und wir erhalten231723
das ursprüngliche Programm.Der Beobachter könnte bemerken, dass die beiden Programme, obwohl sie im "nativen" Oktal der Sprache gleich lang sind, unterschiedliche Längen auf der Festplatte haben. Das liegt daran, dass ein 7-Programm mit einer beliebigen Anzahl von 1 Bit aufgefüllt werden kann und das gepackte Format das nachfolgende Auffüllen verwirft. So erfolgt die Codierung:
Mit anderen Worten, zwei Bytes
4C
F4
reichen aus, um das Programm darzustellen. Das ist alles, was ich verwendet habe.quelle
Python 3,
297279251243225218208180126111 BytesNicht betrügen:
Dies druckt:
Bei der Ausführung wird das ursprüngliche Programm gedruckt.
quelle
Batch, 14 Bytes
Was, wenn als
cyclicquine.bat
Ausgänge ausgeführtWas beim Ausführen die ursprüngliche Batch-Datei ausgibt.
quelle
RProgN , 4 Bytes.
Die Community scheint dies als Betrug zu betrachten , der die Kriterien erfüllt.
Mit einem nachgestellten Zeilenumbruch.
Dies wird gedruckt
Mit einer nachgestellten Newline, die den ersten Code druckt.
RProgN druckt den Stapel von oben nach unten.
Probieren Sie es online!
quelle
1\n1\n
Vor einiger Zeit gab es eine Chatdiskussion , in der angedeutet wurde, dass in RProgN kein betrügerischer Quine vorkommt, da sich alle Einsen gegenseitig ausdrücken (und es nur dann als betrügerisch angesehen werden würde, wenn jede eine für sich gedruckt hätte). Alles, was dies wirklich impliziert, ist, dass das Betrügen in Quines manchmal schwer zu definieren ist. (Allerdings ist diese Antwort ist richtig so oder so, weil die Frage nicht wirklich benötigt die quine, zu betrügen nur erlaubt es.)1\n
technisch eine gültige Quine, da1
es sich nicht um eine Konstante handelt, sondern um einen Aufruf einer Funktion, die1
auf den Stack schiebt .Jolf, 6 Bytes
Bei der Ausführung wird Folgendes ausgegeben:
Was wiederum ausgibt
1q_a_q
.Probieren Sie es hier aus!
Erläuterung
quelle
JavaScript (ES6),
696059 BytesAusgänge:
-1 Byte (@ETHProductions): Verwenden Sie 0 in regulären Ausdrücken anstelle von \ d
quelle
n=>1-n
instead ofn=>+!+n
.1
will end up replaced by the regex.Bash + Sed, 15 bytes
Same idea as Dennis's Answer.
quelle
Bash,
Catund Rev,1916 Bytes-3 danke an @izabera
quelle
Bash
,Tac
und `Rev?rev $0 # 0$<space><space>ver
Aus irgendeinem Grund kann ich in einem Kommentar keine zwei Leerzeichen setzentac
rev
-ed istcat
.> <>, 16 Bytes
Probieren Sie es hier aus!
Ausgänge
Dies ist eine Modifikation des einen bereitgestellt hier . Ich bin nicht sicher, ob es betrügt, es liest die Codebox und gibt sie aus.
quelle