Powered by AppSignal & Oban Pro

๐ŸŽ„ Year 2023 ๐Ÿ”” Day 02

elixir/notebooks/2023/day02.livemd

๐ŸŽ„ Year 2023 ๐Ÿ”” Day 02

Setup

filename = "#{__DIR__}/../../../inputs/2023/day02.txt"
lines = File.read!(filename) |> String.split("\n", trim: true)

Part 1

lines
|> Enum.to_list()
|> Enum.map(fn line ->
  ["Game " <> game, rounds] = String.split(line, ":")
  game = String.to_integer(game)

  rounds =
    String.split(rounds, ";")
    |> Enum.map(fn round ->
      String.split(round, ",")
      |> Enum.map(&String.split(&1, " ", trim: true))
      |> Enum.map(fn [count, color] -> {color, String.to_integer(count)} end)
      |> Map.new()
    end)

  rgb_maxes =
    rounds
    |> Enum.reduce(%{}, fn e, acc ->
      Map.merge(e, acc, fn _k, v1, v2 -> max(v1, v2) end)
    end)
    |> then(fn scores ->
      {
        Map.get(scores, "red", 0),
        Map.get(scores, "green", 0),
        Map.get(scores, "blue", 0)
      }
    end)

  {game, rgb_maxes}
end)
|> Enum.filter(fn {_game, {r, g, b}} ->
  r <= 12 && g <= 13 && b <= 14
end)
|> Enum.map(&elem(&1, 0))
|> Enum.sum()

Section

lines
|> Enum.to_list()
|> Enum.map(fn line ->
  ["Game " <> game, rounds] = String.split(line, ":")
  game = String.to_integer(game)

  rounds =
    String.split(rounds, ";")
    |> Enum.map(fn round ->
      String.split(round, ",")
      |> Enum.map(&String.split(&1, " ", trim: true))
      |> Enum.map(fn [count, color] -> {color, String.to_integer(count)} end)
      |> Map.new()
    end)

  rgb_maxes =
    rounds
    |> Enum.reduce(%{}, fn e, acc ->
      Map.merge(e, acc, fn _k, v1, v2 -> max(v1, v2) end)
    end)
    |> then(fn scores ->
      {
        Map.get(scores, "red", 0),
        Map.get(scores, "green", 0),
        Map.get(scores, "blue", 0)
      }
    end)

  {game, rgb_maxes}
end)
|> Enum.map(fn {_game, {r, g, b}} -> r * g * b end)
|> Enum.sum()