RosettaCodeData/Task/Hamming-numbers/Picat/hamming-numbers.picat
2023-07-01 13:44:08 -04:00

22 lines
639 B
Text

go =>
println([hamming(I) : I in 1..20]),
time(println(hamming_1691=hamming(1691))),
time(println(hamming_1000000=hamming(1000000))),
nl.
hamming(1) = 1.
hamming(2) = 2.
hamming(3) = 3.
hamming(N) = Hamming =>
A = new_array(N),
[Next2, Next3, Next5] = [2,3,5],
A[1] := Next2, A[2] := Next3, A[3] := Next5,
I = 0, J = 0, K = 0, M = 1,
while (M < N)
A[M] := min([Next2,Next3,Next5]),
if A[M] == Next2 then I := I+1, Next2 := 2*A[I] end,
if A[M] == Next3 then J := J+1, Next3 := 3*A[J] end,
if A[M] == Next5 then K := K+1, Next5 := 5*A[K] end,
M := M + 1
end,
Hamming = A[N-1].