Cyclic Quine betrügen


19

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 daher gewinnt die kürzeste Antwort, sie wird jedoch nicht ausgewählt.

Ich bin mir immer noch nicht ganz sicher, was eine Semi-Quine ist.
Conor O'Brien

@ ConorO'Brien Gibt ein Programm aus, das das ursprüngliche Programm ausgibt
dkudriavtsev

1
Aha. Der Wortlaut ist recht vage.
Conor O'Brien

2
Warum wird nicht die kürzeste Antwort ausgewählt? Ist das ein Katalog?
ATaco

1
Nur fürs Protokoll, ich würde es als eine Art Quine bezeichnen (für diese Herausforderung sind jedoch verschiedene Sprachen erforderlich ).
Martin Ender

Antworten:


28

Bash + Coreutils, 11 Bytes

tr xy yx<$0

Dies wird gedruckt

tr yx xy<$0

Probieren Sie es online!

Das wiederum druckt

tr xy yx<$0

1
Kein Betrüger und in einer gemeinsamen Sprache.
denson

8
Ich denke, dass der trBefehl umgeleitet wird, zu $0dem sein eigener Quellcode ist. Es ist also "betrogen".
Roman Gräf

21

Schnecken, 0 Bytes



Das zweite Programm ist

1

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.


Ich dachte, dass es wahrscheinlich eine Sprache gibt, die dies tut (dh Null-Programm gelingt mit einem nicht leeren Ergebnis, aber dieses Ergebnis tut nichts als Programm). Ich habe HOMESPRING ausprobiert, aber den Dolmetscher nicht zum Laufen gebracht. Sieht so aus, als hätten Sie eine andere Sprache gefunden, in der es funktioniert. (Haben Sie einen Link zu einem Dolmetscher?)


20

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 xxdDump des Programms:

00000000: 4cf4                                     L.

Wenn Sie diese Datei an den Interpreter 7 übergeben, wird das folgende Programm ausgegeben:

00000000: 4fa6 7f                                  O..

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 , 7die die aktive Variante ist 1, Jeder Befehl erhält einen eigenen Namen und die Fettschrift ist nur eine Hervorhebung der Syntax.)

231 7 23 Originalprogramm, entpackt in Oktal
231 237 drücken auf den Stapel
    23 Push - 23 auf den Stapel
             Fügen Sie (implizit) eine Kopie des obersten Stapels an das Programm an
      2       Stapeloberseite duplizieren (derzeit 23 )
        3      Stapeloberseite ausgeben, zweites Stapelelement einfügen

Zu diesem Zeitpunkt sieht der Interpreter 7, dass der obere Teil des Stacks Befehle enthält (2 und 3) 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:

231 7 23 23
             Fügen Sie (implizit) eine Kopie des obersten Stapels an das Programm an
        2     Doppelte Stapeloberseite (derzeit 237 )
          3    Stapeloberseite ausgeben, zweites Stapelelement einfügen
           7   Ein leeres Element auf den Stapel schieben

