allocate mem() W = 50 T = matrix(2*W+1,2*W+1, i,j, -1) hori = vector(2*W+1) vert = vector(2*W+1) dia1 = vector(4*W+1) dia2 = vector(4*W+1) get(z) = { if (real(z)<-W || real(z)>+W || imag(z)<-W || imag(z)>+W, return (-1), return (T[real(z)+W+1,imag(z)+W+1]); ); } set(z,v) = { my (h=imag(z)+W+1, w=real(z)+W+1, d1=real(z)+imag(z)+2*W+1, d2=real(z)-imag(z)+2*W+1); T[real(z)+W+1,imag(z)+W+1] = v; hori[h] = bitor(hori[h], 2^v); vert[w] = bitor(vert[w], 2^v); dia1[d1] = bitor(dia1[d1], 2^v); dia2[d2] = bitor(dia2[d2], 2^v); } { z=0; n=0; dir=+1; for (l=1, oo, for (t=1, 2, for (s=1, l, my (h=imag(z)+W+1, w=real(z)+W+1, d1=real(z)+imag(z)+2*W+1, d2=real(z)-imag(z)+2*W+1, seen=bitor(bitor(hori[h], vert[w]), bitor(dia1[d1], dia2[d2]))); \\ 8 knight moves for (k=0, 7, my (kz = z + (2+I*(-1)^(k%2)) * I^(k\2), o=get(kz)); if (o>=0, seen = bitor(seen, 2^o); ); ); my (v=valuation(seen+1,2)); print (n " " v); set(z,v); if (n++==(2*W+1)^2, break (3); ); z+=dir; ); dir*=I; ); ); } quit