{ tri = vector(500, k, []); rem = #tri * (#tri + 1) / 2; for (k=1, oo, my (f=1/max(k,2), s=Set()); while (f && !setsearch(s, f), for (w=1, oo, my (v=floor(f*2^w)); if (v > #tri, break, v > 0 && #tri[v] < #tri+1-v && (#tri[v]==0 || tri[v][#tri[v]]!=k), tri[v] = concat(tri[v], k); rem--; ); ); s=setunion(s, Set(f)); f=frac(f*2); ); if (rem==0, break; ); ); my (i=0); for (d=1, #tri, for (k=1, d, print (i++ " " tri[d+1-k][k]); ); ); } quit