RosettaCodeData/Task/Self-referential-sequence/Icon/self-referential-sequence-1...

39 lines
854 B
Plaintext

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