Day 19 was nice and easy, just what I needed
parent
08aab2ebc8
commit
141b6af203
@ -0,0 +1,57 @@
|
||||
defmodule Day19 do
|
||||
def run do
|
||||
{patterns, designs} = parse_file("data.txt")
|
||||
|
||||
{possibles, _c} =
|
||||
Enum.reduce(designs, {[], %{}}, fn d, {list, cache} ->
|
||||
{total, c} = possible_designs(d, patterns, cache)
|
||||
{[total | list], c}
|
||||
end)
|
||||
|
||||
part1 = Enum.filter(possibles, fn el -> el != 0 end) |> length
|
||||
dbg(part1)
|
||||
|
||||
part2 = Enum.sum(possibles)
|
||||
dbg(part2)
|
||||
end
|
||||
|
||||
# if the design is empty list, we got to the end successfully
|
||||
defp possible_designs([], _, cache), do: {1, cache}
|
||||
|
||||
defp possible_designs(design, patterns, cache) do
|
||||
# look in the cache for this design
|
||||
if Map.has_key?(cache, design) do
|
||||
# if it's there, just return it
|
||||
{Map.get(cache, design), cache}
|
||||
else
|
||||
# find all the patterns that match the beginning of the design
|
||||
matching_patterns = Enum.filter(patterns, &List.starts_with?(design, &1))
|
||||
|
||||
{new_total, new_cache} =
|
||||
if length(matching_patterns) == 0 do
|
||||
# if there are none, we've failed
|
||||
{0, cache}
|
||||
else
|
||||
# recurse on rest of the list
|
||||
Enum.reduce(matching_patterns, {0, cache}, fn pattern, {total, new_cache} ->
|
||||
rest = Enum.drop(design, length(pattern))
|
||||
{t, c} = possible_designs(rest, patterns, new_cache)
|
||||
{t + total, c}
|
||||
end)
|
||||
end
|
||||
|
||||
# add this new total to the cache & return it
|
||||
new_cache2 = Map.put(new_cache, design, new_total)
|
||||
{new_total, new_cache2}
|
||||
end
|
||||
end
|
||||
|
||||
defp parse_file(file) do
|
||||
[top, bottom] = File.read!(file) |> String.trim() |> String.split("\n\n")
|
||||
patterns = String.split(top, ", ") |> Enum.map(&String.graphemes/1)
|
||||
designs = String.split(bottom, "\n") |> Enum.map(&String.graphemes/1)
|
||||
{patterns, designs}
|
||||
end
|
||||
end
|
||||
|
||||
Day19.run()
|
Loading…
Reference in New Issue