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); } T = matrix(1+2*M=51, 1+2*M); get(z) = T[1+M+real(z), 1+M+imag(z)] set(z, v) = T[1+M+real(z), 1+M+imag(z)] = v { \\ different ways too place two squares next to the origin to form a right triomino trio = []; for (k=0, 3, d = I^k; trio = concat(trio, [[d, d*I]]); trio = concat(trio, [[d, d*(1+I)]]); trio = concat(trio, [[d, d*(1-I)]]); ); z=0; for (n=0, (1+2*M)^2-1, set(z, -n); \\ nonnegative means unoccupied z = move(z); ); c = 0; \\ triomino counter z=0; for (n=0, (2*M-1)^2-1, if (get(z)<=0, set(z, c++); b = -1; \\ best position mi = oo; \\ least unoccupied index mx = oo; \\ greatest unoccupied index for (t=1, #trio, u = z + trio[t][1]; v = z + trio[t][2]; if (get(u)<=0 && get(v)<=0, mmi = min(-get(u), -get(v)); mmx = max(-get(u), -get(v)); if (mmi < mi || (mmi == mi && mmx < mx), b = t; mi = mmi; mx = mmx; ); ); ); set(z + trio[b][1], c); set(z + trio[b][2], c); ); print (n " " get(z)); z = move(z); ); } quit