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
, c
und d
jeweils 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 Code-Golf , also gewinnt der kürzeste Code in Bytes!
quelle
0
und00
in CJam beide ausgeben0
.0
ist keine richtige Quine.Antworten:
> <> 56 Bytes
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 wirDie 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.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
quelle