Skip to content

Instantly share code, notes, and snippets.

@samueltardieu
Created December 13, 2023 00:22
Show Gist options
  • Save samueltardieu/800f7e981ed2b7bb64abd0373c5926ea to your computer and use it in GitHub Desktop.
Save samueltardieu/800f7e981ed2b7bb64abd0373c5926ea to your computer and use it in GitHub Desktop.
defmodule AdventOfCode.Day12 do
defp parse(input) do
for line <- String.split(input, "\n", trim: true) do
[pattern, ns] = String.split(line)
{pattern, String.split(ns, ",") |> Enum.map(&String.to_integer/1)}
end
end
defp solve(a, b, c) do
if cached = Process.get({a, b, c}) do
cached
else
r = solver(a, b, c)
Process.put({a, b, c}, r)
r
end
end
defp solver("", n, [n]), do: 1
defp solver("", nil, []), do: 1
defp solver("", _, _), do: 0
defp solver("." <> s, nil, cons), do: solve(s, nil, cons)
defp solver("?" <> s, nil, []), do: solve(s, nil, [])
defp solver("?" <> s, nil, cons), do: solve(s, 1, cons) + solve(s, nil, cons)
defp solver("#" <> s, nil, cons = [_ | _]), do: solve(s, 1, cons)
defp solver("." <> s, n, [n | ns]), do: solve(s, nil, ns)
defp solver("?" <> s, n, [n | ns]), do: solve(s, nil, ns)
defp solver("#" <> s, n, cons = [e | _]) when n < e, do: solve(s, n + 1, cons)
defp solver("?" <> s, n, cons = [e | _]) when n < e, do: solve(s, n + 1, cons)
defp solver(_, _, _), do: 0
def part1(input) do
for({s, ns} <- parse(input), do: solve(s, nil, ns))
|> Enum.sum()
end
def part2(input) do
for {s, ns} <- parse(input) do
solve("#{s}?#{s}?#{s}?#{s}?#{s}", nil, List.flatten([ns, ns, ns, ns, ns]))
end
|> Enum.sum()
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment