Voici une autre version désobfusquée manuellement, déplaçant toute initialisation de l'expression dans ses propres instructions:
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)
Voici ce qui se passe:
zest une chaîne multiligne contenant tout le code. C'est evaléd.
- À la fin du code,
zest passé à setTimeout. Cela fonctionne comme requestAnimationFrameeteval ensemble, en l'évaluant dans un intervalle au taux le plus élevé possible.
- Le code lui-même s'initialise
p, le tampon de chaîne auquel le HTML sera ajouté et nun tableau de nombres encodés en base 36 (joints en une chaîne par "4", les commentaires étant des déchets non pertinents qui ne sont pas pris en compte par parseInt).
- chaque nombre dans
nencode une ligne ( n.length == 16). Il est maintenant énuméré .
- Un tas de variables est initialisé, certaines déguisées en
elittéral de tableau mais elles sont ensuite converties en nombres ( x) ou booléens ( r) ou en chaînes ( t) lorsqu'ils sont utilisés.
- Chaque chiffre du nombre
test énuméré, inversant le booléen à rchaque tour. Pour différents angles x, et en fonction de l' heure actuelle new Date / 1000 (de sorte qu'il donne une animation), le tableau eest rempli à l'aide de quelques opérateurs au niveau du bit - avec 1quand rest faux et 2s quand rest vrai à ce moment.
- Ensuite, une boucle parcourt les 61 colonnes de l'image, de
x=0à 122 par étapes doubles, en ajoutant des caractères simples à p.
Bétant la barre oblique inverse, la chaîne Sest construite à partir de la chaîne de code zen échappant les barres obliques inverses et les apostrophes, pour obtenir une représentation précise de ce à quoi elle ressemblait dans la source.
- Tous les deux nombres consécutifs de
esont ajoutés et utilisés pour accéder à un personnage de " *#", pour construire l'image animée. Si l'un des indices n'est pas défini, l' NaNindex se résout en un caractère indéfini et à la place le caractère respectif de la Schaîne est pris (consultez la formule x/2+61*y-1). Si ce caractère doit être un caractère de mot , il est coloré différemment à l'aide de la fontcolorméthode String .
- Après chaque ligne, le retour arrière et un saut de ligne sont ajoutés
pet la chaîne HTML est affectée au corps du document.
Comment le même effet pourrait-il être réécrit pour un exemple minimal?
Voici un autre exemple:
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)')
( démo sur jsfiddle.net )
Il contient tout ce dont vous avez besoin pour ce type d'animation:
setIntervalet Datepour l'animation
Une reconstruction de son propre code (à la quine ), ici:
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
La sortie via document.body.innerHTMLet un <pre>élément
- Remplacement de certaines parties du code par la chaîne animée