Kolakoski sequence: Difference between revisions

m (→‎{{header|Python}}: added zkl header)
(→‎{{header|zkl}}: added code)
Line 109:
 
=={{header|zkl}}==
{{trans|Python}}
<lang zkl></lang>
<lang zkl>fcn kolakoski(start_items=List(1, 2), length=20){ //-->List
<lang zkl></lang>
s,rk,cw := List(), Ref(0), Walker.cycle(start_items).next;
Walker.tweak(fcn(s,rk,cw){ // infinite iterator
s.append( c_next:=cw() );
sk:=s[rk.inc()]; // inc returns previous value, ie k++
if(sk>1) s.extend((List.createLong(sk - 1,c_next))); // list of sk cn's
sk
}.fp(s,rk,cw) ).walk(length); // iterate length times
<lang zkl>}</lang>
<lang zkl>fcn _run_len_encoding(truncated_series){ //List-->List
s:=List();
foreach n in (truncated_series){
m:=0; foreach z in (__nWalker){ m+=1; // iterate the iterator
if(n!=z){ __nWalker.push(z); break; }
}
s.append(m and m or 1); // take care of trailing n
}
s
}
fcn is_series_eq_its_rle(series){ //-->Bool
rle:=_run_len_encoding(series);
series[0,rle.len()]==rle
<lang zkl>}</lang>
<lang zkl>foreach sl in (List( L( L(1,2), 20),
L( L(1,3,1,2), 30), L( L(1,3,2,1), 30) )){
start_items, length := sl;
println("First %d members of the series generated from (%s) are:"
.fmt(length,start_items.concat(",")));
println(" (%s)".fmt(( s:=kolakoski(start_items, length) ).concat(",") ));
println(" Does it look like a Kolakoski sequence: ",is_series_eq_its_rle(s) )
}</lang>
{{out}}
<pre>
First 20 members of the series generated from (1,2) are:
(1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1)
Does it look like a Kolakoski sequence: True
First 30 members of the series generated from (1,3,1,2) are:
(1,3,3,3,1,1,1,2,2,2,1,3,1,2,2,1,1,3,3,1,2,2,2,1,3,3,1,1,2,1)
Does it look like a Kolakoski sequence: True
First 30 members of the series generated from (1,3,2,1) are:
(1,3,3,3,2,2,2,1,1,1,1,1,3,3,2,2,1,1,3,2,1,1,1,1,3,3,3,2,2,1)
Does it look like a Kolakoski sequence: False
</pre>
Anonymous user