AOC 2024
Mix.install([{:kino_aoc, "~> 0.1"}])
Day 05
{:ok, puzzle_input} =
KinoAOC.download_puzzle("2024", "5", System.fetch_env!("LB_AOC_SESSION"))
# test_input = Kino.Input.read(test_input)
[rules, updates] =
puzzle_input
|> String.split("\n\n")
|> Enum.map(&String.split(&1, "\n"))
rule_key =
Enum.reduce(rules, %{}, fn rule, acc ->
[first_page, other_page] = String.split(rule, "|")
Map.update(acc, first_page, MapSet.new([other_page]), fn set ->
MapSet.put(set, other_page)
end)
end)
updates
|> Enum.map(&String.split(&1, ","))
|> Enum.filter(fn update ->
Enum.reduce_while(update, MapSet.new(), fn page, acc ->
if rule_key |> Map.get(page, MapSet.new()) |> MapSet.disjoint?(acc) do
{:cont, MapSet.put(acc, page)}
else
{:halt, false}
end
end)
end)
|> Enum.map(fn pages ->
pages
|> Enum.at(pages |> length() |> div(2))
|> String.to_integer()
end)
|> Enum.sum()