s = 0 unseen = 1 seen(v) = bit test(s, v) see(v) = s = bit or(s, 2^v); while (seen(unseen), unseen++) T = matrix(W=100*2+1,W) z0 = (1+I)*(W\2+1) get(z) = my (x=real(z+z0),y=imag(z+z0)); if (min(x,y)>0 && max(x,y)<=#T, T[x,y], 0) set(z,v) = my (x=real(z+z0),y=imag(z+z0)); see(T[x,y]=v) dz = vector(4, k, I^k) compute(z) = { my (neighbors=1); for (i=1, #dz, my (zz=z+dz[i], vv=get(zz)); if (vv, neighbors *= vv; ); ); my (allow2 = !seen(2) || neighbors%2==0); my (allow3 = !seen(3) || neighbors%3==0); for (v=unseen, oo, if (!seen(v) && (allow2 || v%2) && (allow3 || v%3), return (v); ); ); } { z=0; n=0; dir=1; for (w=1, oo, for (t=1, 2, for (i=1, w, print (n++ " " v = compute(z)); if (n==#T^2, break (3); ); set(z,v); z+=dir; ); dir*=I; ); ); } quit