this repo has no description
1<!-- livebook:{"persist_outputs":true} -->
2
3# Day 02
4
5```elixir
6Mix.install([:kino_aoc])
7```
8
9## Section
10
11<!-- livebook:{"attrs":{"assign_to":"puzzle_input","day":"2","session_secret":"ADVENT_OF_CODE_SESSION","year":"2023"},"chunks":null,"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} -->
12
13```elixir
14{:ok, puzzle_input} =
15 KinoAOC.download_puzzle("2023", "2", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
16```
17
18<!-- livebook:{"output":true} -->
19
20```
21{:ok,
22 "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" <> ...}
23```
24
25```elixir
26games =
27 puzzle_input
28 |> String.split("\n", trim: true)
29 |> Enum.map(fn "Game " <> game ->
30 {id, ": " <> rest} = Integer.parse(game)
31
32 picks =
33 for pick <- String.split(rest, "; ") do
34 pick
35 |> String.split(", ")
36 |> Map.new(fn balls ->
37 {num, " " <> color} = Integer.parse(balls)
38 {color, num}
39 end)
40 end
41
42 {id, picks}
43 end)
44```
45
46<!-- livebook:{"output":true} -->
47
48```
49[
50 {1,
51 [
52 %{"blue" => 3, "green" => 7, "red" => 10},
53 %{"green" => 4, "red" => 4},
54 %{"blue" => 7, "green" => 1, "red" => 5},
55 %{"blue" => 8, "red" => 10},
56 %{"blue" => 7, "green" => 1, "red" => 19}
57 ]},
58 {2,
59 [
60 %{"green" => 10, "red" => 6},
61 %{"green" => 11, "red" => 4},
62 %{"blue" => 2, "green" => 16},
63 %{"blue" => 5, "green" => 7, "red" => 4},
64 %{"blue" => 1, "green" => 17, "red" => 1}
65 ]},
66 {3,
67 [
68 %{"blue" => 9, "green" => 1, "red" => 5},
69 %{"red" => 5},
70 %{"blue" => 8, "green" => 2, "red" => 11},
71 %{"blue" => 6, "green" => 2}
72 ]},
73 {4,
74 [
75 %{"green" => 5, "red" => 2},
76 %{"blue" => 2, "green" => 3, "red" => 3},
77 %{"blue" => 2, "red" => 3},
78 %{"green" => 8, "red" => 2}
79 ]},
80 {5,
81 [
82 %{"blue" => 13, "red" => 12},
83 %{"blue" => 13, "green" => 2, "red" => 9},
84 %{"blue" => 9, "red" => 1},
85 %{"blue" => 12, "green" => 2},
86 %{"blue" => 11, "green" => 1, "red" => 1}
87 ]},
88 {6,
89 [
90 %{"blue" => 4, "red" => 11},
91 %{"red" => 4},
92 %{"green" => 1, "red" => 7},
93 %{"blue" => 1, "green" => 1},
94 %{"blue" => 8, "red" => 10},
95 %{"blue" => 2, "green" => 1, "red" => 8}
96 ]},
97 {7,
98 [
99 %{"blue" => 7, "green" => 1, "red" => 15},
100 %{"blue" => 7, "green" => 5, "red" => 17},
101 %{"blue" => 5, "green" => 1},
102 %{"blue" => 11, "green" => 2, "red" => 17},
103 %{"blue" => 2, "green" => 14, "red" => 9},
104 %{"blue" => 6, "red" => 19}
105 ]},
106 {8,
107 [
108 %{"green" => 13},
109 %{"green" => 5},
110 %{"blue" => 3, "green" => 9, "red" => 1},
111 %{"blue" => 4, "green" => 11, "red" => 4}
112 ]},
113 {9,
114 [
115 %{"blue" => 1, "green" => 4, "red" => 1},
116 %{"blue" => 7, "green" => 4, "red" => 7},
117 %{"blue" => 9, "red" => 4},
118 %{"blue" => 2, "green" => 5, "red" => 8},
119 %{"blue" => 6, "green" => 2},
120 %{"blue" => 10, "green" => 5, "red" => 5}
121 ]},
122 {10,
123 [
124 %{"blue" => 5, "green" => 1, "red" => 3},
125 %{"blue" => 3, "green" => 4, "red" => 9},
126 %{"blue" => 5, "green" => 2, "red" => 11},
127 %{"blue" => 1, "green" => 3, "red" => 2},
128 %{"blue" => 2, "red" => 6}
129 ]},
130 {11,
131 [
132 %{"blue" => 12, "green" => 6, "red" => 2},
133 %{"blue" => 9, "green" => 1, "red" => 2},
134 %{"blue" => 3, "green" => 12}
135 ]},
136 {12,
137 [
138 %{"blue" => 1, "green" => 12, "red" => 1},
139 %{"blue" => 1, "green" => 6, "red" => 2},
140 %{"blue" => 1, "green" => 6, "red" => 6},
141 %{"green" => 3, "red" => 6}
142 ]},
143 {13,
144 [
145 %{"blue" => 3, "green" => 19, "red" => 5},
146 %{"blue" => 7, "green" => 11, "red" => 6},
147 %{"blue" => 8, "red" => 6},
148 %{"blue" => 3, "green" => 4, "red" => 4},
149 %{"blue" => 5, "green" => 15, "red" => 8},
150 %{"blue" => 5, "green" => 10, "red" => 2}
151 ]},
152 {14,
153 [
154 %{"blue" => 5, "green" => 9},
155 %{"blue" => 6, "green" => 4},
156 %{"blue" => 4, "green" => 14, "red" => 1},
157 %{"blue" => 3, "green" => 3},
158 %{"green" => 2},
159 %{"blue" => 5, "green" => 7, "red" => 1}
160 ]},
161 {15,
162 [
163 %{"blue" => 8, "red" => 5},
164 %{"blue" => 9, "red" => 3},
165 %{"blue" => 16, "green" => 1, "red" => 5},
166 %{"blue" => 1, "green" => 2, "red" => 3},
167 %{"blue" => 10, "green" => 2, "red" => 5}
168 ]},
169 {16,
170 [
171 %{"blue" => 6, "green" => 9, "red" => 10},
172 %{"blue" => 8, "green" => 14, "red" => 9},
173 %{"blue" => 1, "green" => 7, "red" => 1},
174 %{"blue" => 8, "green" => 5, "red" => 8},
175 %{"blue" => 5, "green" => 14, "red" => 10},
176 %{"blue" => 7, "green" => 3, "red" => 11}
177 ]},
178 {17,
179 [
180 %{"blue" => 12, "green" => 6, "red" => 12},
181 %{"blue" => 17, "green" => 14, "red" => 4},
182 %{"blue" => 11, "green" => 13, "red" => 1}
183 ]},
184 {18,
185 [
186 %{"blue" => 7, "green" => 2, "red" => 4},
187 %{"blue" => 1, "green" => 2, "red" => 4},
188 %{"blue" => 17, "red" => 2}
189 ]},
190 {19,
191 [
192 %{"green" => 9, "red" => 3},
193 %{"blue" => 2, "green" => 2, "red" => 8},
194 %{"blue" => 3, "green" => 15, "red" => 11},
195 %{"blue" => 1, "green" => 18, "red" => 3}
196 ]},
197 {20,
198 [
199 %{"blue" => 16, "green" => 5, "red" => 5},
200 %{"blue" => 8, "green" => 6, "red" => 4},
201 %{"blue" => 11, "red" => 10},
202 %{"blue" => 5, "green" => 5, "red" => 5}
203 ]},
204 {21,
205 [
206 %{"blue" => 3, "green" => 14, "red" => 1},
207 %{"blue" => 6, "green" => 17, "red" => 6},
208 %{"blue" => 17, "green" => 12, "red" => 3},
209 %{"blue" => 19, "green" => 15, "red" => 1},
210 %{"blue" => 18, "green" => 4, "red" => 3}
211 ]},
212 {22,
213 [
214 %{"blue" => 15},
215 %{"blue" => 11, "green" => 1, "red" => 2},
216 %{"green" => 1, "red" => 7},
217 %{"blue" => 18, "green" => 1, "red" => 1},
218 %{"blue" => 16},
219 %{"blue" => 6, "red" => 3}
220 ]},
221 {23,
222 [
223 %{"blue" => 11, "green" => 6, "red" => 4},
224 %{"blue" => 8, "green" => 9, "red" => 11},
225 %{"blue" => 2, "green" => 5, "red" => 5},
226 %{"blue" => 4, "green" => 11, "red" => 11},
227 %{"blue" => 9, "green" => 3, "red" => 2}
228 ]},
229 {24,
230 [
231 %{"green" => 7, "red" => 2},
232 %{"blue" => 1, "green" => 15, "red" => 8},
233 %{"blue" => 6, "green" => 6, "red" => 3}
234 ]},
235 {25,
236 [
237 %{"blue" => 9, "green" => 9},
238 %{"blue" => 7, "green" => 3, "red" => 1},
239 %{"blue" => 1, "green" => 6, "red" => 1},
240 %{"blue" => 1, "green" => 6, "red" => 1}
241 ]},
242 {26,
243 [
244 %{"blue" => 15, "green" => 1, "red" => 1},
245 %{"blue" => 12, "green" => 1, "red" => 1},
246 %{"blue" => 16},
247 %{"blue" => 14, "green" => 11, "red" => 5},
248 %{"blue" => 14, "green" => 6, "red" => 4}
249 ]},
250 {27,
251 [
252 %{"green" => 9, "red" => 14},
253 %{"blue" => 6, "green" => 5, "red" => 11},
254 %{"blue" => 6, "green" => 9, "red" => 1}
255 ]},
256 {28,
257 [
258 %{"blue" => 1, "green" => 6, "red" => 9},
259 %{"green" => 1, "red" => 9},
260 %{"red" => 7},
261 %{"blue" => 1, "green" => 2, "red" => 11},
262 %{"green" => 10, "red" => 8},
263 %{"blue" => 1, "green" => 6, "red" => 5}
264 ]},
265 {29,
266 [
267 %{"blue" => 19, "green" => 3, "red" => 1},
268 %{"blue" => 9, "red" => 1},
269 %{"blue" => 17, "green" => 8},
270 %{"blue" => 11, "green" => 4}
271 ]},
272 {30, [%{"blue" => 7}, %{"blue" => 5, "green" => 1, "red" => 1}, %{"blue" => 3, "red" => 1}]},
273 {31,
274 [
275 %{"blue" => 1, "green" => 2, "red" => 9},
276 %{"blue" => 3, "green" => 1, "red" => 5},
277 %{"green" => 2, "red" => 7},
278 %{"green" => 2, "red" => 12}
279 ]},
280 {32,
281 [
282 %{"blue" => 1, "green" => 17, "red" => 1},
283 %{"blue" => 14, "green" => 10, "red" => 6},
284 %{"blue" => 11, "green" => 12, "red" => 3}
285 ]},
286 {33,
287 [
288 %{"blue" => 3, "green" => 1, "red" => 2},
289 %{"blue" => 7, "green" => 4},
290 %{"blue" => 5, "green" => 3, "red" => 1}
291 ]},
292 {34,
293 [
294 %{"blue" => 9, "green" => 1, "red" => 9},
295 %{"blue" => 12, "green" => 2, "red" => 12},
296 %{"blue" => 3, "red" => 12},
297 %{"blue" => 14, "green" => 2, "red" => 11},
298 %{"blue" => 12, "red" => 10}
299 ]},
300 {35,
301 [
302 %{"blue" => 6, "red" => 2},
303 %{"blue" => 5},
304 %{"blue" => 9, "green" => 6, "red" => 3},
305 %{"blue" => 2, "green" => 3, "red" => 1}
306 ]},
307 {36,
308 [
309 %{"blue" => 9, "green" => 4, "red" => 6},
310 %{"green" => 4, "red" => 2},
311 %{"green" => 3, "red" => 7},
312 %{"blue" => 2, "green" => 6},
313 %{"blue" => 4, "green" => 3, "red" => 3},
314 %{"blue" => 16, "green" => 3, "red" => 4}
315 ]},
316 {37,
317 [
318 %{"blue" => 4, "green" => 2, "red" => 8},
319 %{"blue" => 4, "green" => 2, "red" => 3},
320 %{"blue" => 5, "green" => 3},
321 %{"blue" => 9, "green" => 15},
322 %{"blue" => 7, "green" => 11, "red" => 5}
323 ]},
324 {38,
325 [
326 %{"blue" => 1, "red" => 12},
327 %{"blue" => 2, "green" => 3, "red" => 10},
328 %{"blue" => 7, "green" => 3, "red" => 8},
329 %{"green" => 2, "red" => 14}
330 ]},
331 {39,
332 [
333 %{"blue" => 17, "green" => 16, "red" => 2},
334 %{"blue" => 13, "green" => 4, "red" => 6},
335 %{"blue" => 7, "green" => 1, "red" => 4},
336 %{"blue" => 3, "green" => 2},
337 %{"blue" => 17, "green" => 12, "red" => 6},
338 %{"blue" => 2, "green" => 6, "red" => 5}
339 ]},
340 {40,
341 [
342 %{"blue" => 4, "green" => 3, "red" => 2},
343 %{"green" => 2, "red" => 3},
344 %{"blue" => 6, "green" => 6, "red" => 2},
345 %{"green" => 5},
346 %{"blue" => 3, "green" => 5, "red" => 1}
347 ]},
348 {41,
349 [
350 %{"green" => 13, "red" => 11},
351 %{"blue" => 1, "green" => 3, "red" => 2},
352 %{"blue" => 1, "green" => 3, "red" => 9},
353 %{"green" => 11, "red" => 12},
354 %{"green" => 1, "red" => 9},
355 %{"green" => 9, ...}
356 ]},
357 {42,
358 [
359 %{"blue" => 2, "green" => 4},
360 %{"blue" => 6, "green" => 10},
361 %{"blue" => 13, "green" => 6, "red" => 3},
362 %{"blue" => 11, "green" => 17},
363 %{"blue" => 8, ...}
364 ]},
365 {43,
366 [
367 %{"blue" => 2, "green" => 10, "red" => 10},
368 %{"blue" => 3, "green" => 5, "red" => 3},
369 %{"blue" => 4, "green" => 10, ...},
370 %{"green" => 5},
371 %{...}
372 ]},
373 {44,
374 [
375 %{"blue" => 1, "green" => 5, "red" => 4},
376 %{"blue" => 1, "green" => 3, ...},
377 %{"blue" => 1, ...},
378 %{...},
379 ...
380 ]},
381 {45, [%{"blue" => 7, "green" => 4, ...}, %{"blue" => 3, ...}, %{...}, ...]},
382 {46, [%{"blue" => 5, ...}, %{...}, ...]},
383 {47, [%{...}, ...]},
384 {48, [...]},
385 {49, ...},
386 {...},
387 ...
388]
389```
390
391## Part 1
392
393```elixir
394games
395|> Enum.filter(fn {_, picks} ->
396 Enum.all?(picks, fn map ->
397 Map.get(map, "red", 0) <= 12 and Map.get(map, "green", 0) <= 13 and
398 Map.get(map, "blue", 0) <= 14
399 end)
400end)
401|> Enum.map(&elem(&1, 0))
402|> Enum.sum()
403```
404
405<!-- livebook:{"output":true} -->
406
407```
4082162
409```
410
411## Part 2
412
413```elixir
414games
415|> Enum.map(fn {_, picks} ->
416 picks
417 |> Enum.reduce([0, 0, 0], fn hand, [r, g, b] ->
418 [
419 max(Map.get(hand, "red", 0), r),
420 max(Map.get(hand, "green", 0), g),
421 max(Map.get(hand, "blue", 0), b)
422 ]
423 end)
424 |> Enum.product()
425end)
426|> Enum.sum()
427```
428
429<!-- livebook:{"output":true} -->
430
431```
43272513
433```
434
435<!-- livebook:{"offset":15042,"stamp":{"token":"XCP.FeGN4d2e9dnN-0MEzQ7fkG8b8Y3D1FEiGVZmcvfp_IBmCEdpr8gG7HkIpV-Id27eJzCE5vj63AzjPXXsdEgWHwh-T5OO4n9ak1Zs__R9RD4uOYpy2NSEJkYkMGlwtPNvlg","version":2}} -->