T = matrix(1+2*W=50, 1+2*W) out(z) = max(abs(real(z)), abs(imag(z)))>W get(z) = T[real(z)+1+W, imag(z)+1+W] set(z,v) = if (!out(z), T[real(z)+1+W, imag(z)+1+W] = v) \\ move alongside a 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); } { z=0; zz=0; r=0; t=1; while (!out(z), if (!get(z), print (n++ " " t); for (k=1, t, if (out(k*z), break, set(k*z,t); ); ); if (r++==get(zz), r=0; zz=move(zz); t = if (t==1, 2, 1); ); ); z=move(z); ); } quit