Mutationsgehärtetes Quin


14

Ihre Aufgabe ist es, ein Programm zu erstellen, das seine eigene Quelle ausgibt.

"Hey, wir haben diese Herausforderung bereits und jede Menge Variationen davon! Warum machst du noch eine?" Sie mögen fragen, aber dieser wird einer der schwierigsten sein (hoffentlich jedenfalls).

Ihr Quine muss "mutationsgehärtet" sein, was bedeutet, dass das Quine den Quellcode des ursprünglichen Programms ausgeben muss, auch wenn eines seiner Zeichen an der richtigen Stelle dupliziert wurde.

Wenn Sie beispielsweise eine Quine haben (das folgende Beispiel ist in keiner Sprache geschrieben, es ist nur Pseudocode):

abcd

Diese Programme müssen alle Folgendes ausgeben abcd:

aabcd
abbcd
abccd
abcdd

(In jedem dieser Programme a, b, cund djeweils an Ort und Stelle dupliziert, was bedeutet , das duplizierte Zeichen direkt nach dem ursprünglichen Charakter getätigt.)

Regeln:

  • Es gelten die üblichen Regeln für Quine.
  • Ein Mehrbyte-Zeichen zählt als ein Zeichen, und das Zeichen wird beim Duplizieren nicht in seine jeweiligen Bytes "aufgeteilt".

Das ist , also gewinnt der kürzeste Code in Bytes!


Zählt das? 0und 00in CJam beide ausgeben 0.
Geokavel

Nein, 0ist keine richtige Quine.
Dennis

2
Ich denke, es wäre als Code-Bowling
Mr. Xcoder

Ist das Problem der Codemutation allgemein lösbar? Wenn die Mutation nicht zu einem Zeichen in einer Zeichenfolge in Anführungszeichen führt, wird das Programm normalerweise beschädigt.
Hasen

Ist der Titel nicht etwas irreführend? "Mutation" schlägt vor, einen Charakter zu ändern, ihn aber nicht zu wiederholen
Luis Mendo

Antworten:


18

> <> 56 Bytes

^
.
+
8
f
0
o
a
o
~
:
?
~
:
?
:
-
*
4
8
:
^
^
}
*
3
d
'

Probieren Sie es online! oder überprüfen Sie alle Mutationen .

Wie das ursprüngliche Programm funktioniert (veraltet)

Der Interpreter startet in Zelle (0, 0) . ^Setzt die Richtung nach oben , so dass der Anweisungszeiger (IP) in die Zelle (0, 20) übergeht .

'Aktiviert den String-Modus: Bis zum nächsten 'Zeichen werden alle Zeichen unter der IP auf den Stack verschoben. Dasselbe 'wird nach dem Umwickeln wieder gefunden, also drücken wir

d3*}^^:84*=?~oao0f.^

Die IP landet bei (0, 19) und steigt weiter an. Die Ausführung d3*}Schübe 13 = 0xd , dann 3 , vervielfacht beide Werte ( 39 / Apostroph ), dreht dann den Stapel auf der rechten Seite . Dies verlässt den Stapel wie folgt.

'd3*}^^:84*=?~oao0f.^

Die nächsten beiden Anweisungen ( ^) tun an dieser Stelle nichts.

:84*=dupliziert den oberen Teil des Stapels, drückt 8 und 4 , multipliziert sie ( 32 / Leerzeichen ) und testet dann das duplizierte Zeichen auf Gleichheit mit dem Leerzeichen . Für das unveränderte Programm wird immer 0 gedrückt .

?Überspringt die nächste Anweisung, wenn die Oberseite des Stapels falsch ist. Für das ursprüngliche Programm ist es immer, also ~wird es immer übersprungen.

oaoöffnet und druckt die Oberseite des Stapels, drückt einen Zeilenvorschub von 10 / , öffnet und druckt dann einen Zeilenvorschub .

Springt schließlich 0f.zu Zelle (0, 15) (ganz unten ^), beginnend mit dem nächsten Zeichen auf dem Stapel.

Sobald der Stapel leer ist, wurde der gesamte Quellcode gedruckt. :schlägt fehl und das Programm wird beendet.

Wie die mutierten Programme funktionieren (veraltet)

Das Duplizieren von Nicht-Zeilenvorschubzeichen erweitert das Programm nur horizontal. Da das Programm vertikal ausgeführt wird, werden diese zusätzlichen Anweisungen niemals ausgeführt.

Das Duplizieren eines Zeilenvorschubs vor dem untersten ^verschiebt die Zellen (0, 14) und (0, 15) nach (0, 15) und (0, 16) . 0f.Springt nun in die Zelle vor dem untersten ^, was auch ein ist ^, so wird das Programm von der Verschiebung nicht beeinflusst.

Schließlich ändert auch ein doppeltes Zeilenvorschubzeichen die Zeichenfolge. Kurze Linien sind mit Leerzeichen aufgefüllt, so dass ein 32 / Raum wird in der Zeilenvorschubposition eingefügt werden. 84*=wird 1 für Leerzeichen drücken , ?überspringt also nicht die nächste Anweisung. In diesem Fall wird ein Leerzeichen~ eingefügt und verworfen , sodass im Folgenden stattdessen das Zeichen über dem Leerzeichen gedruckt wird .o


Sie können jede neue Zeile duplizieren und es wird immer noch funktionieren.
Dennis

3
Oh, ich habe den Beitrag nicht richtig gelesen: P (Verdammt Dennis, warum bist du so gut)
Clismique


@ jimmy23013 Sollte behoben werden.
Dennis
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.