Obwohl 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:
s='s=%r;print s%%s\nfrom random import*;L=4;f=open(__file__,"wa"[L>5]);R=randint\nf.write("\\n".join((s%%s).split("\\n")[1:5:2]).replace("4",`map(ord,s%%s)`))\nif L>5:exec\'b=[];h=%%d\\nwhile~-h:b+=[h%%%%1000];h/=1000\\nwhile b:r,p,n=b[-3:];b=b[:-3];L=[L[:p]+L[p+1:],L[:p]+[r]+L[p+n:]][n<2if L else 1]\\nprint"".join(map(chr,L))\'%%1\n\nn=R(0,2);p=R(0,len(L if L>5else s%%s));r=R(0,255);f.write("%%03d"*3%%(n,p,r))';print s%s
from random import*;L=4;f=open(__file__,"wa"[L>5]);R=randint
f.write("\n".join((s%s).split("\n")[1:5:2]).replace("4",`map(ord,s%s)`))
if L>5:exec'b=[];h=%d\nwhile~-h:b+=[h%%1000];h/=1000\nwhile b:r,p,n=b[-3:];b=b[:-3];L=[L[:p]+L[p+1:],L[:p]+[r]+L[p+n:]][n<2if L else 1]\nprint"".join(map(chr,L))'%1
n=R(0,2);p=R(0,len(L if L>5else s%s));r=R(0,255);f.write("%03d"*3%(n,p,r))
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ür r
, und es gibt das Ergebnis für jede Kombination von n
und p
für die erste Liste.)
Erläuterung:
s='s=%r;print s%%s...';print s%s...
Die erste Zeile ist Ihre klassische Quine, aber viel länger, um zu berücksichtigen, was danach kommt.
from random import*;L=4;f=open(__file__,"wa"[L>5]);R=randint
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.
f.write("\n".join((s%s).split("\n")[1:5:2]).replace("4",`map(ord,s%s)`))
Entfernen Sie die erste und dritte Codezeile. Ersetzen Sie das 4
Obige durch die Liste der Ordnungszahlen.
if L>5:exec'b=[];h=%d\nwhile~-h:b+=[h%%1000];h/=1000\nwhile b:r,p,n=b[-3:];b=b[:-3];L=[L[:p]+L[p+1:],L[:p]+[r]+L[p+n:]][n<2if L else 1]\nprint"".join(map(chr,L))'%1
n=R(0,2);p=R(0,len(L if L>5else s%s));r=R(0,255);f.write("%03d"*3%(n,p,r))
In Stücken:
if L>5:
- Überspringt diese Zeile bei der ersten Ausführung. Später L
wird eine Liste erstellt, die ausgeführt wird. Ich erkläre das exec
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 Liste
f.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ührenden 1
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.