31 lines
808 B
Plaintext
31 lines
808 B
Plaintext
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)
|