Ludic numbers: Difference between revisions
→{{header|Picat}}: Split into subsections. Added {{out}}
No edit summary |
(→{{header|Picat}}: Split into subsections. Added {{out}}) |
||
Line 3,298:
=={{header|Picat}}==
===Recursion===
The recursive variant is about 10 times faster than the imperative (using while).▼
<lang Picat>ludic(N) = Ludic =>▼
ludic(2..N, [1], Ludic).▼
ludic([], Ludic0, Ludic) => ▼
Ludic = Ludic0.reverse().▼
ludic(T, Ludic0, Ludic) =>▼
T2 = ludic_keep(T),▼
ludic(T2,[T[1]|Ludic0],Ludic).▼
% which elements to keep▼
ludic_keep([]) = [].▼
ludic_keep([H|List]) = Ludic =>▼
ludic_keep(H,1,List,[],Ludic).▼
ludic_keep(_H,_C,[],Ludic0,Ludic) ?=>▼
Ludic = Ludic0.reverse().▼
ludic_keep(H,C,[H1|T],Ludic0,Ludic) =>▼
(▼
C mod H > 0 ->▼
ludic_keep(H,C+1,T,[H1|Ludic0],Ludic)▼
;▼
ludic_keep(H,C+1,T,Ludic0,Ludic)▼
<lang Picat>ludic2(N) = Ludic =>▼
A = 1..N,▼
Ludic = [1],▼
A := delete(A, 1),▼
while(A.length > 0)▼
T = A[1],▼
Ludic := Ludic ++ [T],▼
A := delete(A,T),▼
A := [A[J] : J in 1..A.length, J mod T > 0]▼
end.</lang>
===Test===
<lang Picat>go =>
time(check(ludic)),
Line 3,331 ⟶ 3,368:
nl.
</lang>
▲ludic(N) = Ludic =>
▲ ludic(2..N, [1], Ludic).
▲ludic([], Ludic0, Ludic) =>
▲ Ludic = Ludic0.reverse().
▲ludic(T, Ludic0, Ludic) =>
▲ T2 = ludic_keep(T),
▲ ludic(T2,[T[1]|Ludic0],Ludic).
▲% which elements to keep
▲ludic_keep([]) = [].
▲ludic_keep([H|List]) = Ludic =>
▲ ludic_keep(H,1,List,[],Ludic).
▲ludic_keep(_H,_C,[],Ludic0,Ludic) ?=>
▲ Ludic = Ludic0.reverse().
▲ludic_keep(H,C,[H1|T],Ludic0,Ludic) =>
▲ (
▲ C mod H > 0 ->
▲ ludic_keep(H,C+1,T,[H1|Ludic0],Ludic)
▲ ;
▲ ludic_keep(H,C+1,T,Ludic0,Ludic)
▲% Imperative approach (slower)
▲ludic2(N) = Ludic =>
▲ A = 1..N,
▲ Ludic = [1],
▲ A := delete(A, 1),
▲ while(A.length > 0)
▲ T = A[1],
▲ Ludic := Ludic ++ [T],
▲ A := delete(A,T),
▲ A := [A[J] : J in 1..A.length, J mod T > 0]
▲ end.</lang>
{{out}}
<pre>ludicFunc = ludic
first_25 = [1,2,3,5,7,11,13,17,23,25,29,37,41,43,47,53,61,67,71,77,83,89,91,97,107]
|