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 100
için r
, ve her kombinasyon için sonuç yazdırır n
ve p
ilk 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. L
kaynak 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. 4
Yukarı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, L
bir 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 ( %1
sonraki ç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 1
gelen 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.