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)
end).</lang>
 
% ===Imperative approach (slower)===
<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===
The recursive variant is about 10 times faster than the imperative (using while).
<lang Picat>go =>
time(check(ludic)),
Line 3,331 ⟶ 3,368:
nl.
 
</lang>
% Recursive (faster)
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}}
Output:
<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]
495

edits