Cyclic Levenquine


45

Hintergrund

Wie die meisten PPCG-Stammgäste wissen, ist ein ein Programm, das beim Ausführen seinen eigenen Quellcode ausgibt. und der Levenshtein-Abstand zwischen zwei Zeichenfolgen ist die minimale Anzahl von Einfügungen, Löschungen und Bearbeitungen, die erforderlich sind, um eine Zeichenfolge in die andere zu ändern. In dieser Herausforderung kombinieren wir die beiden Konzepte zu einer "Levenquine": einem Programm, das seinen eigenen Quellcode ausgibt, wobei jedoch eine Instanz eines Zeichens eingefügt, gelöscht oder durch ein anderes Zeichen ersetzt wird. (Mit anderen Worten, der Levenshtein-Abstand zwischen dem Programm und seiner Ausgabe beträgt 1.)

Die Aufgabe

Schreiben Sie eine Levenquine so, dass ihre Ausgabe eine Levenquine ist. Die Ausgabe dieses Programms ist auch eine Levenquine und so weiter. Außerdem muss irgendwann die Sequenz des wiederholten Ausführens des Programms, des Ausführens seiner Ausgabe, des Ausführens seiner Ausgabe usw. zum ursprünglichen Programm zurückkehren.

Es gibt eine zusätzliche Einschränkung, die die Dinge erheblich erschwert: Es muss irgendwo in diesem Zyklus zwei verschiedene Programme geben, die keine gemeinsamen Zeichen haben (mit anderen Worten, es gibt kein Zeichen, das in einem Programm existiert und auch in dem anderen Programm existiert). Ihr Programm muss sich daher allmählich in einen anderen Zeichensatz verwandeln und wieder zurück.

Wenn Sie eine Programmiersprache mit unvermeidbarem Boilerplate verwenden, das in jedem Programm, das eine Ausgabe erzeugt, erforderlich ist (z. B. es gibt nur eine Möglichkeit, eine printAnweisung zu schreiben , und keine anderen nützlichen Ausgabeformen), können Sie dieses Boilerplate für diesen Zweck als nicht vorhanden behandeln zu bestimmen, welche Zeichen zwei Programme gemeinsam haben. Sie müssen dieses Boilerplate jedoch weiterhin zählen, um die Levenquine-Eigenschaft des Codes zu bestimmen.

Klarstellungen

  • Jedes der "Programme" im Zyklus kann entweder ein vollständiges Programm oder eine Funktion sein. Sie müssen nicht alle gleich sein, z. B. könnten einige vollständige Programme und einige Funktionen sein.
  • Nicht alle Programme im Zyklus müssen dieselbe Ausgabeform verwenden. Einige können beispielsweise über die Standardausgabe ausgegeben werden, andere über Standardfehler.
  • Ihre Programme werden ohne Eingabe ausgeführt (oder in Sprachen, die Eingaben erfordern, um überhaupt etwas zu tun, die einfachstmögliche Eingabe).
  • Es gelten die entsprechenden Regeln . Obwohl eine Levenquine keine echte Quine ist, darfst du nichts tun, was illegal wäre, wenn du eine richtige Quine schreibst. Insbesondere ist das Nullprogramm niemals eine gültige Ausgabe von einer richtigen Levenquine (und kann daher nicht Teil Ihres Zyklus sein).
  • Die Levenquine-Beschränkung wird in Zeichen anstatt in Bytes gemessen (z. B. êist ein Zeichen, auch wenn die Quelle in UTF-8 codiert ist). Die Beschränkung "Keine gemeinsamen Zeichen" wird auch in Zeichen gemessen. Die Siegbedingung zählt jedoch in Bytes.

Siegbedingung

Bitte reichen Sie mindestens die folgenden drei Programme aus dem Zyklus ein: das kürzeste Programm (gemessen in Bytes); und zwei Programme aus dem Zyklus, die keine gemeinsamen Zeichen haben. Es ist möglich, dass zwei davon gleich sind, und es ist auch möglich, dass alle drei verschieden sind. Die Punktzahl basiert auf der Länge des kürzesten Programms in Bytes, wobei die kürzere Länge besser ist, wodurch dies zu einer Art Wettbewerb wird.


Für Leute, die gelöschte Beiträge sehen können: Der Sandbox-Beitrag war hier .

Ich denke, es wäre auch gut, wenn die Antworten die Länge des Zyklus einschließen.
mbomb007

Was ist, wenn die Sprache beispielsweise mehrere Funktionen für die Ausgabe hat, die jedoch alle paarweise Zeichen gemeinsam haben?
Ørjan Johansen

