RosettaCodeData/Task/First-class-environments/Phix/first-class-environments-2....

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()