尽管对挑战进行了编辑以表明可以阅读您的源代码,但我已经在创建解决方案了。因此,为了表明可能,我完成了它。不读取源文件:
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
for r
,并且它为n
和p
初始列表的每个组合打印结果。)
说明:
s='s=%r;print s%%s...';print s%s...
第一行是您的经典quine,但是要花很多时间才能解释后面的内容。
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 =插入,1 =替换,2 =删除)。
p
-修改将在列表中出现的随机位置。
r
-要在列表中插入或替换的随机数
f.write("%03d"*3%(n,p,r))
-将3个随机数附加到源文件的末尾。每次运行时,它将添加一个整数,该整数对已发生的对初始源的所有更改进行编码。
exec'b=[];h=%d...'%1...
-获取随机数(%1
在以后的运行中找到),将更改应用于列表,然后打印。
while~-h:b+=[h%%1000];h/=1000
-建立到目前为止生成的随机变量列表,并考虑前导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))
-打印修改后的源。