62 lines
1.3 KiB
Plaintext
62 lines
1.3 KiB
Plaintext
function hail(integer n)
|
|
if remainder(n,2)=0 then
|
|
n /= 2
|
|
else
|
|
n = 3*n+1
|
|
end if
|
|
return n
|
|
end function
|
|
|
|
function step(integer edx)
|
|
integer n = getd("hail",edx)
|
|
if n=1 then return 0 end if
|
|
n = hail(n)
|
|
setd("hail",n,edx)
|
|
setd("count",getd("count",edx)+1,edx)
|
|
setd("results",getd("results",edx)&n,edx)
|
|
return 1
|
|
end function
|
|
|
|
sequence dicts = {}
|
|
|
|
procedure main()
|
|
for i=1 to 12 do
|
|
integer d = new_dict()
|
|
setd("hail",i,d)
|
|
setd("count",0,d)
|
|
setd("results",{i},d)
|
|
dicts &= d
|
|
end for
|
|
|
|
bool done = false
|
|
while not done do
|
|
done = true
|
|
for i=1 to 12 do
|
|
if step(dicts[i]) then
|
|
done = false
|
|
end if
|
|
end for
|
|
end while
|
|
|
|
done = false
|
|
integer i = 1
|
|
while not done do
|
|
done = true
|
|
for j=1 to 12 do
|
|
sequence res = getd("results",dicts[j])
|
|
if i<length(res) then done = false end if
|
|
puts(1,iff(i<=length(res)?sprintf("%4d",{res[i]}):" "))
|
|
end for
|
|
puts(1,"\n")
|
|
i += 1
|
|
end while
|
|
printf(1," %s\n",{join(repeat("===",12))})
|
|
for j=1 to 12 do
|
|
integer count = getd("count",dicts[j])
|
|
printf(1,"%4d",{count})
|
|
end for
|
|
puts(1,"\n")
|
|
end procedure
|
|
|
|
main()
|