Đây là một phiên bản khác được giải mã theo cách thủ công, chuyển tất cả khởi tạo ra khỏi biểu thức thành các câu lệnh riêng:
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)
Đây là những gì sẽ xảy ra:
zlà một chuỗi nhiều dòng chứa tất cả mã. Nó làeval ed.
- Vào cuối mã,
zđược chuyển đến setTimeout. Nó hoạt động giống nhau requestAnimationFramevà evalcùng nhau, đánh giá nó trong một khoảng thời gian với tỷ lệ cao nhất có thể.
- Bản thân mã khởi tạo
p, bộ đệm chuỗi mà HTML sẽ được thêm vào và n, một mảng các số được mã hóa cơ sở 36 (được nối thành một chuỗi bởi "4", các nhận xét là rác không liên quan không được xem xét parseInt).
- mỗi số trong
nmã hóa một dòng ( n.length == 16). Nó bây giờ được liệt kê .
- Một loạt các biến được khởi tạo, một số biến được ngụy trang dưới dạng
eký tự mảng nhưng sau đó chúng được chuyển thành số ( x) hoặc booleans ( r) hoặc chuỗi (t ) khi được sử dụng.
- Mỗi chữ số trong số
tđược liệt kê, đảo ngược boolean rmỗi lượt. Đối với các góc khác nhau xvà tùy thuộc vào thời điểm hiện tại new Date / 1000 (để nó tạo ra hình ảnh động), mảng eđược lấp đầy bằng cách sử dụng một số toán tử bitwise - với 1khi nào rlà sai và 2s khi nào rlà đúng tại thời điểm đó.
- Sau đó, một vòng lặp lặp lại 61 cột của hình ảnh, từ
x=0đến 122 trong các bước kép, thêm các ký tự đơn vào p.
Blà dấu gạch chéo ngược, chuỗi Sđược xây dựng từ chuỗi mã zbằng cách thoát khỏi dấu gạch chéo ngược và dấu nháy đơn, để có được sự trình bày chính xác về những gì nó trông trong nguồn.
- Mỗi hai số liên tiếp từ
eđược thêm vào và được sử dụng để truy cập một ký tự từ đó " *#", để xây dựng hình ảnh động. Nếu một trong các chỉ số không được xác định, NaNchỉ mục sẽ giải quyết thành một ký tự không xác định và thay vào đó, ký tự tương ứng từ Schuỗi được lấy (kiểm tra công thức x/2+61*y-1). Nếu ký tự đó phải là một ký tự từ , nó sẽ được tô màu khác bằng cách sử dụng fontcolorphương thức Chuỗi .
- Sau mỗi dòng, khoảng trắng sau cùng và dấu ngắt dòng được thêm vào
pvà chuỗi HTML được gán cho nội dung tài liệu.
Làm thế nào hiệu ứng tương tự có thể được viết lại cho một ví dụ tối thiểu?
Đây là một ví dụ khác:
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 tại jsfiddle.net )
Nó có tất cả những thứ liên quan mà bạn cần cho loại hoạt hình này:
setIntervalvà Datecho hoạt hình
Một bản tái tạo mã của chính nó ( giống như quine ), ở đây:
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
Đầu ra thông qua document.body.innerHTMLvà một <pre>phần tử
- Thay thế một số phần của mã bằng chuỗi động