List rooted trees: Difference between revisions

Content added Content deleted
(add Julia example)
Line 913: Line 913:
</pre>
</pre>
The bag <code>bag(bag(bag()), bag()(2))</code> coresponds with <code>((())()())</code>. There are two independent ways how we can get it by nesting 4 bags.
The bag <code>bag(bag(bag()), bag()(2))</code> coresponds with <code>((())()())</code>. There are two independent ways how we can get it by nesting 4 bags.

=={{header|Phix}}==
{{trans|Go}}
<lang Phix>atom t0 = time()
sequence list = {1},
offset = repeat(0,32)
offset[1..2] = 1

function show(integer t, l)
string res = repeat('?',l)
integer level = 0
for i=l to 1 by -1 do
integer r2 = remainder(t,2)
res[i] = "[}(]{)"[mod(level-r2,6)+1]
level += r2*4-2
t = floor(t/2)
end for
if level!=0 then ?9/0 end if
return res
end function
procedure listTrees(integer n)
for i:=offset[n+1]+1 to offset[n+2] do
printf(1,"%s\n",{show(list[i], n*2)})
end for
end procedure
procedure assemble(atom t, integer n, sl, pos, rem)
--
-- assemble tree from subtrees
-- t: assembled parts so far
-- n: length of tree we want to make
-- sl: length of subtree we are looking at
-- pos: offset of subtree we are looking at
-- rem: remaining length to be put together
--
if rem == 0 then
list = append(list, t*2+1)
else
if sl>rem then -- need smaller sub-trees
sl = rem
pos = offset[sl+1]
elsif pos>=offset[sl+2] then
-- used up sl-trees, try smaller ones
if sl == 1 then return end if
pos = offset[sl]
sl -= 1
end if
atom u = or_bits(t*power(2,2*sl),list[pos+1])
assemble(u, n, sl, pos, rem-sl)
assemble(t, n, sl, pos+1, rem)
end if
end procedure
procedure mktrees(integer n)
if offset[n+2]=0 then
if n>0 then
mktrees(n - 1)
end if
assemble(0, n, n-1, offset[n], n-1)
offset[n+2] = length(list)
end if
end procedure
procedure main(integer n)
mktrees(n)
atom nt = offset[n+2]-offset[n+1],
td = time()-t0
string e = iff(td>0.1?" ("&elapsed(td)&")":"")
printf(1,"Number of %d-trees: %,d%s\n", {n, nt, e})
if n<=5 then listTrees(n) end if
end procedure
for i=0 to 20 do
main(i)
end for</lang>
{{out}}
<pre>
Number of 0-trees: 0
Number of 1-trees: 1
()
Number of 2-trees: 1
({})
Number of 3-trees: 2
({[]})
({}{})
Number of 4-trees: 4
({[()]})
({[][]})
({[]}{})
({}{}{})
Number of 5-trees: 9
({[({})]})
({[()()]})
({[()][]})
({[][][]})
({[()]}{})
({[][]}{})
({[]}{[]})
({[]}{}{})
({}{}{}{})
Number of 6-trees: 20
Number of 7-trees: 48
Number of 8-trees: 115
Number of 9-trees: 286
Number of 10-trees: 719
Number of 11-trees: 1,842
Number of 12-trees: 4,766
Number of 13-trees: 12,486
Number of 14-trees: 32,973
Number of 15-trees: 87,811
Number of 16-trees: 235,381 (0.2s)
Number of 17-trees: 634,847 (0.5s)
Number of 18-trees: 1,721,159 (1.3s)
Number of 19-trees: 4,688,676 (4.0s)
Number of 20-trees: 12,826,228 (13.6s)
</pre>
Beyond that it gets extremely slow.


=={{header|Python}}==
=={{header|Python}}==