2
@ ØrjanJohansen: Ich denke, ich wäre nicht allzu dagegen, nur einen von ihnen auszuwählen und dabei zu bleiben. Es ist jedoch wohl nicht konkurrierend; Ich wollte, dass die Regel objektiv ist, weil die Leute sonst die Tendenz haben, Lücken in sie zu stecken, und wenn Sie versuchen, die Regel zu komplex zu machen, neigen Sie dazu, sich darüber zu streiten, was sie bedeutet.

Kann es ein bisschen levenquin sein? Wie ist in der Entfernung vom Original-Quellcode 1 Byte dran?
Magic Octopus Urn

Antworten:


34

Gol> <> , 252 167 Bytes

1>'r&ff9++r}}r&f*bc++1z.r}r6=z?Hzznr6rHr}r:ee+6+=z9*5c*+1z . }&z+5c*&H}rebe*b+ke++rHS6PWSb`S6P$$1W5/11b6W6EE/W6EE`S6P$$W61`S6P5W6$5_61P1WW_b_

Probieren Sie es online!

Und das voneinander verschiedene ( Verifikations- ) Programm:

0<CŽB‚‚UGGŽ™™ŽB‚F~GGM–JŽ™ŽRY–[d––ŠŽRŽdŽ™ŽVGRGY–UFQFGM–<J<™B–GQFBd™Ž~F~G‡GGŽd;oRl-7-7so~|;oRl@@-Ms7QKMM3-3-3~R-4sRaaK-3sRaa|;oRl@@sR43M|;oRlQ-sR43@Q{RMlMss3{~{"

Probieren Sie es online!

Dies ist vor allem auf meine Antwort auf die Herausforderung " Gegenseitig ausschließende Quines" zurückzuführen. Ein großes Lob geht auch an Bubblers Antwort "Gol" .

Hier ist ein Überprüfungsprogramm, das Sie ausführen können. Leider tritt eine Zeitüberschreitung auf, aber Sie können beobachten, wie ein Codeabschnitt den anderen Abschnitt erstellt. Anschließend können Sie die zuletzt gedruckte Version kopieren und in die Eingabe einfügen, um fortzufahren. Schließlich erreichen Sie das erste Programm, das Sie eingegeben haben.

Erläuterung

Beide Codeabschnitte bestehen aus zwei Abschnitten, dem eigentlichen ausführenden Teil und den Daten, die den anderen Codeabschnitt enthalten. Sie funktionieren beide praktisch identisch:

Sie hängen von einem Flag ab (dem ersten Zeichen des Codes, entweder 1oder 0). Wenn das Flag gesetzt ist, beginnen sie, den anderen Codeabschnitt zu erstellen, indem sie das 252. Zeichen abnehmen, es hinzufügen / entfernen 28und an den Code anhängen.

Hier sind zum Beispiel die ersten beiden Iterationen des Codes nach dem ersten Programm oben:

1>'r&ff9++r}}r&f*bc++1z.r}r6=z?Hzznr6rHr}r:ee+6+=z9*5c*+1z . }&z+5c*&H}rebe*b+ke++rHS6PWSb`S6P$$1W5/11b6W6EE/W6EE`S6P$$W61`S6P5W6$5_61P1WW_b_C

1>'r&ff9++r}}r&f*bc++1z.r}r6=z?Hzznr6rHr}r:ee+6+=z9*5c*+1z . }&z+5c*&H}rebe*b+ke++rHS6PWSb`S6P$$1W5/11b6W6EE/W6EE`S6P$$W61`S6P5W6$5_61P1WW_b_CŽ

Wenn es schließlich das Ende des aktuellen Abschnitts erreicht, wird das zweite Zeichen des Codes umgedreht ( <vor >und zurück), um auf den anderen Abschnitt zu verweisen.

Hier sind beide Abschnitte zusammen, um von der Ausführung des ersten Abschnitts zur Ausführung des zweiten Abschnitts zu wechseln.

1>'r&ff9++r}}r&f*bc++1z.r}r6=z?Hzznr6rHr}r:ee+6+=z9*5c*+1z . }&z+5c*&H}rebe*b+ke++rHS6PWSb`S6P$$1W5/11b6W6EE/W6EE`S6P$$W61`S6P5W6$5_61P1WW_b_CŽB‚‚UGGŽ™™ŽB‚F~GGM–JŽ™ŽRY–[d––ŠŽRŽdŽ™ŽVGRGY–UFQFGM–<J<™B–GQFBd™Ž~F~G‡GGŽd;oRl-7-7so~|;oRl@@-Ms7QKMM3-3-3~R-4sRaaK-3sRaa|;oRl@@sR43M|;oRlQ-sR43@Q{RMlMss3{~{"

Probieren Sie es online!

Die Flags sind für jeden Abschnitt umgekehrt, sodass der neu ausgeführte Abschnitt den anderen Codeabschnitt löscht, bis er seinen eigenen Code erreicht. Zu diesem Zeitpunkt wird das Flag umgedreht und der Zyklus wird erneut wiederholt.

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.