link printf procedure main() every L := !longestselfrefseq(1000000) do every printf(" %i : %i\n",i := 1 to *L,L[i]) end procedure longestselfrefseq(N) #: find longest sequences from 1 to N mlen := 0 every L := selfrefseq(n := 1 to N) do { if mlen <:= *L then ML := [L] else if mlen = *L then put(ML,L) } return ML end procedure selfrefseq(n) #: return list of sequence oeis:A036058 for seed n S := set() L := [] every p := seq(1) do if member(S,n) then return L # ends at a repeat else { insert(S,n) put(L,n) n := nextselfrefseq(n) } end procedure nextselfrefseq(n) #: return next element of sequence oeis:A036058 every (Counts := table(0))[integer(!n)] +:= 1 # count digits every (n := "") ||:= (0 < Counts[i := 9 to 0 by -1]) || i # assemble counts return integer(n) end