다음은 수동으로 난독 해제 된 또 다른 버전으로, 모든 초기화를 표현에서 벗어나 자신의 명령문으로 이동합니다.
z='p="<"+"pre>"/* ,.oq#+ ,._, */;for(y in n="zw24l6k\
4e3t4jnt4qj24xh2 x/* =<,m#F^ A W###q. */42kty24wrt413n243n\
9h243pdxt41csb yz/* #K q##H######Am */43iyb6k43pk7243nm\
r24".split(4)){/* dP cpq#q##########b, */for(a in t=pars\
eInt(n[y],36)+/* p##@###YG=[#######y */(e=x=r=[]))for\
(r=!r,i=0;t[a/* d#qg `*PWo##q#######D */]>i;i+=.05)wi\
th(Math)x-= /* aem1k.com Q###KWR#### W[ */.05,0>cos(o=\
new Date/1e3/* .Q#########Md#.###OP A@ , */+x/PI)&&(e[~\
~(32*sin(o)*/* , (W#####Xx######.P^ T % */sin(.5+y/7))\
+60] =-~ r);/* #y `^TqW####P###BP */for(x=0;122>\
x;)p+=" *#"/* b. OQ####x#K */[e[x++]+e[x++\
]]||(S=("eval"/* l `X#####D , */+"(z=\'"+z.spl\
it(B = "\\\\")./* G####B" # */join(B+B).split\
(Q="\'").join(B+Q/* VQBP` */)+Q+")//m1k")[x/2\
+61*y-1]).fontcolor/* TP */(/\\w/.test(S)&&"#\
03B");document.body.innerHTML=p+=B+"\\n"}setTimeout(z)';
p = "<" + "pre>";
n = ["zw2", "l6k", "e3t", "jnt", "qj2", "xh2 x/* =<,m#F^ A W###q. */", "2kty2", "wrt", "13n2", "3n9h2", "3pdxt", "1csb yz/* #K q##H######Am */", "3iyb6k", "3pk72", "3nmr2", ""]
for (y in n) {
e = [];
x = 0;
r = true;
t = parseInt(n[y], 36) + "";
for (a in t) {
r = !r
for (i = 0; i < t[a]; i += 0.05) {
x -= 0.05;
o = new Date / 1e3 + x / Math.PI
if (Math.cos(o) < 0)
e[~~(32 * Math.sin(o) * Math.sin(0.5 + y / 7)) + 60] = -~r;
}
for (x = 0; x < 122;) {
S = "eval" + "(z='" + z.split(B = "\\").join(B + B).split(Q = "'").join(B + Q) + Q + ")//m1k"
p += " *#"[e[x++] + e[x++]] || S[x/2+61*y-1]).fontcolor(/\w/.test(S[x/2+61*y-1]) && "#03B");
}
p += B + "\n";
document.body.innerHTML = p;
}
setTimeout(z)
다음은 발생합니다.
z모든 코드를 포함하는 여러 줄 문자열입니다. 그것은eval 에드.
- 코드 끝에서는
z에 전달됩니다 setTimeout. 그것은 같이 requestAnimationFrame그리고 eval함께 작동 하여 가능한 한 가장 높은 속도로 간격을두고 평가합니다.
- 코드 자체가 초기화됩니다.
p 는 HTML이 추가 될 문자열 버퍼 및 n기본 36으로 인코딩 된 숫자의 배열을 합니다 (에서 문자열에 조인되고 "4"주석은에서 고려되지 않는 관련없는 쓰레기 parseInt임).
- 의 각 숫자는
n한 줄 ( n.length == 16)을 인코딩 합니다. 이제 열거 됩니다.
- 많은 변수가 초기화되고 일부는
e일련 배열 리터럴 하지만 사용시 숫자 ( x), 부울 ( r) 또는 문자열 ( t) 로 캐스트 됩니다.
- 숫자의 각 숫자
t가 열거되어 r매 턴마다 부울이 반전 됩니다. 다른 각도의 x경우 및 현재 시간 에 따라 new Date / 1000(애니메이션을 제공하도록) 배열 e은 일부 비트 연산자 를 사용하여 채워집니다. -로 1될 때 r잘못된이고 2때이야r 그 때 그러하다.
- 그런 다음 루프는 이미지의 61 개 열을 반복합니다.
x=0 두 번의 단계로 122 개 하여 단일 문자를p .
B백 슬래시 인 문자열 S은 코드 문자열에서 빌드됩니다.z 백 슬래시와 아포스트로피를 이스케이프 소스에서 보이는 내용을 정확하게 표현합니다.
- 의 두 연속 번호
e가 추가되고에서 캐릭터에 액세스 " *#"하여 애니메이션 이미지를 만드는 데 사용됩니다 . 인덱스 중 하나가 정의되지 않은 경우 인덱스는 정의 NaN되지 않은 문자로 확인되고 대신 S문자열 의 각 문자를 가져옵니다 (공식 확인 x/2+61*y-1). 해당 문자가 단어 문자 여야 하는 경우fontcolor String 메서드를 됩니다.
- 각 줄 뒤에 후행 백 스페이스와 줄 바꿈이에 추가되고
pHTML 문자열이 문서 본문에 할당됩니다.
최소한의 예에서 동일한 효과를 어떻게 다시 작성할 수 있습니까?
다음은 다른 예입니다.
setInterval(z='s=("setInterval(z=\'"+\
z.replace(/[\\\\\']/g,"\\\\$&")+"\')"\
).match(/.{1,37}/g).join("\\\\\\n");d\
ocument.body.innerHTML=\"<\\pre>"+s.s\
lice(0, 175)+String( + new Date()).fo\
ntcolor("red")+s.slice(188)')
( jsfiddle.net의 데모 )
이러한 종류의 애니메이션에 필요한 모든 관련 항목이 있습니다.
setInterval 과 Date 애니메이션
자체 코드 ( quine 유사) 의 재구성은 다음 과 같습니다.
s = ( "setInterval(z='" // the outer invokation
+ z.replace(/[\\\']/g,"\\$&") // the escaped version
+ "\')" ) // the end of the assignment
.match(/.{1,37}/g).join("\\\n"); // chunked into lines
document.body.innerHTML및 <pre>요소 를 통한 출력
- 코드의 일부를 애니메이션 문자열로 바꾸기