Zu diesem Zeitpunkt befinden sich nur leere Stapelelemente auf dem Stapel, sodass das Programm beendet wird. Wir geben 23früher aus. Wenn wir entkommen 237(und wir müssen, weil es nicht darstellbare Befehle enthält), bekommen wir 7231. Das wird direkt ausgegeben, was die endgültige Ausgabe des Programms ergibt237231 (formatiert wie das Programm, dh in Bytes gepackt). Das ist 4fa67f. (Es ist anzumerken, dass das 1vö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 237231verläuft fast genauso; Der Unterschied besteht darin, dass das unbrauchbare 1Element 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 das 231Ende sich selbst aus, das 23Ende gibt sich selbst aus, gefolgt von einem 7und wir erhalten 231723das 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:

2  3  1  7  2  3
010011001111010011(1...)
4   c   f   4   padding

Mit anderen Worten, zwei Bytes 4C F4reichen aus, um das Programm darzustellen. Das ist alles, was ich verwendet habe.


11

Python 3, 297 279 251 243 225 218 208 180 126 111 Bytes

Nicht betrügen:

A=''';print(("A="+("'"*3+A)*2).translate({65:66,66:65}))''';print(("A="+("'"*3+A)*2).translate({65:66,66:65}))

Dies druckt:

B=''';print(("B="+("'"*3+B)*2).translate({65:66,66:65}))''';print(("B="+("'"*3+B)*2).translate({65:66,66:65}))

Bei der Ausführung wird das ursprüngliche Programm gedruckt.


Wow! Cool! Daran hätte ich nie gedacht.
Dkudriavtsev

8

Batch, 14 Bytes

@echo @type %0

Was, wenn als cyclicquine.batAusgänge ausgeführt

@type cyclicquine.bat

Was beim Ausführen die ursprüngliche Batch-Datei ausgibt.


8

RProgN , 4 Bytes.

Die Community scheint dies als Betrug zu betrachten , der die Kriterien erfüllt.

1
2

Mit einem nachgestellten Zeilenumbruch.

Dies wird gedruckt

2
1

Mit einer nachgestellten Newline, die den ersten Code druckt.

RProgN druckt den Stapel von oben nach unten.

Probieren Sie es online!


1\n1\nVor 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.)

Auch, obwohl ich nur ungern sagen wollte, ist in RProgN 1\ntechnisch eine gültige Quine, da 1es sich nicht um eine Konstante handelt, sondern um einen Aufruf einer Funktion, die 1auf den Stack schiebt .
ATaco

Es gibt mehrere Definitionen für ein geeignetes Quine. Das ist von mindestens einem ungültig, aber möglicherweise von einigen der anderen gültig.

@ ais523 Sie haben meine Neugier geweckt, Sie haben RProgN angegeben, aber ich habe nicht gedacht, dass meine kleine Sprache so viel (oder gar keine) Aufmerksamkeit erregt. War der Chat speziell über RProgN oder eine Sprache mit einer ähnlichen Syntax?
ATaco

Es war ungefähr 7 , was auch die Tendenz hat, Segmente des Programms "rückwärts" zu drucken. Ich habe aus den dort abgegebenen Meinungen extrapoliert.

6

Jolf, 6 Bytes

1q_a_q

Bei der Ausführung wird Folgendes ausgegeben:

q_a_q1

Was wiederum ausgibt 1q_a_q.

Probieren Sie es hier aus!

Erläuterung

1q_a_q
1       the digit one (ignored)
 q      the source code (ignored)
     q  the source code
    _   reversed
   a    and outputted
 _      and reversed (ignored)

q_a_q1
q       the source code (ignored)
     1  the digit one (ignored)
    q   the source code
   _    reversed
  a     and outputted
 _      and reversed (ignored)

5

JavaScript (ES6), 69 60 59 Bytes

(_0=_=>console.log(`(_0=${_0})()`.replace(/0/g,n=>+!+n)))()

Ausgänge:

(_1=_=>console.log(`(_1=${_1})()`.replace(/1/g,n=>+!+n)))()

-1 Byte (@ETHProductions): Verwenden Sie 0 in regulären Ausdrücken anstelle von \ d


Try n=>1-n instead of n=>+!+n.
Conor O'Brien

@Conner O'Brien Unfortunately the 1 will end up replaced by the regex.
darrylyeo

@ETHproductions Heh, I should've thought of that.
darrylyeo



1

> <>, 16 Bytes

"$r00gol?!;50.01

Probieren Sie es hier aus!

Ausgänge

"$r00gol?!;50.10

Dies ist eine Modifikation des einen bereitgestellt hier . Ich bin nicht sicher, ob es betrügt, es liest die Codebox und gibt sie aus.


1
Sie können das 00g in: 2- ändern, und es behält die gleiche Byteanzahl bei, ohne die Codebox zu lesen.
Teal Pelikan

@Tealpelican, thanks! The goal is for it to be considered "cheating" though :p. (And I don't fully understand that rule)
redstarcoder
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.