Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
56
Task/Hailstone-sequence/Picat/hailstone-sequence-1.picat
Normal file
56
Task/Hailstone-sequence/Picat/hailstone-sequence-1.picat
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
import util.
|
||||
|
||||
go =>
|
||||
println("H27:"),
|
||||
H27 = hailstoneseq(27),
|
||||
H27Len = H27.len,
|
||||
println(len=H27.len),
|
||||
println(take(H27,4)++['...']++drop(H27,H27Len-4)),
|
||||
nl,
|
||||
|
||||
println("Longest sequence < 100_000:"),
|
||||
longest_seq(99_999),
|
||||
|
||||
nl.
|
||||
|
||||
% The Hailstone value of a number
|
||||
hailstone(N) = N // 2, N mod 2 == 0 => true.
|
||||
hailstone(N) = 3*N+1, N mod 2 == 1 => true.
|
||||
|
||||
% Sequence for a number
|
||||
hailstoneseq(N) = Seq =>
|
||||
Seq := [N],
|
||||
while (N > 1)
|
||||
N := hailstone(N),
|
||||
Seq := Seq ++ [N]
|
||||
end.
|
||||
|
||||
%
|
||||
% Use a map to cache the lengths.
|
||||
% Here we don't care about the actual sequence.
|
||||
%
|
||||
longest_seq(Limit) =>
|
||||
Lens = new_map(), % caching the lengths
|
||||
MaxLen = 0,
|
||||
MaxN = 1,
|
||||
|
||||
foreach(N in 1..Limit-1)
|
||||
M = N,
|
||||
CLen = 1,
|
||||
while (M > 1)
|
||||
if Lens.has_key(M) then
|
||||
CLen := CLen + Lens.get(M) - 1,
|
||||
M := 1
|
||||
else
|
||||
M := hailstone(M), % call the
|
||||
CLen := CLen + 1
|
||||
end
|
||||
end,
|
||||
Lens.put(N, CLen),
|
||||
if CLen > MaxLen then
|
||||
MaxLen := CLen,
|
||||
MaxN := N
|
||||
end
|
||||
end,
|
||||
println([maxLen=MaxLen, maxN=MaxN]),
|
||||
nl.
|
||||
17
Task/Hailstone-sequence/Picat/hailstone-sequence-2.picat
Normal file
17
Task/Hailstone-sequence/Picat/hailstone-sequence-2.picat
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
go2 =>
|
||||
time(max_chain(MaxN,MaxLen)),
|
||||
printf("MaxN=%w,MaxLen=%w%n",MaxN,MaxLen).
|
||||
|
||||
table (-,max)
|
||||
max_chain(N,Len) =>
|
||||
between(2,99_999,N),
|
||||
gen(N,Len).
|
||||
|
||||
table (+,-)
|
||||
gen(1,Len) => Len=1.
|
||||
gen(N,Len), N mod 2 == 0 =>
|
||||
gen(N div 2,Len1),
|
||||
Len=Len1+1.
|
||||
gen(N,Len) =>
|
||||
gen(3*N+1,Len1),
|
||||
Len=Len1+1.
|
||||
Loading…
Add table
Add a link
Reference in a new issue