containers = File.stream!("inputs/day17.txt") |> Stream.map(&String.trim/1) |> Stream.filter(&(&1 != "")) |> Enum.map(fn line -> {num, ""} = Integer.parse(line) num end) defmodule EggnogStorage do use Agent def start do Agent.start_link(fn -> %{} end, name: __MODULE__) end def combinations(_containers, 0) do [[]] end def combinations([], _remainingCapacity) do [] end def combinations(containers, remainingCapacity) do cached_value = Agent.get(__MODULE__, &Map.get(&1, {containers, remainingCapacity})) if cached_value do cached_value else [nextContainer | remainingContainers] = containers combinationsWithThisContainer = if nextContainer <= remainingCapacity do Enum.map( combinations(remainingContainers, remainingCapacity - nextContainer), fn x -> [nextContainer | x] end ) else [] end combinationsWithoutThisContainer = combinations(remainingContainers, remainingCapacity) result = combinationsWithThisContainer ++ combinationsWithoutThisContainer Agent.update(__MODULE__, &Map.put(&1, {containers, remainingCapacity}, result)) result end end end {:ok, _} = EggnogStorage.start() combinations = EggnogStorage.combinations(containers, 150) IO.puts("Combinations: #{length(combinations)}") frequencies = Enum.map(combinations, &length/1) |> Enum.frequencies() dbg(frequencies)