RosettaCodeData/Task/Self-referential-sequence/Zkl/self-referential-sequence.zkl

33 lines
1.1 KiB
Plaintext

N:=0d1_000_001;
fcn lookAndJustSaying(seed){ // numeric String --> numeric String
"9876543210".pump(String,'wrap(n){
(s:=seed.inCommon(n)) and String(s.len(),n) or ""
});
}
fcn sequence(seed){ // numeric string --> sequence until it repeats
seq:=L();
while(not seq.holds(seed)){ seq.append(seed); seed=lookAndJustSaying(seed); }
seq
}
fcn decending(str) //--> True if digits are in descending (or equal) order
{ (not str.walker().zipWith('<,str[1,*]).filter1()) }
szs:=List.createLong(25); max:=0;
foreach seed in (N){
z:=seed.toString();
if(decending(z)){ // 321 generates same sequence as 312,132,123,213
len:=sequence(z).len();
if(len>max) szs.clear();
if(len>=max){ szs.append(seed.toString()); max=len; }
}
}
// List permutations of longest seeds
// ("9900"-->(((9,0,0,9),...))-->((9,0,0,9),...)-->("9009"...)
// -->remove numbers w/leading zeros-->remove dups
zs:=szs.apply(Utils.Helpers.permute).flatten().apply("concat")
.filter(fcn(s){ s[0]!="0" }) : Utils.Helpers.listUnique(_);
println(max," iterations for ",zs.concat(", "));
zs.pump(Console.println,sequence,T("concat",", "));