big = 1 000 000 s = 0 S = Set([]) unseen = 1 seen(v) = if (v < big, bit test(s, v), set search(S, v)) see(v) = if (v < big, s = bit or(s, 2^v), S = set union(S, Set([v]))); while (seen(unseen), unseen++) base = 10 pos = vector(base, d, -oo) nb = 0 keep(v) = { my (xpos=vector(base, d, -oo), xnb=0, d=digits(v, base)); for (k=1, #d, xnb++; if (xpos[1+d[k]] >= xnb - d[k], return (0), xpos[1+d[k]] = xnb ); ); return (1); } accept(v) = { my (xpos=pos, xnb=nb, d=digits(v, base)); for (k=1, #d, xnb++; if (xpos[1+d[k]] >= xnb - d[k], return (0), xpos[1+d[k]] = xnb ); ); pos = xpos; nb = xnb; return (1); } { for (n=1, 10 000, for (v=unseen, oo, if (!seen(v) && accept(v), see(v); print (n " " v); while (!keep(unseen), see(unseen)); break; ); ); ); } quit