パイソン2、779の 801バイト
課題はソースの読み取りが許可されていることを示すために編集されましたが、私はすでにそれなしでソリューションを作成していました。それで、それが可能であることを示すために、私はそれを終えました。ソースファイルの読み取りなし:
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)`))
コードの1行目と3行目を削除します。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))
-変更されたソースを印刷します。