파이썬 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))
온라인으로 사용해보십시오! (이것은 소스를 수정하지 않습니다. 작동하려면 소스를 로컬로 실행해야합니다)
변환이 작동 함을 보여주기 위해 여기에 테스트 프로그램이 있습니다 (현재는 항상 100
for로 설정되어 있으며 초기 목록 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))
-수정 된 소스를 인쇄하십시오.