Advent of Code 2023 - Day 02
Mix.install([
{:kino, "~> 0.11.0"},
{:kino_aoc, github: "ljgago/kino_aoc"}
])
Input
{:ok, puzzle_input} =
KinoAOC.download_puzzle("2023", "2", System.fetch_env!("LB_AOC_SESSION"))
games =
puzzle_input
|> String.split("\n")
|> Enum.map(fn line ->
[_ | rest] = String.split(line, [": ", "; "])
Enum.map(rest, fn set ->
String.split(set, ", ")
|> Enum.into(%{}, fn cubes ->
[count, color] = String.split(cubes, " ")
{color, String.to_integer(count)}
end)
end)
end)
max_cubes =
games
|> Enum.map(fn sets ->
Enum.reduce(sets, %{}, fn set, acc ->
Map.merge(set, acc, fn _k, v1, v2 -> max(v1, v2) end)
end)
end)
Part 1
max = %{"red" => 12, "green" => 13, "blue" => 14}
max_cubes
|> Stream.with_index(1)
|> Stream.reject(fn {cubes, _i} ->
Enum.any?(cubes, fn {color, count} -> count > max[color] end)
end)
|> Stream.map(fn {_cubes, i} -> i end)
|> Enum.sum()
Part 2
max_cubes
|> Stream.map(fn cubes -> Map.values(cubes) |> Enum.product() end)
|> Enum.sum()
