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(&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, &Map.update(&2, id + &1, current, fn a -> a + current end))
end)
|> Map.values()
|> Enum.sum()
|> dbg()
10378710