Her ne kadar meydan okuma, kaynağınızı okumanıza izin verildiğini göstermek için düzenlenmiş olsa da, zaten bu olmadan çözümümü oluşturuyordum. Yani, mümkün olduğunu göstermek için bitirdim. Kaynak dosya okunmuyor:
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))
Çevrimiçi deneyin! (Bunun kaynağı değiştirmeyeceğini unutmayın. Bunun çalışması için yerel olarak çalıştırmanız gerekir)
Dönüşümleri, burada çalışan olduğunu göstermek için bir olan test programı (şu anda her zaman almaya kurmak 100için r, ve her kombinasyon için sonuç yazdırır nve pilk liste için.)
Açıklama:
s='s=%r;print s%%s...';print s%s...
İlk satır klasik kininiz, ancak sonra gelenleri açıklamak için çok daha uzun.
from random import*;L=4;f=open(__file__,"wa"[L>5]);R=randint
Rastgele tamsayılar için içe aktarın. Lkaynak kodun sıra sıralarının bir listesi haline gelir, ancak başlangıçta bir dizenin değiştirilmesine izin vermek için kaynağın başka hiçbir yerinde kullanılmayan bir tamsayıdır. Yeni kaynağı yazmak için dosyayı açın. Daha sonraki çalışmalarda, bunun yerine eklemek için açılır.
f.write("\n".join((s%s).split("\n")[1:5:2]).replace("4",`map(ord,s%s)`))
Birinci ve üçüncü kod satırlarını kaldırın. 4Yukarıdakileri sıra sayıları listesiyle değiştirin .
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))
Parçalar halinde:
if L>5:- İlk yürütmede bu satırı atlar. Daha sonra, Lbir liste olacak ve bu çalışacaktır. Sonuncuyu açıklayacağım exec, çünkü ilk kez çalışmaz.
n- Rasgele bir sayı 0-2. Bu, hangi değişikliğin gerçekleşeceğini belirler (0 = ekleme, 1 = değiştirme, 2 = silme).
p - Değişikliğin yapılacağı listede rastgele bir konum.
r - Listeye eklemek veya listeye eklemek için rastgele bir sayı
f.write("%03d"*3%(n,p,r))- 3 rasgele kaynak dosyanın sonuna ekleyin. Her çalıştırmada, meydana gelen ilk kaynaktaki tüm değişiklikleri kodlayan bir tam sayı eklenir.
exec'b=[];h=%d...'%1...- Rastgele sayıları alın ( %1sonraki çalışmalarda bulunur), değişiklikleri listeye uygulayın ve yazdırın.
while~-h:b+=[h%%1000];h/=1000- Öncüleri oluşturan ve önde 1gelen sıfırlarla ilgili sorunları önleyen, şimdiye kadar üretilen rastgele bir liste oluşturun .
while b:r,p,n=b[-3:];b=b[:-3] - Bu yineleme için rastgele atayın.
L=[L[:p]+L[p+1:],L[:p]+[r]+L[p+n:]][n<2if L else 1] - (0 = ekle, 1 = değiştir, 2 = sil)
print"".join(map(chr,L)) - Değiştirilen kaynağı yazdırın.