Berikut adalah versi lain yang disederhanakan secara manual, memindahkan semua inisialisasi dari ekspresi ke dalam pernyataan sendiri:
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)
Inilah yang terjadi:
zadalah string multiline yang berisi semua kode. Itu evaled.
- Di akhir kode,
zditeruskan ke setTimeout. Ia bekerja seperti requestAnimationFramedan evalbersama - sama, mengevaluasinya dalam interval pada tingkat setinggi mungkin.
- Kode itu sendiri diinisialisasi
p, buffer string yang akan ditambahkan HTML, dan n, array bilangan yang dikodekan dengan basis 36 (digabungkan menjadi string oleh "4", komentar menjadi sampah yang tidak relevan yang tidak dipertimbangkan oleh parseInt).
- setiap angka dalam
nmenyandikan satu baris ( n.length == 16). Sekarang disebutkan .
- Sekelompok variabel diinisialisasi, beberapa disamarkan sebagai
eliteral array tetapi kemudian dimasukkan ke angka ( x) atau boolean ( r) atau string ( t) saat digunakan.
- Setiap digit dalam nomor
ttersebut dihitung, membalikkan boolean rsetiap putaran. Untuk sudut yang berbeda x, dan bergantung pada waktu saat ini new Date / 1000 (sehingga memberikan animasi), array ediisi menggunakan beberapa operator bitwise - dengan 1when ris false dan 2s when ris true pada saat itu.
- Kemudian sebuah loop mengulang 61 kolom gambar, dari
x=0122 menjadi 122 dalam langkah ganda, menambahkan karakter tunggal ke p.
Bsebagai garis miring terbalik, string Sdibangun dari string kode zdengan mengosongkan garis miring terbalik dan apostrof, untuk mendapatkan representasi akurat dari apa yang terlihat di sumber.
- Setiap dua angka berurutan dari
editambahkan dan digunakan untuk mengakses karakter dari " *#", untuk membangun gambar animasi. Jika salah satu indeks tidak ditentukan, NaNindeks memutuskan ke karakter yang tidak ditentukan dan sebagai gantinya karakter terkait dari Sstring diambil (lihat rumusnya x/2+61*y-1). Jika karakter itu harus berupa karakter kata , warnanya berbeda menggunakan fontcolormetode String .
- Setelah setiap baris, spasi mundur dan pemutusan baris ditambahkan ke
p, dan string HTML ditugaskan ke badan dokumen.
Bagaimana efek yang sama dapat ditulis ulang untuk contoh minimal?
Berikut contoh lainnya:
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)')
( demo di jsfiddle.net )
Ia memiliki semua hal relevan yang Anda butuhkan untuk jenis animasi ini:
setIntervaldan Dateuntuk animasinya
Rekonstruksi kodenya sendiri ( seperti quine ), di sini:
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
Output melalui document.body.innerHTMLdan <pre>elemen
- Mengganti beberapa bagian kode dengan string animasi