これは手動で難読化を解除した別のバージョンで、すべての初期化を式から独自のステートメントに移動しています。
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
base-36 でエンコードされた数値の配列 ( によって文字列に結合され"4"
、コメントは によって考慮されない無関係なガベージですparseInt
) を初期化します。
- の各数値は
n
1 行をエンコードします ( n.length == 16
)。現在列挙されています。
- 一連の変数が初期化され、一部は
e
配列リテラルに偽装されますが、使用時に数値 ( x
) またはブール値 ( r
) または文字列 ( t
) にキャストされます。
- 数値の各桁
t
が列挙され、r
各ターンでブール値が反転されます。さまざまな角度の場合、および現在の時間x
に応じて(アニメーションを提供するため)、配列はいくつかのビット単位の演算子を使用して埋められます- when is false およびs when is true その時点で。 new Date / 1000
e
1
r
2
r
- 次に、ループは画像の 61 列
x=0
を 122 まで 2 ステップで反復し、1 文字を に追加しp
ます。
B
S
バックスラッシュであるため、バックスラッシュとアポストロフィをエスケープすることによってコード文字列から文字列が構築されz
、ソースでの外観を正確に表現します。
- からの 2 つの連続する数字ごと
e
に追加され、 からの文字にアクセスするために使用さ" *#"
れ、アニメーション イメージを構築します。インデックスの 1 つが定義されていない場合、インデックスはNaN
未定義の文字に解決され、代わりに文字列からそれぞれのS
文字が取得されます (式を確認してくださいx/2+61*y-1
)。その文字が単語文字である必要がある場合は、 fontcolor
String メソッドを使用して異なる色で表示されます。
- 各行の後に、末尾のバックスペースと改行が に追加され
p
、HTML 文字列がドキュメントの本文に割り当てられます。
最小限の例で同じ効果をどのように書き直すことができるでしょうか?
次に例を示します。
setInterval(z='s=("setInterval(z=\'"+\
z.replace(/[\\\\\']/g,"\\\\$&")+"\')"\
).match(/.{1,37}/g).join("\\\\\\n");d\
ocument.body.innerHTML="<\\pre>"+s.sl\
ice(0, 175)+String( + new Date()).fon\
tcolor("red")+s.slice(188)')
この種のアニメーションに必要な関連事項がすべて含まれています。
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>
要素
コードの一部をアニメーション文字列に置き換える