import AOC

aoc 2015, 17 do
  def input() do
    input_stream()
    |> Stream.map(&String.to_integer/1)
    |> Enum.sort(:desc)
  end

  def p1 do
    input()
    |> combinations()
    |> Enum.filter(fn comb -> Enum.sum(comb) == 150 end)
    |> length()
  end

  def p2 do
    working_combinations =
      input()
      |> combinations()
      |> Enum.filter(fn comb -> Enum.sum(comb) == 150 end)
      |> Enum.sort_by(&length/1)

    size_of_fewest_container_combination = working_combinations |> hd() |> length()

    working_combinations
    |> Enum.count(&(length(&1) == size_of_fewest_container_combination))
  end

  def combinations(values, combination \\ [])
  def combinations([], combination), do: [combination]

  def combinations([x | xs], combination) do
    combinations(xs, [x | combination]) ++ combinations(xs, combination)
  end
end