แม้ว่าความท้าทายจะได้รับการแก้ไขเพื่อแสดงว่าอนุญาตให้อ่านแหล่งข้อมูลของคุณได้ ดังนั้นเพื่อแสดงว่าเป็นไปได้ฉันทำมันเสร็จแล้ว ไม่มีการอ่านไฟล์ต้นฉบับ:
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))
ลองออนไลน์! (โปรดทราบว่าสิ่งนี้จะไม่แก้ไขแหล่งที่มาคุณต้องเรียกใช้ภายในเครื่องเพื่อให้ทำงานได้)
แสดงให้เห็นว่าการเปลี่ยนแปลงการทำงานของที่นี่เป็นโปรแกรมการทดสอบ (ชุดปัจจุบันถึงเคยรับ100
สำหรับr
และพิมพ์ผลการรวมกันของทุกคนn
และp
สำหรับรายการเริ่มต้น.)
คำอธิบาย:
s='s=%r;print s%%s...';print s%s...
บรรทัดแรกคือคลาสสิกของคุณ แต่นานกว่าที่จะพิจารณาว่าเกิดอะไรขึ้น
from random import*;L=4;f=open(__file__,"wa"[L>5]);R=randint
นำเข้าสำหรับจำนวนเต็มแบบสุ่ม L
จะกลายเป็นรายการของเลขลำดับของซอร์สโค้ด แต่เริ่มแรกเป็นจำนวนเต็มที่ไม่ได้ใช้ที่อื่นในแหล่งที่มาเพื่ออนุญาตให้มีการแทนที่สตริง เปิดไฟล์เพื่อเขียนต้นฉบับใหม่ เมื่อเรียกใช้ในภายหลังจะเปิดเพื่อผนวกแทน
f.write("\n".join((s%s).split("\n")[1:5:2]).replace("4",`map(ord,s%s)`))
ลบรหัสบรรทัดแรกและบรรทัดที่สาม แทนที่4
ข้างต้นด้วยรายการของเลขลำดับ
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))
เป็นชิ้น ๆ:
if L>5:
- ข้ามบรรทัดนี้ไปที่การดำเนินการครั้งแรก หลังจากนั้นL
จะเป็นรายการและสิ่งนี้จะทำงาน ฉันจะอธิบายexec
ครั้งสุดท้ายเพราะมันไม่ได้ทำงานครั้งแรก
n
- สุ่มหมายเลข 0-2 สิ่งนี้พิจารณาว่าการแก้ไขใดที่เกิดขึ้น (0 = insert, 1 = แทนที่, 2 = ลบ)
p
- ตำแหน่งสุ่มในรายการที่จะเกิดการเปลี่ยนแปลงที่
r
- ตัวเลขสุ่มที่จะแทรกหรือแทนที่ในรายการ
f.write("%03d"*3%(n,p,r))
- ผนวก 3 randoms ต่อท้ายไฟล์ต้นฉบับ ทุกครั้งที่ดำเนินการสิ่งนี้จะถูกเพิ่มลงในจำนวนเต็มที่เข้ารหัสการเปลี่ยนแปลงทั้งหมดไปยังแหล่งข้อมูลเริ่มต้นที่เกิดขึ้น
exec'b=[];h=%d...'%1...
- รับตัวเลขสุ่ม (พบหลังจาก%1
ทำงานในภายหลัง) นำการเปลี่ยนแปลงไปใช้กับรายการและพิมพ์
while~-h:b+=[h%%1000];h/=1000
- สร้างรายการของ randoms ที่สร้างขึ้น, การบัญชีสำหรับนำ1
หน้าซึ่งป้องกันปัญหากับศูนย์นำหน้า
while 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]
- (0 = แทรก, 1 = แทนที่, 2 = ลบ)
print"".join(map(chr,L))
- พิมพ์แหล่งที่แก้ไข