Powered by AppSignal & Oban Pro

Day 02

2023/day02.livemd

Day 02

Mix.install([:kino_aoc])

Section

{:ok, puzzle_input} =
  KinoAOC.download_puzzle("2023", "2", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
{:ok,
 "Game 1: 3 blue, 7 green, 10 red; 4 green, 4 red; 1 green, 7 blue, 5 red; 8 blue, 10 red; 7 blue, 19 red, 1 green\nGame 2: 6 red, 10 green; 11 green, 4 red; 16 green, 2 blue; 7 green, 5 blue, 4 red; 17 green, 1 red, 1 blue\nGame 3: 5 red, 9 blue, 1 green; 5 red; 11 red, 2 green, 8 blue; 2 green, 6 blue\nGame 4: 2 red, 5 green; 2 blue, 3 red, 3 green; 3 red, 2 blue; 8 green, 2 red\nGame 5: 12 red, 13 blue; 13 blue, 2 green, 9 red; 9 blue, 1 red; 2 green, 12 blue; 1 green, 1 red, 11 blue\nGame 6: 4 blue, 11 red; 4 red; 1 green, 7 red; 1 green, 1 blue; 8 blue, 10 red; 1 green, 2 blue, 8 red\nGame 7: 7 blue, 15 red, 1 green; 5 green, 17 red, 7 blue; 5 blue, 1 green; 11 blue, 2 green, 17 red; 14 green, 9 red, 2 blue; 6 blue, 19 red\nGame 8: 13 green; 5 green; 3 blue, 9 green, 1 red; 4 red, 11 green, 4 blue\nGame 9: 4 green, 1 red, 1 blue; 4 green, 7 blue, 7 red; 9 blue, 4 red; 2 blue, 8 red, 5 green; 6 blue, 2 green; 5 red, 5 green, 10 blue\nGame 10: 1 green, 5 blue, 3 red; 4 green, 9 red, 3 blue; 11 red, 2 green, 5 blue; 3 green, 1 blue, 2 red; 6 red, 2 blue\nGame 11: 2 red, 6 green, 12 blue; 2 red, 9 blue, 1 green; 12 green, 3 blue\nGame 12: 1 red, 1 blue, 12 green; 6 green, 2 red, 1 blue; 6 red, 6 green, 1 blue; 3 green, 6 red\nGame 13: 5 red, 19 green, 3 blue; 6 red, 7 blue, 11 green; 8 blue, 6 red; 3 blue, 4 green, 4 red; 8 red, 15 green, 5 blue; 5 blue, 2 red, 10 green\nGame 14: 5 blue, 9 green; 4 green, 6 blue; 14 green, 1 red, 4 blue; 3 blue, 3 green; 2 green; 5 blue, 7 green, 1 red\nGame 15: 5 red, 8 blue; 9 blue, 3 red; 5 red, 1 green, 16 blue; 1 blue, 3 red, 2 green; 5 red, 2 green, 10 blue\nGame 16: 6 blue, 9 green, 10 red; 8 blue, 9 red, 14 green; 7 green, 1 blue, 1 red; 8 red, 5 green, 8 blue; 10 red, 5 blue, 14 green; 7 blue, 11 red, 3 green\nGame 17: 12 blue, 12 red, 6 green; 14 green, 17 blue, 4 red; 11 blue, 1 red, 13 green\nGame 18: 7 blue, 2 green, 4 red; 1 blue, 2 green, 4 red; 2 red, 17 blue\nGame 19: 3 red, 9 green; 8 red, 2 blue, 2 green; 3 blue, 15 green, 11 red; 18 green, 3 red, 1 blue\nGame 20: 5 green, 5 red, 16 blue; 8 blue, 6 green, 4 red; 10 red, 11 blue; 5 red, 5 blue, 5 green\nGame 21: 1 red, 3 blue, 14 green; 6 red, 6 blue, 17 green; 12 green, 17 blue, 3 red; 15 green, 1 red, 19 blue; 3 red, 18 blue, 4 green\nGame 22: 15 blue; 11 blue, 2 red, 1 green; 1 green, 7 red; 1 red, 18 blue, 1 green; 16 blue; 3 red, 6 blue\nGame 23: 11 blue, 6 green, 4 red; 9 green, 11 red, 8 blue; 5 green, 5 red, 2 blue; 11 green, 4 blue, 11 red; 3 green, 9 blue, 2 red\nGame 24: 7 green, 2 red; 8 red, 1 blue, 15 green; 3 red, 6 green, 6 blue\nGame 25: 9 blue, 9 green; 3 green, 7 blue, 1 red; 6 green, 1 red, 1 blue; 6 green, 1 red, 1 blue\nGame 26: 1 green, 15 blue, 1 red; 1 red, 12 blue, 1 green; 16 blue; 5 red, 11 green, 14 blue; 6 green, 4 red, 14 blue\nGame 27: 14 red, 9 green; 11 red, 5 green, 6 blue; 1 red, 6 blue, 9 green\nGame 28: 6 green, 1 blue, 9 red; 1 green, 9 red; 7 red; 11 red, 1 blue, 2 green; 8 red, 10 green; 6 green, 1 blue, 5 red\nGame 29: 1 red, 19 blue, 3 green; 9 blue, 1 red; 8 green, 17 blue; 11 blue, 4 green\nGame 30: 7 blue; 5 blue, 1 red, 1 green; 3 blue, 1 red\nGame 31: 9 red, 2 green, 1 blue; 5 red, 1 green, 3 blue; 2 green, 7 red; 2 green, 12 red\nGame 32: 1 red, 1 blue, 17 green; 14 blue, 10 green, 6 red; 12 green, 11 blue, 3 red\nGame 33: 2 red, 1 green, 3 blue; 7 blue, 4 green; 1 red, 3 green, 5 blue\nGame 34: 9 blue, 1 green, 9 red; 12 blue, 2 green, 12 red; 3 blue, 12 red; 2 green, 14 blue, 11 red; 10 red, 12 blue\nGame 35: 6 blue, 2 red; 5 blue; 6 green, 9 blue, 3 red; 3 green, 1 red, 2 blue\nGame 36: 9 blue, 4 green, 6 red; 2 red, 4 green; 7 red, 3 green; 6 green, 2 blue; 3 red, 4 blue, 3 green; 3 green, 4 red, 16 blue\nGame 37: 2 green, 8 red, 4 blue; 3 red, 4 blue, 2 green; 5 blue, 3 green; 9 blue, 15 green; 5 red, 11 green, 7 blue\nGame 38: 12 red, 1 blue; 10 red, 3 green, 2 blue; 7 blue, 3 green, 8 red; 14 red, 2 green\nGame 39: 16 green, 2 red, 17 blue; 6 red, 4 green, 13 blue; 7 blue, 1 green, 4 red; 2 green, 3 blue; 12 green, 6 red, 17 blue; 5 red, 2 blue, 6 green\nGame 40: 3 green, 4 blue, 2 red; 2 green, 3 red; 6" <> ...}
games =
  puzzle_input
  |> String.split("\n", trim: true)
  |> Enum.map(fn "Game " <> game ->
    {id, ": " <> rest} = Integer.parse(game)

    picks =
      for pick <- String.split(rest, "; ") do
        pick
        |> String.split(", ")
        |> Map.new(fn balls ->
          {num, " " <> color} = Integer.parse(balls)
          {color, num}
        end)
      end

    {id, picks}
  end)
[
  {1,
   [
     %{"blue" => 3, "green" => 7, "red" => 10},
     %{"green" => 4, "red" => 4},
     %{"blue" => 7, "green" => 1, "red" => 5},
     %{"blue" => 8, "red" => 10},
     %{"blue" => 7, "green" => 1, "red" => 19}
   ]},
  {2,
   [
     %{"green" => 10, "red" => 6},
     %{"green" => 11, "red" => 4},
     %{"blue" => 2, "green" => 16},
     %{"blue" => 5, "green" => 7, "red" => 4},
     %{"blue" => 1, "green" => 17, "red" => 1}
   ]},
  {3,
   [
     %{"blue" => 9, "green" => 1, "red" => 5},
     %{"red" => 5},
     %{"blue" => 8, "green" => 2, "red" => 11},
     %{"blue" => 6, "green" => 2}
   ]},
  {4,
   [
     %{"green" => 5, "red" => 2},
     %{"blue" => 2, "green" => 3, "red" => 3},
     %{"blue" => 2, "red" => 3},
     %{"green" => 8, "red" => 2}
   ]},
  {5,
   [
     %{"blue" => 13, "red" => 12},
     %{"blue" => 13, "green" => 2, "red" => 9},
     %{"blue" => 9, "red" => 1},
     %{"blue" => 12, "green" => 2},
     %{"blue" => 11, "green" => 1, "red" => 1}
   ]},
  {6,
   [
     %{"blue" => 4, "red" => 11},
     %{"red" => 4},
     %{"green" => 1, "red" => 7},
     %{"blue" => 1, "green" => 1},
     %{"blue" => 8, "red" => 10},
     %{"blue" => 2, "green" => 1, "red" => 8}
   ]},
  {7,
   [
     %{"blue" => 7, "green" => 1, "red" => 15},
     %{"blue" => 7, "green" => 5, "red" => 17},
     %{"blue" => 5, "green" => 1},
     %{"blue" => 11, "green" => 2, "red" => 17},
     %{"blue" => 2, "green" => 14, "red" => 9},
     %{"blue" => 6, "red" => 19}
   ]},
  {8,
   [
     %{"green" => 13},
     %{"green" => 5},
     %{"blue" => 3, "green" => 9, "red" => 1},
     %{"blue" => 4, "green" => 11, "red" => 4}
   ]},
  {9,
   [
     %{"blue" => 1, "green" => 4, "red" => 1},
     %{"blue" => 7, "green" => 4, "red" => 7},
     %{"blue" => 9, "red" => 4},
     %{"blue" => 2, "green" => 5, "red" => 8},
     %{"blue" => 6, "green" => 2},
     %{"blue" => 10, "green" => 5, "red" => 5}
   ]},
  {10,
   [
     %{"blue" => 5, "green" => 1, "red" => 3},
     %{"blue" => 3, "green" => 4, "red" => 9},
     %{"blue" => 5, "green" => 2, "red" => 11},
     %{"blue" => 1, "green" => 3, "red" => 2},
     %{"blue" => 2, "red" => 6}
   ]},
  {11,
   [
     %{"blue" => 12, "green" => 6, "red" => 2},
     %{"blue" => 9, "green" => 1, "red" => 2},
     %{"blue" => 3, "green" => 12}
   ]},
  {12,
   [
     %{"blue" => 1, "green" => 12, "red" => 1},
     %{"blue" => 1, "green" => 6, "red" => 2},
     %{"blue" => 1, "green" => 6, "red" => 6},
     %{"green" => 3, "red" => 6}
   ]},
  {13,
   [
     %{"blue" => 3, "green" => 19, "red" => 5},
     %{"blue" => 7, "green" => 11, "red" => 6},
     %{"blue" => 8, "red" => 6},
     %{"blue" => 3, "green" => 4, "red" => 4},
     %{"blue" => 5, "green" => 15, "red" => 8},
     %{"blue" => 5, "green" => 10, "red" => 2}
   ]},
  {14,
   [
     %{"blue" => 5, "green" => 9},
     %{"blue" => 6, "green" => 4},
     %{"blue" => 4, "green" => 14, "red" => 1},
     %{"blue" => 3, "green" => 3},
     %{"green" => 2},
     %{"blue" => 5, "green" => 7, "red" => 1}
   ]},
  {15,
   [
     %{"blue" => 8, "red" => 5},
     %{"blue" => 9, "red" => 3},
     %{"blue" => 16, "green" => 1, "red" => 5},
     %{"blue" => 1, "green" => 2, "red" => 3},
     %{"blue" => 10, "green" => 2, "red" => 5}
   ]},
  {16,
   [
     %{"blue" => 6, "green" => 9, "red" => 10},
     %{"blue" => 8, "green" => 14, "red" => 9},
     %{"blue" => 1, "green" => 7, "red" => 1},
     %{"blue" => 8, "green" => 5, "red" => 8},
     %{"blue" => 5, "green" => 14, "red" => 10},
     %{"blue" => 7, "green" => 3, "red" => 11}
   ]},
  {17,
   [
     %{"blue" => 12, "green" => 6, "red" => 12},
     %{"blue" => 17, "green" => 14, "red" => 4},
     %{"blue" => 11, "green" => 13, "red" => 1}
   ]},
  {18,
   [
     %{"blue" => 7, "green" => 2, "red" => 4},
     %{"blue" => 1, "green" => 2, "red" => 4},
     %{"blue" => 17, "red" => 2}
   ]},
  {19,
   [
     %{"green" => 9, "red" => 3},
     %{"blue" => 2, "green" => 2, "red" => 8},
     %{"blue" => 3, "green" => 15, "red" => 11},
     %{"blue" => 1, "green" => 18, "red" => 3}
   ]},
  {20,
   [
     %{"blue" => 16, "green" => 5, "red" => 5},
     %{"blue" => 8, "green" => 6, "red" => 4},
     %{"blue" => 11, "red" => 10},
     %{"blue" => 5, "green" => 5, "red" => 5}
   ]},
  {21,
   [
     %{"blue" => 3, "green" => 14, "red" => 1},
     %{"blue" => 6, "green" => 17, "red" => 6},
     %{"blue" => 17, "green" => 12, "red" => 3},
     %{"blue" => 19, "green" => 15, "red" => 1},
     %{"blue" => 18, "green" => 4, "red" => 3}
   ]},
  {22,
   [
     %{"blue" => 15},
     %{"blue" => 11, "green" => 1, "red" => 2},
     %{"green" => 1, "red" => 7},
     %{"blue" => 18, "green" => 1, "red" => 1},
     %{"blue" => 16},
     %{"blue" => 6, "red" => 3}
   ]},
  {23,
   [
     %{"blue" => 11, "green" => 6, "red" => 4},
     %{"blue" => 8, "green" => 9, "red" => 11},
     %{"blue" => 2, "green" => 5, "red" => 5},
     %{"blue" => 4, "green" => 11, "red" => 11},
     %{"blue" => 9, "green" => 3, "red" => 2}
   ]},
  {24,
   [
     %{"green" => 7, "red" => 2},
     %{"blue" => 1, "green" => 15, "red" => 8},
     %{"blue" => 6, "green" => 6, "red" => 3}
   ]},
  {25,
   [
     %{"blue" => 9, "green" => 9},
     %{"blue" => 7, "green" => 3, "red" => 1},
     %{"blue" => 1, "green" => 6, "red" => 1},
     %{"blue" => 1, "green" => 6, "red" => 1}
   ]},
  {26,
   [
     %{"blue" => 15, "green" => 1, "red" => 1},
     %{"blue" => 12, "green" => 1, "red" => 1},
     %{"blue" => 16},
     %{"blue" => 14, "green" => 11, "red" => 5},
     %{"blue" => 14, "green" => 6, "red" => 4}
   ]},
  {27,
   [
     %{"green" => 9, "red" => 14},
     %{"blue" => 6, "green" => 5, "red" => 11},
     %{"blue" => 6, "green" => 9, "red" => 1}
   ]},
  {28,
   [
     %{"blue" => 1, "green" => 6, "red" => 9},
     %{"green" => 1, "red" => 9},
     %{"red" => 7},
     %{"blue" => 1, "green" => 2, "red" => 11},
     %{"green" => 10, "red" => 8},
     %{"blue" => 1, "green" => 6, "red" => 5}
   ]},
  {29,
   [
     %{"blue" => 19, "green" => 3, "red" => 1},
     %{"blue" => 9, "red" => 1},
     %{"blue" => 17, "green" => 8},
     %{"blue" => 11, "green" => 4}
   ]},
  {30, [%{"blue" => 7}, %{"blue" => 5, "green" => 1, "red" => 1}, %{"blue" => 3, "red" => 1}]},
  {31,
   [
     %{"blue" => 1, "green" => 2, "red" => 9},
     %{"blue" => 3, "green" => 1, "red" => 5},
     %{"green" => 2, "red" => 7},
     %{"green" => 2, "red" => 12}
   ]},
  {32,
   [
     %{"blue" => 1, "green" => 17, "red" => 1},
     %{"blue" => 14, "green" => 10, "red" => 6},
     %{"blue" => 11, "green" => 12, "red" => 3}
   ]},
  {33,
   [
     %{"blue" => 3, "green" => 1, "red" => 2},
     %{"blue" => 7, "green" => 4},
     %{"blue" => 5, "green" => 3, "red" => 1}
   ]},
  {34,
   [
     %{"blue" => 9, "green" => 1, "red" => 9},
     %{"blue" => 12, "green" => 2, "red" => 12},
     %{"blue" => 3, "red" => 12},
     %{"blue" => 14, "green" => 2, "red" => 11},
     %{"blue" => 12, "red" => 10}
   ]},
  {35,
   [
     %{"blue" => 6, "red" => 2},
     %{"blue" => 5},
     %{"blue" => 9, "green" => 6, "red" => 3},
     %{"blue" => 2, "green" => 3, "red" => 1}
   ]},
  {36,
   [
     %{"blue" => 9, "green" => 4, "red" => 6},
     %{"green" => 4, "red" => 2},
     %{"green" => 3, "red" => 7},
     %{"blue" => 2, "green" => 6},
     %{"blue" => 4, "green" => 3, "red" => 3},
     %{"blue" => 16, "green" => 3, "red" => 4}
   ]},
  {37,
   [
     %{"blue" => 4, "green" => 2, "red" => 8},
     %{"blue" => 4, "green" => 2, "red" => 3},
     %{"blue" => 5, "green" => 3},
     %{"blue" => 9, "green" => 15},
     %{"blue" => 7, "green" => 11, "red" => 5}
   ]},
  {38,
   [
     %{"blue" => 1, "red" => 12},
     %{"blue" => 2, "green" => 3, "red" => 10},
     %{"blue" => 7, "green" => 3, "red" => 8},
     %{"green" => 2, "red" => 14}
   ]},
  {39,
   [
     %{"blue" => 17, "green" => 16, "red" => 2},
     %{"blue" => 13, "green" => 4, "red" => 6},
     %{"blue" => 7, "green" => 1, "red" => 4},
     %{"blue" => 3, "green" => 2},
     %{"blue" => 17, "green" => 12, "red" => 6},
     %{"blue" => 2, "green" => 6, "red" => 5}
   ]},
  {40,
   [
     %{"blue" => 4, "green" => 3, "red" => 2},
     %{"green" => 2, "red" => 3},
     %{"blue" => 6, "green" => 6, "red" => 2},
     %{"green" => 5},
     %{"blue" => 3, "green" => 5, "red" => 1}
   ]},
  {41,
   [
     %{"green" => 13, "red" => 11},
     %{"blue" => 1, "green" => 3, "red" => 2},
     %{"blue" => 1, "green" => 3, "red" => 9},
     %{"green" => 11, "red" => 12},
     %{"green" => 1, "red" => 9},
     %{"green" => 9, ...}
   ]},
  {42,
   [
     %{"blue" => 2, "green" => 4},
     %{"blue" => 6, "green" => 10},
     %{"blue" => 13, "green" => 6, "red" => 3},
     %{"blue" => 11, "green" => 17},
     %{"blue" => 8, ...}
   ]},
  {43,
   [
     %{"blue" => 2, "green" => 10, "red" => 10},
     %{"blue" => 3, "green" => 5, "red" => 3},
     %{"blue" => 4, "green" => 10, ...},
     %{"green" => 5},
     %{...}
   ]},
  {44,
   [
     %{"blue" => 1, "green" => 5, "red" => 4},
     %{"blue" => 1, "green" => 3, ...},
     %{"blue" => 1, ...},
     %{...},
     ...
   ]},
  {45, [%{"blue" => 7, "green" => 4, ...}, %{"blue" => 3, ...}, %{...}, ...]},
  {46, [%{"blue" => 5, ...}, %{...}, ...]},
  {47, [%{...}, ...]},
  {48, [...]},
  {49, ...},
  {...},
  ...
]

Part 1

games
|> Enum.filter(fn {_, picks} ->
  Enum.all?(picks, fn map ->
    Map.get(map, "red", 0) <= 12 and Map.get(map, "green", 0) <= 13 and
      Map.get(map, "blue", 0) <= 14
  end)
end)
|> Enum.map(&elem(&1, 0))
|> Enum.sum()
2162

Part 2

games
|> Enum.map(fn {_, picks} ->
  picks
  |> Enum.reduce([0, 0, 0], fn hand, [r, g, b] ->
    [
      max(Map.get(hand, "red", 0), r),
      max(Map.get(hand, "green", 0), g),
      max(Map.get(hand, "blue", 0), b)
    ]
  end)
  |> Enum.product()
end)
|> Enum.sum()
72513