s = 0 unseen = 1 seen(v) = bit test(s, v) see(v) = s = bit or(s, 2^v); while (seen(unseen), unseen++) a = vector(10 000 + inc=20) open = 0 \\ mask of current open pairs { for (n=1, #a-inc, if (a[n]==0, for (v=unseen, oo, if (!seen(v), my (h=digits(v)[1]); if (!bittest(open, h) && a[n+1+h]==0, see(a[n] = v); \\ search second term for (w=v+1, oo, if (!seen(w) && digits(w)[1]==h, see(a[n+1+h] = w); break; ); ); open += 2^h; break; ); ); ), open -= 2^digits(a[n])[1] ); print (n " " a[n]) ); } quit