파이썬 2 , 779801 바이트
소스를 읽을 수 있음을 보여주기 위해 도전 과제를 편집했지만 이미 그 해결책이없는 솔루션을 만들고있었습니다. 그래서 그것이 가능하다는 것을 보여주기 위해 나는 그것을 끝냈습니다. 소스 파일을 읽지 못했습니다 :
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))
온라인으로 사용해보십시오! (이것은 소스를 수정하지 않습니다. 작동하려면 소스를 로컬로 실행해야합니다)
변환이 작동 함을 보여주기 위해 여기에 테스트 프로그램이 있습니다 (현재는 항상 100for로 설정되어 있으며 초기 목록 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 = 삽입, 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선행 0을 고려하여 지금까지 생성 된 난수 목록을 작성하여 선행 0을 고려하십시오.
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)) -수정 된 소스를 인쇄하십시오.