Powered by AppSignal & Oban Pro

Advent of Code 2023 - Day 02

2023/02.livemd

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()

Run in Livebook