Use the arrow keys. Collect the five green dots on the map, then go to the lower right edge.
for(j='|0YY]X=>W)WV"#U1,T(p,Q++Pg(Os(N), 2,0 N)),e==u=v=32)||.xMath.random()*32Y+1U0f0"for(.y0,u/y/.01Array(3);=(a,b.fil,3,3=C(I,o(t(L/20 VNa;k[Pi]&&[...(k=3].map((r,clStyle=G.addColorStop(clRect(=[N--,N]ter(eWOC(x=0;x<u;xP)y=0;y<v;yP)onkeyup=onkeydown=xWk[x.which]=x.type[5];f=rW{s=aV({x:a,y:b} M=yVxVx%2&y% I=N1.5 2,p=NR=3 C+b,a+b o/b,a/b t=pWNcoNp sin(p,g=pW(M[pX0)[pX|SVM[aX[aX=b;R&SQ2){if(!(Ap1[B=d=E=L=0]!(l=CQA[A.lengthX){Oq=Nx+Ty+1-1(FD=q[0])&&(p=C(F,l=D R=x=y=uR--}S(o(CQp=l ,}u=Tv=5;S(N, 3)};f((m=jW{OI)-3S(I,|EP;i=36L--BPLPB--;On 396/(d-(d=-j/(B/=1.6&&(I=nI+I<62E&&E%5f(G=c.createLinearGradient(u=400U24f".5,h=Ufff"TU333"u,uv=1e4;w +(H=x/u-.5,150/y*coNH Ow)%3(Ow)-3?"rgb("+)l(175+25*((w+w)%3Y)+y/30Y):,x,200-/2,T y=v3;[U000",,h,][M[y][x]],x*3,y*3"red";I*3-TI*3-193,93requestAnimationFrame(m)})()';G=/[^!-MRS[-}]/.exec(j);)with(j.split(G))j=join(shift());eval(j)
Zm9yKGo9J3wwWVldWD0+VylXViIjVTEsVChwLFErK1BnKE9zKE4pLCAyLDAgTh8pKR4sZR49PR11PXY9MxwyKRt8fBoueBlNYXRoLhgYcmFuZG9tKCkqFxczMlkrMRZVMGYwIhVmb3IoFC55EzAsEnUveS8uMDERQXJyYXkoMxApOw89KGEsYg4uZmlsDCwzLDMPCz1DKEksbyh0KEwvMjAJDlZOYRkIO2tbUGldJiYHWy4uLihrPRAzHl0ubWFwKChyLAZjDGxTdHlsZT0FD0cuYWRkQ29sb3JTdG9wKARjDGxSZWN0KAM9W04tHx8SLRssThIbXQx0ZXIoZVdPQygCFHg9MDt4PHU7eFApFHk9MDt5PHY7eVApAW9ua2V5dXA9b25rZXlkb3duPXhXa1t4LndoaWNoXT14LnR5cGVbNV07Zj1yV3sUcw49YVYoe3g6YSx5OmJ9IE09BnlWBnhWeCUyJnklGyBJPU4xLjUgHDIscD1OUj0zIEMIK2IZLGETK2ITIG8IL2IsYRMvYiB0PXBXThhjb05wIBhzaW4ocB4sZz1wVyhNW3ATWBowKVtwGVh8ElMOVk1bYRNYW2EZWD1iO1ImU1EyDyl7aWYoIShBAnAdMR5bQj1kPUU9TD0wXRohKGw9Q1FBWxdBLmxlbmd0aFgeKXsBT3E9TngrVHkrMR4tMRooRgJEPXEdG1swXSkmJihwPUMoRixsPUQgUj14PXk9dQ9SLS19UyhvKENRcD1sIBssG311PVR2PTU7AVMoThYsFiAzKX07ZigPKG09ald7T0kpLTMaUyhJLBt8RVA7aT0zNgdMLS0HQlAHTFAHQi0tO09uCSAzOTYvKGQtKGQ9LWoeLyhCLz0xLjYeHiYmKEk9bg9JGStJEzw2MhpFJiZFJTUaZigPBUc9Yy5jcmVhdGVMaW5lYXJHcmFkaWVudCgSEhJ1PTQwMAQSVTI0ZiIELjUsaD1VZmZmIgRUVTMzMyIPAxISdSx1D3Y9MWU0OwF3CSsoSD14L3UtLjUeLDE1MC95Khhjb05IHiBPdyklMxooBU93KS0zPyJyZ2IoIisQKQxsKDE3NSsyNSooKHcZK3cTKSUzWSkreS8zMFkpOhUsA3gsMjAwLREvMixUESB5PXYPHDM7AQVbVTAwMCIsLGgsFV1bTVt5XVt4XV0sA3gqMyx5KjMLBSJyZWQiOwNJGSozLVRJEyozLTELAzkzLDkzC3JlcXVlc3RBbmltYXRpb25GcmFtZShtKX0pKCknO0c9L1teIS1NUlNbLX1dLy5leGVjKGopOyl3aXRoKGouc3BsaXQoRykpaj1qb2luKHNoaWZ0KCkpO2V2YWwoaik=
onkeyup = onkeydown = x => k[x.which] = x.type[5];
f = r => {
for (s = (a, b = a) => ({ x: a, y: b }),
M = [...(k = Array(33))].map((r, y) => [...(k = Array(33))].map((r, x) => x % 2 & y % 2)),
I = s(1.5),
u = v = 32,
p = s(Q=3),
C = (a, b) => s(a.x + b.x, a.y + b.y),
o = (a, b) => s(a.x / b, a.y / b),
t = p => s(Math.cos(p), Math.sin(p)),
g = p => (M[p.y | 0] || 0)[p.x | 0] | 0,
S = (a, b) => M[a.y | 0][a.x | 0] = b;
Q&S(p,2);) {
if (!(A = [s(-2, 0), s(2, 0), s(0, -2), s(0, 2)].filter(e => g(C(p, e)) == 1))[B = U = E = L = 0] || !(l = C(p, A[Math.random() * A.length | 0]))) {
for (x = 0; x < u; x++)
for (y = 0; y < v; y++)
g(Z = s(x + 1, y + 1)) - 1 || (J = [s(-2, 0), s(2, 0), s(0, -2), s(0, 2)].filter(e => g(C(D=Z, e)) == 2)[0]) && (p = C(J, l = D), Q = x = y = u);
Q--
}
S(o(C(p, p = l), 2), 2)
}
u=1,v = 5;
for (x = 0; x < u; x++)
for (y = 0; y < v; y++)
S(s(Math.random() * 32 | 0 + 1, Math.random() * 32 | 0 + 1), 3)
};f();
(Y = _ => {
g(I) - 3 || S(I, 2) | E++;
i = 36;
k[++i] && L--;
k[++i] && B++;
k[++i] && L++;
k[++i] && B--;
g(n = C(I, o(t(L/20),396 / (U - (U = -_)) / (B/=1.6)))) && (I = n);
I.x + I.y < 62 || E && E % 5 || f();
c.fillStyle=P=c.createLinearGradient(0,0,0,u=400);
P.addColorStop(0, "#24f");
P.addColorStop(.5,V="#fff");
P.addColorStop(1,"#333");
c.fillRect(0, 0, u, u);
v = 1e4;
for (x = 0; x < u; x++)
for (y = 0; y < v; y++)
w = C(I, o(t(L/20 + (z = x / u - .5)), 150 / y * Math.cos(z))), g(w)%3 || (c.fillStyle = g(w) - 3 ? "rgb("+Array(3).fill(175 + 25 * ((w.x + w.y) % 3 | 0) + y / 30 | 0) : "#0f0", c.fillRect(x, 200 - u / y / .01 / 2, 1, u/y/.01), y = v);
u = v = 33;
for (x = 0; x < u; x++)
for (y = 0; y < v; y++)
c.fillStyle = ["#000", , V, "#0f0"][M[y][x]], c.fillRect(x * 3, y * 3, 3, 3);
c.fillStyle = "red";
c.fillRect(I.x * 3 - 1, I.y * 3 - 1, 3, 3);
c.fillRect(93, 93, 3, 3);
requestAnimationFrame(Y)
})()