Ihre Aufgabe ist es, ein Programm oder eine Funktion zu schreiben, die:
- Bei der ersten Ausführung wird der Quellcode ausgegeben.
Bei nachfolgenden Ausführungen sollte das ausgegeben werden, was zuvor ausgegeben wurde, jedoch mit einer zufälligen Zeichenänderung (unten definiert). Es muss sich nicht um eine einheitlich zufällige Änderung handeln, es sollte jedoch für jede mögliche Änderung eine Wahrscheinlichkeit ungleich Null bestehen.
Nach der ersten Ausführung ist Ihr Programm nicht mehr unbedingt ein Quine. Die Ausgabe hat sich geändert (und das Programm kann sich auch selbst ändern).
Wenn Ihr Quine beispielsweise ABCD
wiederholt ausgeführt wurde, wird möglicherweise Folgendes gedruckt:
ABCD
A!CD
j!CD
j!CjD
Spezifikationen
Eine Zeichenänderung ist entweder:
- Das Einfügen eines zufälligen Zeichens,
- Das Löschen eines zufälligen Zeichens oder
- Ein Ersetzen eines Zeichens durch ein neues zufälliges Zeichen. Beachten Sie, dass das neue Zeichen das gleiche sein darf, das es ersetzt. In diesem Fall wird keine Änderung vorgenommen.
Das Löschen oder Ersetzen eines Zeichens aus einer leeren Zeichenfolge ist natürlich keine gültige Änderung.
- Obwohl dieses Tag quine ist , gelten die Regeln gegen das Lesen Ihres Quellcodes nicht.
Sie können einen beliebigen Zeichensatz verwenden, sofern dieser die in Ihrem Quellcode verwendeten Zeichen enthält.
Antworten:
Python 3 ,
288 270 224 212 195 196 194 180 178168 BytesProbieren Sie es online!
Nachdem wir den Datei-Quellcode in der ersten Iteration gedruckt haben, fügen wir eine zusätzliche Zeile hinzu, um x anstelle von m auf den neuen Quellcode zu setzen.
Erläuterung:
Unter der Annahme, dass
hash
eine einheitliche Zufallszahl zurückgegeben wird, besteht eine Chance von etwa 1/6, ein neues Zeichen einzufügen, eine Chance von 1/6, ein vorhandenes Zeichen zu ändern und eine Chance von 2/6, ein Zeichen zu löschen. Was ist die verbleibende 2/6 Chance, die Sie fragen? Na ja, es macht überhaupt nichts 2/6 der Zeit!(Hier ist ein Validierungsprogramm, das an die Antworten von mbomb007 angepasst wurde . Probieren Sie es online aus! )
quelle
f=__file__
würde auch im ersten Schritt helfen.Python 3 ,
205195 BytesProbieren Sie es online!
Wollte eine Version ausprobieren, die den Quellcode nicht liest. Es stellte sich als nicht schlecht heraus, wie ich dachte, und es sind nur etwa 30 Bytes hinter der Version , die das tut . Die Erklärung für die Funktionsweise ist größtenteils dieselbe wie bei der anderen Antwort, initialisiert x jedoch anders, da nicht nur der Quellcode gelesen werden kann.
quelle
Python 2 ,
779801 BytesObwohl die Herausforderung dahingehend bearbeitet wurde, dass das Lesen Ihrer Quelle erlaubt ist, habe ich bereits meine Lösung ohne diese erstellt. Um zu zeigen, dass es möglich ist, habe ich es beendet. Kein Lesen der Quelldatei:
Probieren Sie es online! (Beachten Sie, dass dadurch die Quelle nicht geändert wird. Sie müssen sie lokal ausführen, damit dies funktioniert.)
Um zu zeigen , dass die Transformationen arbeiten, hier ist ein Testprogramm (derzeit eingerichtet, um immer zu wählen
100
fürr
, und es gibt das Ergebnis für jede Kombination vonn
undp
für die erste Liste.)Erläuterung:
Die erste Zeile ist Ihre klassische Quine, aber viel länger, um zu berücksichtigen, was danach kommt.
Import für zufällige ganze Zahlen.
L
wird aus der Liste der Ordnungszahlen des Quellcodes, aber anfänglich ist es eine Ganzzahl, die an keiner anderen Stelle in der Quelle verwendet wird, um ein Ersetzen der Zeichenfolge zu ermöglichen. Öffnen Sie die Datei, um die neue Quelle zu schreiben. Bei späteren Ausführungen wird es stattdessen zum Anhängen geöffnet.Entfernen Sie die erste und dritte Codezeile. Ersetzen Sie das
4
Obige durch die Liste der Ordnungszahlen.In Stücken:
if L>5:
- Überspringt diese Zeile bei der ersten Ausführung. SpäterL
wird eine Liste erstellt, die ausgeführt wird. Ich erkläre dasexec
letzte, weil es nicht das erste Mal läuft.n
- Eine Zufallszahl 0-2. Hiermit wird festgelegt, welche Änderung vorgenommen wird (0 = Einfügen, 1 = Ersetzen, 2 = Löschen).p
- Eine zufällige Position in der Liste, an der die Änderung vorgenommen wird.r
- Eine Zufallszahl zum Einfügen oder Ersetzen in die Listef.write("%03d"*3%(n,p,r))
- Hängen Sie die 3 Zufälle an das Ende der Quelldatei an. Bei jedem Durchlauf wird dies zu einer Ganzzahl hinzugefügt, die alle Änderungen an der ursprünglichen Quelle codiert, die aufgetreten sind.exec'b=[];h=%d...'%1...
- Holen Sie sich die Zufallszahlen (die Sie%1
später finden), übernehmen Sie die Änderungen in die Liste und drucken Sie sie aus.while~-h:b+=[h%%1000];h/=1000
- Erstellen Sie eine Liste der bisher generierten Zufälle unter Berücksichtigung der führenden1
führenden Nullen, um Probleme mit führenden Nullen zu vermeiden.while b:r,p,n=b[-3:];b=b[:-3]
- Weisen Sie die Zufälligkeiten für diese Iteration zu.L=[L[:p]+L[p+1:],L[:p]+[r]+L[p+n:]][n<2if L else 1]
- (0 = Einfügen, 1 = Ersetzen, 2 = Löschen)print"".join(map(chr,L))
- Drucken Sie die geänderte Quelle.quelle
p
kann die Länge der Zeichenkette sein. Wie verhält es sich mit einer leeren Zeichenfolge?Of course, deleting or replacing a character from an empty string is not a valid change
Java 10, 370 Bytes
Probieren Sie es online aus.
Erläuterung:
Allgemeine Erklärung:
quine -Teil:
s
enthält den unformatierten Quellcode.%s
wird verwendet, um diesen String in sich selbst mit dem einzugebens.format(...)
.%c
,%1$c
und34
werden zum Formatieren der doppelten Anführungszeichen verwendet.%%
dient zur Formatierung des Modulo-%
).s.format(s,34,s)
setzt alles zusammen.Hier ein grundlegendes Java-Quine-Programm.
Herausforderungsteil:
String s;
ist der Quellcode, den wir auf Klassenebene ändern werden.int r=s.length();r*=Math.random();
wird verwendet, um einen zufälligen Index des Quellcodes im Bereich auszuwählen[0, length_of_modified_source_code)
.char c=127;c*=Math.random();
wird verwendet, um ein zufälliges ASCII-Zeichen (einschließlich nicht druckbarer Zeichen) im Unicode-Bereich auszuwählen[0, 126]
.c%3
wird verwendet, um eine zufällige Option von entweder 0, 1 oder 2 auszuwählen. Option 0 fügt das zufällige Zeichen vor dem Index hinzur
; Option 1 ersetzt das Zeichen am Indexr
durch das zufällige Zeichen. und Option 2 entfernt das Zeichen am Indexr
.quelle