Как сжать скрипт до невозможности?

Демка с конкурса js1k.

Конечно, возникает вопрос, как такое чудо можно сжать до 1024 байта. На странице с описанием представлен сорц:
for(_='atZMZh.YYsin(X*Xe/8W++)V>s;sVUfor(TUToSXo)R255Q256P&QOO*PN16L=0;KKL>J)+&&),]=>><<10|a+p+4210943TsK],=[L*p[9858122,1-,63+Rfunction([d]ImageDZa(var =-1;2>	)*n+(e()*(n);TdK3>d;dVp;e[l++=e,t,n){returnYrandom()1023tne=(j=c.creZeM=a.width/=4,k=a.height/=4)).dZa;r(tLL6|(tNNN|(tOO};i 4+3W)W+t/5)};2e7Uo=s18&63,n[so<=i(s&,s10O)?2>o?1:2:0;S=*,u=Q*,a=i(o,uf	f;fVTl	l;lVTp	p;pV2<an[o|u185)f*l*pn[o+f|u+l484);TaJa;aV3SJo;oVTuJu;uVp=/3,f=2>a?:5>a?6990400:l=X2*uu/8,sp/=1.5+s/2)2==ao>l+1f=p*=1/ot[u+(15-oP*s+*ar(0,f,p);setInterval(){o=new DZe/0,u=Ycos(Ra=XRf=[o%,i(o%2hpd=m=lKkSKM>o;oV{v=o/k-1,g=[a*v+u,.5s/k,a-u*vb=32;TqK3>q;qV{w=g[qv=f[q]-~~f[qD=1/w;0<w?v=v:D=-D;I=D*v=f+(h=g*D)*v;T0>wq]--;I<b;){(w=n[0]&|(1]&63)8|(2]O)0])b=I,v=0d=2qv+=d,d=1]m=t[(v&15(d&15*w+P*q])+=h;I+=D}}m=r(m,3*,b*b/)mLOm8OmOQ}c.putj,0,0)},L)';g=/[^ -IM[-~]/.exec(_);)with(_.split(g))_=join(shift());eval(_)
Я пользовался closure compiler и uglify, но они просто оптимизируют код. А тут представлен какой-то хак с eval, о котором я не знаю. Вопрос: как подобным образом сжать код?
  • Вопрос задан
  • 2447 просмотров
Пригласить эксперта
Ответы на вопрос 2
deadbyelpy
@deadbyelpy
веб-шмеб
т.к. там выполняется отрисовка которая имеет начало и конец, а в конце начинается сначала, думаю что:
внутри переменной "_" содержится код для отрисовки
за одну итерацию выполняется изменение содержимого этой переменной, чтобы показать дальше текстуры
причем, это сделано так, что после очередного изменения код возвращается к исходному виду.
получается вечный цикл for, внутри которого содержится переменная, содержимое которой меняется кажду итерацию, и она имеет циклическую зависимость.
т.е. после минификации кода, вы можете добиться только примерно того что было в переменной "_"
сделать так, чтобы содержимое переменной менялось, не сложно. сложно сделать это изменение замкнутым. тут уш сами разбиратесь, вероятно логика схожа с созданием квайнов.
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Вся магия не в eval а в состовлении строки. Проследите логику.

var codes = 'atZMZh.YYsin(X*Xe/8W++)V>s;sVUfor(TUToSXo)R255Q256P&QOO*PN16L=0;KKL>J)+&&),]=>><<10|a+p+4210943TsK],=[L*p[9858122,1-,63+Rfunction([d]ImageDZa(var =-1;2>	)*n+(e()*(n);TdK3>d;dVp;e[l++=e,t,n){returnYrandom()1023tne=(j=c.creZeM=a.width/=4,k=a.height/=4)).dZa;r(tLL6|(tNNN|(tOO};i 4+3W)W+t/5)};2e7Uo=s18&63,n[so<=i(s&,s10O)?2>o?1:2:0;S=*,u=Q*,a=i(o,uf	f;fVTl	l;lVTp	p;pV2<an[o|u185)f*l*pn[o+f|u+l484);TaJa;aV3SJo;oVTuJu;uVp=/3,f=2>a?:5>a?6990400:l=X2*uu/8,sp/=1.5+s/2)2==ao>l+1f=p*=1/ot[u+(15-oP*s+*ar(0,f,p);setInterval(){o=new DZe/0,u=Ycos(Ra=XRf=[o%,i(o%2hpd=m=lKkSKM>o;oV{v=o/k-1,g=[a*v+u,.5s/k,a-u*vb=32;TqK3>q;qV{w=g[qv=f[q]-~~f[qD=1/w;0<w?v=v:D=-D;I=D*v=f+(h=g*D)*v;T0>wq]--;I<b;){(w=n[0]&|(1]&63)8|(2]O)0])b=I,v=0d=2qv+=d,d=1]m=t[(v&15(d&15*w+P*q])+=h;I+=D}}m=r(m,3*,b*b/)mLOm8OmOQ}c.putj,0,0)},L)';
for (_ = codes; g = /[^ -IM[-~]/.exec(_); ) with (_.split(g)) {
    _ = join(shift());
}


Еще чуть упростим для понимания:
for (_ = codes; g = /[^ -IM[-~]/.exec(_); ) {
    var parts = _.split(g);
    _ = parts.join(str.shift());
}


То есть у нас строка с частями скриптов, которая разделяется символами так, что бы небыло коллизий. Ну и цикл будет продожать работать до тех пор пока мы не получим скрипт. Примерно такой

(не финальная версия, просто торопился и откровенно говоря лень)
) * n + (e() * (n);
        for (d = 0; 3 > d; d++) p; e[l++ = e, t, n) {
            returnMath.random() 1023tne = (j = c.createM = a.width /= 4, k = a.height /= 4)).data; r(t16166 | (t & 255 * 256 & 255 * 256 & 255 * 256 | (t & 255 & 255
            }; i 4 + 3 * Math.sin(e / 8) * Math.sin(e / 8 + t / 5)
        }; 2e7 > s; s++) o = s18 & 63, n[so <= i(s & , s10 & 255) ? 2 > o ? 1 : 2 : 0; > s; s++) for (o = * , u = 255 * , a = i(o, uf) + && ), ] => > << 10 | a + p + 4210943for(s = 0;], = [16 * p[9858122, 1 - , 63 + Math.sin(o)function([d] ImageData(var = -1; 2 > f; f++) for (l) + && ), ] => > << 10 | a + p + 4210943for(s = 0;], = [16 * p[9858122, 1 - , 63 + Math.sin(o)function([d] ImageData(var = -1; 2 > l; l++) for (p) + && ), ] => > << 10 | a + p + 4210943for(s = 0;], = [16 * p[9858122, 1 - , 63 + Math.sin(o)function([d] ImageData(var = -1; 2 > p; p++) 2 < an[o | u185) f * l * pn[o + f | u + l484);
                    for (a = 0; 16 > a; a++) 3 > s; s++) for (o = 0; 16 > o; o++)
                    for (u = 0; 16 > u; u++) p = /3,f=2>a?:5>a?6990400:l=Math.sin(2*uu/8, sp /= 1.5 + s / 2) 2 == ao > l + 1f = p *= 1 / ot[u + (15 - o256 * s + * ar(0, f, p); setInterval() {
                            o = new Date / 0, u = Math.cos(Math.sin(o) a = Math.sin(Math.sin(o) f = [o % , i(o % 2hpd = m = l = 0; k > s; s++) for (o = 0; M > o; o++) {
                                            v = o / k - 1, g = [a * v + u, .5s / k, a - u * vb = 32;
                                                for (q = 0; 3 > q; q++) {
                                                    w = g[qv = f[q] - ~~f[qD = 1 / w; 0 < w ? v = v : D = -D; I = D * v = f + (h = g * D) * v;
                                                        for (0 > wq] --; I < b;) {
                                                        (w = n[0] & | (1] & 63) 8 | (2] & 255) 0]) b = I, v = 0d = 2qv += d, d = 1
                                            ] m = t[(v & 15(d & 15 * w + 256 * q]) += h; I += D
                                            }
                                        }
                                        m = r(m, 3 * , b * b / ) m16 & 255m8 & 255m & 255255
                                    }
                                    c.putj, 0, 0)
                            }, 16)

видимо где-то что-то напутал и пропустил скобки... ну да не суть. Попробуйте сами распотрошить этот код.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы