Powered by AppSignal & Oban Pro

Day 04

2023/day04.livemd

Day 04

Mix.install([:kino_aoc])

Section

{:ok, puzzle_input} =
  KinoAOC.download_puzzle("2023", "4", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
{:ok,
 "Card   1: 43 19 57 13 44 22 29 20 34 33 | 34 68 13 38 32 57 20 64 42  7 44 54 16 51 33 85 43 24 86 93 83 29 25 19 22\nCard   2: 41 56 28 16 47 58 86  8 82 23 | 90  4 63 41 24  8 51 65 39 86 16 53 47 62 74 58 56 82 28 76 37 98 89 67 23\nCard   3: 10 48 83  6 54 51 52  5 22 80 | 36 51 66 86 68 73 93 52  5 65 48 71 85 10 40 22 80  6 20 83 95 54 21 76 92\nCard   4: 17  4  8 74 97 13 52 27 99 95 | 55 31 73 47 95 46 96 69 27 52 45 62 53 12 21  5 74 13  8 50 77 54 91 32 43\nCard   5: 46 50 28 25 44 73  3 14 17 20 | 33 14 44 71 73 59 19 80 40 20  5  6 72 85 47 62 30 50 83 51 24 28  3 77 39\nCard   6: 65 19 45 54 72 39 64 15  3 60 | 91 62 10 73  1 77 25  9 92  7 81 48 19 50 52 32 69 75 24 93 30 60 72 59 53\nCard   7: 41 65 93 76 74 61 59 90 89 87 | 39 61 99 12 71 59 15 10 72 87 41 89 76 88 38 95 90 65 53 80 19 74 93 11 28\nCard   8: 93 64 11 24 13 29  1 51 30 69 | 95 52  7 61  4 44 30 31 64 65 17 34 11 88 71 50 53 73 86 48 60 43 33 51 29\nCard   9: 52 82 95 38 80 53 84 21 93 49 | 41 16 63 88 92 46 23 81 42  3  5 35  8 49  6 22 70 32 38 14 40 61 78 51 10\nCard  10: 41 29 95 65 52 22 51 18 88 44 | 88 92 47 56 71 19 58 52 15 96 25 41 75 29 65 55 43  9 64 81 73 32  5 18 30\nCard  11: 76 66 65 38 41 82  9 81 11 51 |  4 55 70 38 58 17  5 67 26 81 91 48 28 45 83 68 64 66 25 51 95 47 63 71 54\nCard  12: 96 62 75 58 44 72 73 74  9 14 | 20 37 54 97 70 72 18 68 79  3 45 44 15 11 73 59 64 77 61 95 34 16 55 49  2\nCard  13: 79 82 49 23 78 67 45 43 18 11 | 30 28 53 80 13 50 27 70 69 90 18 35 62 98 60 14 38  4 73 15 33 44 77 51 84\nCard  14: 72 65 58 67 11 90 77 21 22 12 | 17 76  4 40 15 22 92 67 43 55 90 79 65 31 71 73 58 12 21 46 20 87 63 77  9\nCard  15: 80 54 73 48 42 70 69 21 23 97 | 31  6 27 93 90 91 16 65 24 25 46 84 37 87 40 58 29  3 64 32 15 62 47 18 94\nCard  16: 15 72  5 85 34 50 49 22 65 64 | 72 92 38 37 79 84 67 93 36 88 50  8 44 19 85 73 76 41  2 45 21 86  6 49 16\nCard  17:  7 70 36 21 60 80 50 31 23 59 |  6 18  1 92 40 22 30 69 38 14 56 81 25 11 77 62 44  4 85  5 82 45 37 24 64\nCard  18: 63 61 70 64 94 76 25 15 26 89 | 22 78 89 65 23  3 29 50 34 72 32 43  8 62 21 15 20 94 68 53 12 84 99 39 57\nCard  19: 34 56 99 80 89 90 47 57 84 39 | 82  6 93 38 61 32 30 46 55 94 85 53 18  1 16 33 11 98 37  5 65 48 12 17 41\nCard  20: 90 72  6 31 62 86  1 29 34 70 | 64 84 86 29 90  3 89 50  6 54 92 85 98 32 63 24 83 43 99 59 77 12 56 38 69\nCard  21: 65 22 72 35 30 38  3 10 98 95 | 63 65 21 71 94 58 25 16 66 51 20 75 28 11 15 24 87 56 83 31 67  1 97 64 52\nCard  22: 95 70 39 21 87 97 98 96 30  6 | 72 26 52 65 62 10 60 49 46 36 25 55 11 42  1 31  3 73 48 29 63 51 66 17 34\nCard  23: 72 74 91 77 42 31 15 61 80 85 | 59 62 43 19 17 16 49 83 95 35 76 67 99 46 48 44 84 98 97 13 51 55 79 29 65\nCard  24:  3 74 76 13 52 81 40 84 73 98 | 23 71 42  2 83  5 18 75 57 41 38 46 60 66 49 62 36 51 12 86 25 22 82 79  1\nCard  25: 39 25 66 16 13 27 48 78 52 23 | 43 48 98 13 88 66 55 18 71 91 11 94 75 96 89 16  4 23 51 50 62 95 63 44 81\nCard  26: 66 30 18 57 40 36 60 95 99 15 | 60 22 73 21 69 84 95 66 51 57 49 12 30 79 99 70 46 61 92 37 36 40 18 31 39\nCard  27: 54 11 56 55 83 78 47 57 50 19 | 45 70 77 49 12 41 69 78 91 20 51 67  3  6 22 62 27 60  4 63 59 75 43 95 31\nCard  28: 71 72 99 35 76 23  8 44 46 53 | 25 97 99 77 37 23 51 22 65 62 60 46  4 47 92 84  9 61 24 82 52 58 39 32 88\nCard  29: 69 33 37 74 19 38 81 82 62 66 | 42  3 67 30 52 90 47 46 34  4  1 71 98 50 54 94 58 15 28 83 91 59 22 78 86\nCard  30: 25  5 15 20 84 23 86 74 50 22 | 20 85 71 46 21 92 61 15 22 73 51  1 84 86 49 25 57 33 44 82 45  5 23 50 74\nCard  31: 26 60 71  4 51 57 81 61 99 64 | 13 70 71 77  9 68 76 99 97 55 94  4 98 34 27 54 61 11 26 31 57 81 39 51 60\nCard  32: 61 16  7 90 49 39 24 34 35 17 | 90 75 34 25 39 26 59 67 24 35 62 19 17 54 31 16 71 76  7 64  8 60 61 13 82\nCard  33: 91 74 62 52 86  6 46 60 16 88 | 27  4 32  1 74 52 69 19 62 16 91 26 86 22 55 59  6 60 83 65 18 72 93 53 41\nCard  34: 79 47 49 71 56 89 21 14 29 58 | 80  2 93 71 37  3 33 70  9 18 20 97 85  6 96 73 35 52 74 63 55 99 41 46 44\nCard  35: 13 30 58 94 50 44 38 99 40  9 |  5 75 79 40 84 20  9  2 67 95 24 30 96 62 50 45 28 99 71 26 52 74 54 44 66\nC" <> ...}
cards =
  puzzle_input
  |> String.split("\n", trim: true)
  |> Enum.map(fn "Card" <> rest ->
    {id, ": " <> rest} = rest |> String.trim() |> Integer.parse()

    [wins, inputs] =
      rest
      |> String.split(" | ")
      |> Enum.map(fn part ->
        part
        |> String.split()
        |> Enum.map(&amp;String.to_integer/1)
      end)

    {id, wins, inputs}
  end)
[
  {1, [43, 19, 57, 13, 44, 22, 29, 20, 34, 33],
   [34, 68, 13, 38, 32, 57, 20, 64, 42, 7, 44, 54, 16, 51, 33, 85, 43, 24, 86, 93, 83, 29, 25, 19,
    22]},
  {2, [41, 56, 28, 16, 47, 58, 86, 8, 82, 23],
   [90, 4, 63, 41, 24, 8, 51, 65, 39, 86, 16, 53, 47, 62, 74, 58, 56, 82, 28, 76, 37, 98, 89, 67,
    23]},
  {3, [10, 48, 83, 6, 54, 51, 52, 5, 22, 80],
   [36, 51, 66, 86, 68, 73, 93, 52, 5, 65, 48, 71, 85, 10, 40, 22, 80, 6, 20, 83, 95, 54, 21, 76,
    92]},
  {4, [17, 4, 8, 74, 97, 13, 52, 27, 99, 95],
   [55, 31, 73, 47, 95, 46, 96, 69, 27, 52, 45, 62, 53, 12, 21, 5, 74, 13, 8, 50, 77, 54, 91, 32,
    43]},
  {5, [46, 50, 28, 25, 44, 73, 3, 14, 17, 20],
   [33, 14, 44, 71, 73, 59, 19, 80, 40, 20, 5, 6, 72, 85, 47, 62, 30, 50, 83, 51, 24, 28, 3, 77, 39]},
  {6, [65, 19, 45, 54, 72, 39, 64, 15, 3, 60],
   [91, 62, 10, 73, 1, 77, 25, 9, 92, 7, 81, 48, 19, 50, 52, 32, 69, 75, 24, 93, 30, 60, 72, 59, 53]},
  {7, ~c")A]LJ=;ZYW",
   [39, 61, 99, 12, 71, 59, 15, 10, 72, 87, 41, 89, 76, 88, 38, 95, 90, 65, 53, 80, 19, 74, 93, 11,
    28]},
  {8, [93, 64, 11, 24, 13, 29, 1, 51, 30, 69],
   [95, 52, 7, 61, 4, 44, 30, 31, 64, 65, 17, 34, 11, 88, 71, 50, 53, 73, 86, 48, 60, 43, 33, 51,
    29]},
  {9, [52, 82, 95, 38, 80, 53, 84, 21, 93, 49],
   [41, 16, 63, 88, 92, 46, 23, 81, 42, 3, 5, 35, 8, 49, 6, 22, 70, 32, 38, 14, 40, 61, 78, 51, 10]},
  {10, [41, 29, 95, 65, 52, 22, 51, 18, 88, 44],
   [88, 92, 47, 56, 71, 19, 58, 52, 15, 96, 25, 41, 75, 29, 65, 55, 43, 9, 64, 81, 73, 32, 5, 18,
    30]},
  {11, ~c"LBA&)R\tQ\v3",
   [4, 55, 70, 38, 58, 17, 5, 67, 26, 81, 91, 48, 28, 45, 83, 68, 64, 66, 25, 51, 95, 47, 63, 71,
    54]},
  {12, [96, 62, 75, 58, 44, 72, 73, 74, 9, 14],
   [20, 37, 54, 97, 70, 72, 18, 68, 79, 3, 45, 44, 15, 11, 73, 59, 64, 77, 61, 95, 34, 16, 55, 49,
    2]},
  {13, [79, 82, 49, 23, 78, 67, 45, 43, 18, 11],
   [30, 28, 53, 80, 13, 50, 27, 70, 69, 90, 18, 35, 62, 98, 60, 14, 38, 4, 73, 15, 33, 44, 77, 51,
    84]},
  {14, [72, 65, 58, 67, 11, 90, 77, 21, 22, 12],
   [17, 76, 4, 40, 15, 22, 92, 67, 43, 55, 90, 79, 65, 31, 71, 73, 58, 12, 21, 46, 20, 87, 63, 77,
    9]},
  {15, [80, 54, 73, 48, 42, 70, 69, 21, 23, 97],
   [31, 6, 27, 93, 90, 91, 16, 65, 24, 25, 46, 84, 37, 87, 40, 58, 29, 3, 64, 32, 15, 62, 47, 18,
    94]},
  {16, [15, 72, 5, 85, 34, 50, 49, 22, 65, 64],
   [72, 92, 38, 37, 79, 84, 67, 93, 36, 88, 50, 8, 44, 19, 85, 73, 76, 41, 2, 45, 21, 86, 6, 49, 16]},
  {17, [7, 70, 36, 21, 60, 80, 50, 31, 23, 59],
   [6, 18, 1, 92, 40, 22, 30, 69, 38, 14, 56, 81, 25, 11, 77, 62, 44, 4, 85, 5, 82, 45, 37, 24, 64]},
  {18, [63, 61, 70, 64, 94, 76, 25, 15, 26, 89],
   [22, 78, 89, 65, 23, 3, 29, 50, 34, 72, 32, 43, 8, 62, 21, 15, 20, 94, 68, 53, 12, 84, 99, 39,
    57]},
  {19, ~c"\"8cPYZ/9T'",
   [82, 6, 93, 38, 61, 32, 30, 46, 55, 94, 85, 53, 18, 1, 16, 33, 11, 98, 37, 5, 65, 48, 12, 17, 41]},
  {20, [90, 72, 6, 31, 62, 86, 1, 29, 34, 70],
   [64, 84, 86, 29, 90, 3, 89, 50, 6, 54, 92, 85, 98, 32, 63, 24, 83, 43, 99, 59, 77, 12, 56, 38,
    69]},
  {21, [65, 22, 72, 35, 30, 38, 3, 10, 98, 95],
   [63, 65, 21, 71, 94, 58, 25, 16, 66, 51, 20, 75, 28, 11, 15, 24, 87, 56, 83, 31, 67, 1, 97, 64,
    52]},
  {22, [95, 70, 39, 21, 87, 97, 98, 96, 30, 6],
   [72, 26, 52, 65, 62, 10, 60, 49, 46, 36, 25, 55, 11, 42, 1, 31, 3, 73, 48, 29, 63, 51, 66, 17,
    34]},
  {23, [72, 74, 91, 77, 42, 31, 15, 61, 80, 85],
   [59, 62, 43, 19, 17, 16, 49, 83, 95, 35, 76, 67, 99, 46, 48, 44, 84, 98, 97, 13, 51, 55, 79, 29,
    ...]},
  {24, [3, 74, 76, 13, 52, 81, 40, 84, 73, 98],
   [23, 71, 42, 2, 83, 5, 18, 75, 57, 41, 38, 46, 60, 66, 49, 62, 36, 51, 12, 86, 25, 22, 82, ...]},
  {25, [39, 25, 66, 16, 13, 27, 48, 78, 52, 23],
   [43, 48, 98, 13, 88, 66, 55, 18, 71, 91, 11, 94, 75, 96, 89, 16, 4, 23, 51, 50, 62, 95, ...]},
  {26, [66, 30, 18, 57, 40, 36, 60, 95, 99, 15],
   [60, 22, 73, 21, 69, 84, 95, 66, 51, 57, 49, 12, 30, 79, 99, 70, 46, 61, 92, 37, 36, ...]},
  {27, [54, 11, 56, 55, 83, 78, 47, 57, 50, 19],
   [45, 70, 77, 49, 12, 41, 69, 78, 91, 20, 51, 67, 3, 6, 22, 62, 27, 60, 4, 63, ...]},
  {28, [71, 72, 99, 35, 76, 23, 8, 44, 46, 53],
   [25, 97, 99, 77, 37, 23, 51, 22, 65, 62, 60, 46, 4, 47, 92, 84, 9, 61, 24, ...]},
  {29, [69, 33, 37, 74, 19, 38, 81, 82, 62, 66],
   [42, 3, 67, 30, 52, 90, 47, 46, 34, 4, 1, 71, 98, 50, 54, 94, 58, 15, ...]},
  {30, [25, 5, 15, 20, 84, 23, 86, 74, 50, 22],
   [20, 85, 71, 46, 21, 92, 61, 15, 22, 73, 51, 1, 84, 86, 49, 25, 57, ...]},
  {31, [26, 60, 71, 4, 51, 57, 81, 61, 99, 64],
   [13, 70, 71, 77, 9, 68, 76, 99, 97, 55, 94, 4, 98, 34, 27, 54, ...]},
  {32, [61, 16, 7, 90, 49, 39, 24, 34, 35, 17],
   [90, 75, 34, 25, 39, 26, 59, 67, 24, 35, 62, 19, 17, 54, 31, ...]},
  {33, [91, 74, 62, 52, 86, 6, 46, 60, 16, 88],
   [27, 4, 32, 1, 74, 52, 69, 19, 62, 16, 91, 26, 86, 22, ...]},
  {34, [79, 47, 49, 71, 56, 89, 21, 14, 29, 58],
   [80, 2, 93, 71, 37, 3, 33, 70, 9, 18, 20, 97, 85, ...]},
  {35, [13, 30, 58, 94, 50, 44, 38, 99, 40, 9], [5, 75, 79, 40, 84, 20, 9, 2, 67, 95, 24, 30, ...]},
  {36, [51, 30, 95, 27, 56, 7, 65, 94, 32, 86], [33, 90, 32, 80, 1, 79, 97, 66, 23, 29, 45, ...]},
  {37, [14, 13, 1, 4, 86, 17, 9, 41, 68, 91], [1, 17, 85, 42, 82, 2, 91, 9, 94, 8, ...]},
  {38, [63, 34, 17, 95, 15, 21, 1, 29, 39, 28], [81, 73, 45, 15, 65, 54, 74, 76, 12, ...]},
  {39, ~c"\nB7,U:P$.-", [45, 37, 60, 8, 86, 31, 76, 90, ...]},
  {40, [31, 12, 91, 62, 79, 34, 7, 81, ...], [49, 90, 73, 12, 57, 54, 83, ...]},
  {41, [45, 60, 94, 64, 30, 32, 90, ...], [85, 65, 13, 79, 4, 36, ...]},
  {42, [26, 16, 82, 83, 74, 68, ...], [21, 59, 65, 72, 29, ...]},
  {43, [33, 83, 48, 64, 26, ...], [78, 22, 1, 43, ...]},
  {44, ~c"ZD&a5<:2'b", [88, 31, 11, ...]},
  {45, [79, 31, 56, ...], [90, 53, ...]},
  {46, ~c".4$XY?'L&(", [82, ...]},
  {47, ~c"\f_C\b%SR4\t3", [...]},
  {48, [...], ...},
  {49, ...},
  {...},
  ...
]

Part 1

cards
|> Enum.map(fn {_, wins, inputs} ->
  matches = length(wins) - length(wins -- inputs)

  if matches > 0, do: 2 ** (matches - 1), else: 0
end)
|> dbg()
|> Enum.sum()
19855

Part 2

cards
|> Enum.reduce(%{}, fn {id, wins, inputs}, acc ->
  matches = length(wins) - length(wins -- inputs)

  {current, acc} =
    Map.get_and_update(acc, id, fn v ->
      v = (v || 0) + 1
      {v, v}
    end)

  Enum.reduce(1..matches//1, acc, &amp;Map.update(&amp;2, id + &amp;1, current, fn a -> a + current end))
end)
|> Map.values()
|> Enum.sum()
|> dbg()
10378710