Ordered partitions: Difference between revisions

Added Elixir
m (→‎{{header|Sidef}}: code simplification)
(Added Elixir)
Line 635:
[2 4 ][][1 3 ]
[3 4 ][][1 2 ]</pre>
 
=={{header|Elixir}}==
{{trans|Ruby}}
Brute force approach:
<lang elixir>defmodule Ordered do
def partition([]), do: [[]]
def partition(mask) do
sum = Enum.sum(mask)
if sum == 0 do
[Enum.map(mask, fn _ -> [] end)]
else
Enum.to_list(1..sum)
|> permute
|> Enum.reduce([], fn perm,acc ->
{_, part} = Enum.reduce(mask, {perm,[]}, fn num,{pm,a} ->
{p, rest} = Enum.split(pm, num)
{rest, [Enum.sort(p) | a]}
end)
[Enum.reverse(part) | acc]
end)
|> Enum.uniq
end
end
defp permute([]), do: [[]]
defp permute(list), do: for x <- list, y <- permute(list -- [x]), do: [x|y]
end
 
Enum.each([[],[0,0,0],[1,1,1],[2,0,2]], fn test_case ->
IO.puts "\npartitions #{inspect test_case}:"
Enum.each(Ordered.partition(test_case), fn part ->
IO.inspect part
end)
end)</lang>
 
{{out}}
<pre>
partitions []:
[]
 
partitions [0, 0, 0]:
[[], [], []]
 
partitions [1, 1, 1]:
[[3], [2], [1]]
[[3], [1], [2]]
[[2], [3], [1]]
[[2], [1], [3]]
[[1], [3], [2]]
[[1], [2], [3]]
 
partitions [2, 0, 2]:
[[3, 4], [], [1, 2]]
[[2, 4], [], [1, 3]]
[[1, 4], [], [2, 3]]
[[2, 3], [], [1, 4]]
[[1, 3], [], [2, 4]]
[[1, 2], [], [3, 4]]
</pre>
 
=={{header|GAP}}==
Anonymous user