Bidirektionale Quine-Kette


9

PPCG hat noch nicht genug von Quines ...

Herausforderung:

Ihre Aufgabe ist es, ein Programm "A0" zu erstellen. Wenn dieses Programm ohne Eingabe ausgeführt wird, gibt es nichts aus. Wenn dieses Programm mit Eingabe ausgeführt wird, gibt es "A1" aus. Wenn "A1" ohne Eingabe ausgeführt wird, wird "A0" ausgegeben. Wenn "A1" mit Eingang ausgeführt wird, wird "A2" ausgegeben. Ziemlich genau, "A (k)" gibt "A (k-1)" aus, wenn es ohne Eingabe ausgeführt wird, und gibt "A (k + 1)" aus, wenn es mit Eingabe ausgeführt wird.

Einzelheiten

Ich glaube, diese Herausforderung ist einfach genug. Es gibt wirklich keine anderen Regeln. Jedes Programm muss übrigens mindestens 1 Byte enthalten. Sie können davon ausgehen, dass die Eingabe nur aus ASCII-Zeichen besteht, und Sie können Leerzeichen ignorieren, wenn Sie möchten, aber Sie können keine bestimmte Eingabe angeben. Die Ausgabe kann entweder auf STDOUT oder STDERR erfolgen, aber alle Ihre Programme müssen auf dieselbe Ausgabe erfolgen. Der andere kann auch Text enthalten (Sie können also an STDOUT ausgeben und dann mit einem Fehler beenden). Vielen Dank an @Dennis für den Hinweis.

Alle Programme müssen in derselben Sprache verfasst sein und jedes Programm muss sich von den anderen unterscheiden.

Die Punktzahl entspricht der Länge des Programms "A0". Da dies eine Code-Golf-Herausforderung ist, gewinnt die niedrigste Punktzahl!


Ich bin traurig vorherzusagen, dass die meisten Einsendungen A (k) und A (k + 1) haben werden, die sich dadurch unterscheiden, dass ein einzelnes Zeichen zu einer wachsenden Zeichenfolge hinzugefügt wird :(
Sparr

@Sparr Leider wird das wahrscheinlich passieren. :( Na ja, ich kann nicht herausfinden, wie ich eine klare Regel dagegen
aufstellen kann

Sie können nur an einen der beiden ausgeben. Ich bin nicht sicher, wenn ich dies richtig interpretiere. Muss STDERR leer sein, wenn wir die gewünschte Ausgabe an STDOUT drucken? Weil es normalerweise erlaubt ist, mit einem Fehler zu beenden.
Dennis

Müssen alle Programme unterschiedlich sein? Die Frage sagt das nicht.

4
Darf ich auch einen etwas ausdrucksstärkeren Titel wie "Bidirectional Quine Chain" vorschlagen? "Super Meta Quine" sagt nicht viel über Programme hinaus, die andere Programme drucken, und wird es in Zukunft schwieriger machen, nach dieser Herausforderung zu suchen.
Martin Ender

Antworten:


1

Pip , 28 Bytes

V Y"I#qSti0+i?`V Y`.RPyRtiu"

Probieren Sie es online aus!

Erläuterung

Dies ist eine modifizierte Version des kürzesten bekannten Pip Quine V Y"`V Y`.RPy". Diese Quine definiert einen String, zieht ihn in die yVariable und wertet ihn dann aus. Bei der Auswertung nimmt die Zeichenfolge den Repr von y(wodurch der Wert von yin doppelte Anführungszeichen gesetzt wird) und verkettet das Musterliteral `V Y`an die Vorderseite.

Unsere Strategie ist es ein setzen 0in dem Programm, dann ersetzen 0mit , 10wenn es eingegeben wurde, oder ersetzen Sie 10mit , 0wenn es keine Eingabe. (Also A ( k ) eine Nummer enthalten , die aus k 1 ist durch ein 0 gefolgt) 0und 10sind bequem , weil es ist integrierte Variablen ( iund tist) mit diesen Werten, so dass wir sie ohne tatsächliche Ziffern beziehen können mit .

Also RPywollen wir stattdessen , RP yRitob es Eingaben gab und RP yRtiwenn nicht. Wir können die beiden Fälle kombinieren, indem wir die Werte von austauschen tund iwenn input ( I#q Sti) vorhanden ist, dann tun RP yRti. (Wir müssen #qdie Länge der Eingabe testen , da Eingaben wie 0Falsey sind.)

Jetzt müssen wir nur noch ein Literal 0in den Code einfügen und den Sonderfall von A0 behandeln, der keine Ausgabe erzeugt. Beides kann durch Testen 0+iund Zurückgeben gelöst werden, uwenn es sich um eine False handelt:

  • Für jedes k > 0 ist die Zahl in A ( k ) ungleich Null und daher wahr (z 110+i. B. ).
  • Für k = 0 ist die Zahl in A ( k ) Null:
    • Wenn es Eingaben gibt iund tgetauscht wird und i10 0+iist, ist das immer noch wahr.
    • Wenn es keine Eingabe gibt, iist immer noch 0 und 0+iist falsch. Anstelle des Quine-Kerns geben wir aus u, eine integrierte Variable für nil. Das Drucken von Null erzeugt keine Ausgabe.

Gut gemacht! Klappt wunderbar.
HyperNeutrino

1

Python 2, 93 Bytes

Es gibt einen nachlaufenden Zeilenvorschub.

p=1+2*bool(input())-1;s='print"p=%r+2*bool(input())-1;s=%r*(p>0);exec s"%(p,s)'*(p>0);exec s

Versuchen Sie es mit Eingabe | Versuchen Sie es ohne Eingabe

Dies wurde von meiner Antwort auf eine ähnliche Frage geändert .

Wenn eine Eingabe vorhanden ist, wird diese erhöht p. So das resultierende Programm wird p=2+..., p=3+...usw.


Dies erkennt 0 nicht als Eingabe
fəˈnɛtɪk

@LliwTelracs Die Eingabe muss in Anführungszeichen gesetzt werden (es muss ein Stich sein). Siehe die Hyperlinks in der Antwort.
mbomb007

So wie es ist, arbeitet Ihr Programm mit Zeichenfolgen und allen Zahlen außer 0.
fəˈnɛtɪk

1
@LliwTelracs Versuchen Sie dann nicht, Zahlen zu verwenden. Dem Konsens zufolge kann ich input()Eingaben verwenden und verlangen, dass sie von Anführungszeichen umgeben sind, anstatt sie zu verwenden raw_input(). Wenn Sie Null eingeben möchten, verwenden Sie "0".
mbomb007

Schöne Lösung! Ich hatte erwartet, dass die meisten Antworten unendlich lang werden (technisch gesehen, aber nicht im gleichen Sinne). Gut gemacht!
HyperNeutrino
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.