\\ move one step forward alongside square spiral move(z) = { my (w=max(abs(real(z)), abs(imag(z)))); if (imag(z)==-w, z+1, real(z)==-w, z-I, imag(z)==+w, z-1, z+I); } \\ index of cell on square spiral index(z) = { my (x=real(z), y=imag(z)); if (x>abs(y), ((2*x-1)^2) + (x+y-1), x>y, 2*-y*(1-2*y) + (x-y), y>=abs(x), 2*y*(2*y-1) + (y-x), (4*x^2) + (-y-x) ); } \\ knight moves dk = concat((2+I) * i3 = powers(I, 3), (2-I) * i3) \\ z -> player board = Map(); attacked(z, player) = { my (c); for (k = 1, #dk, if (mapisdefined(board, z + dk[k], &c) && c != player, return (1); ); ); return (0); } { nb players = 6; zz = vector(nb players); z = 0; n = 0; while (1, for (player = 1, nb players, while (mapisdefined(board, zz[player]) || attacked(zz[player], player), zz[player] = move(zz[player]); ); mapput(board, zz[player], player); ); lim = vecmin(apply(index, zz)); while (index(z) < lim, if (!mapisdefined(board, z), print (n++ " " index(z)); if (n==10 000, break (2); ); ); z = move(z); ); ); } quit