rainbow previous h = -1; rainbow(h) = { my (h = floor(h*3600) % 3600); if (rainbow previous h != h, print ("color ", h\10, ".", h%10, ":1:.5"); rainbow previous h = h; ); } paint(c) = rainbow(lift(Mod(67,359)*c)/359); allocate mem(2^30) W = 1000 T = matrix(W,W, i,j, -1) hori = vector(W) vert = vector(W) dia1 = vector(2*W+1) dia2 = vector(2*W+1) get(z) = { if (real(z)<1 || real(z)>W || imag(z)<1 || imag(z)>W, return (-1), return (T[real(z),imag(z)]); ); } { for (d=1, W, for (x=1, d, y=d+1-x; z=x+I*y; my (h=imag(z), w=real(z), d1=real(z)+imag(z)-1, d2=real(z)-imag(z)+W, 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)); hori[h] += 2^v; vert[w] += 2^v; dia1[d1] += 2^v; dia2[d2] += 2^v; T[x,y] = v; if (y==1, print (x-1 " " v); ); ); ); } quit