นี่คืออีกเวอร์ชันหนึ่งที่ถูกลดความยุ่งเหยิงด้วยตนเองโดยย้ายการเริ่มต้นทั้งหมดออกจากนิพจน์เป็นคำสั่งของตัวเอง
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=0122 pในขั้นตอนที่สองต่อท้ายตัวอักษรเดียว
Bเป็นแบ็กสแลชสตริงSถูกสร้างขึ้นจากสตริงโค้ดzโดยการหลีกเลี่ยงแบ็กสแลชและเครื่องหมายอะพอสทรอฟีเพื่อให้ได้การแสดงที่ถูกต้องของสิ่งที่ดูในแหล่งที่มา
- ทุก ๆ สองหมายเลขติดต่อกัน
eจะถูกเพิ่มและใช้เพื่อเข้าถึงอักขระจาก" *#"เพื่อสร้างภาพเคลื่อนไหว หากไม่ได้กำหนดดัชนีอย่างใดอย่างหนึ่งNaNดัชนีจะเปลี่ยนเป็นอักขระที่ไม่ได้กำหนดและใช้อักขระตามลำดับจากSสตริงแทน (ตรวจสอบสูตรx/2+61*y-1) ถ้าตัวละครที่ควรจะเป็นตัวอักษรคำว่ามันเป็นสีที่แตกต่างกันโดยใช้วิธีการสตริงfontcolor
- หลังจากแต่ละบรรทัดระบบจะเพิ่ม backspace และ linebreak ต่อท้ายและ
pสตริง HTML จะถูกกำหนดให้กับเนื้อหาของเอกสาร
เอฟเฟกต์เดียวกันนี้สามารถเขียนซ้ำได้อย่างไรสำหรับตัวอย่างเล็กน้อย
นี่คือตัวอย่างอื่น ๆ :
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 -like ) ที่นี่:
s = ( "setInterval(z='"
+ z.replace(/[\\\']/g,"\\$&")
+ "\')" )
.match(/.{1,37}/g).join("\\\n");
เอาต์พุตผ่านdocument.body.innerHTMLและ<pre>องค์ประกอบ
- การแทนที่โค้ดบางส่วนด้วยสตริงแบบเคลื่อนไหว