diff options
author | Federico Igne <undyamon@disroot.org> | 2023-12-01 09:21:16 +0100 |
---|---|---|
committer | Federico Igne <undyamon@disroot.org> | 2023-12-01 09:21:16 +0100 |
commit | 64e22194d39d2914db1e3bf93c90de9e0791d9b3 (patch) | |
tree | 6acdf81dad39cd7c009764b4538beddb0a6d860a /2021/day04 | |
parent | 120d53c0ff20574866ce10fa0538fb8b0dd2ef82 (diff) | |
download | aoc-64e22194d39d2914db1e3bf93c90de9e0791d9b3.tar.gz aoc-64e22194d39d2914db1e3bf93c90de9e0791d9b3.zip |
chore: reorganize project structure
Diffstat (limited to '2021/day04')
-rw-r--r-- | 2021/day04/Cargo.toml | 9 | ||||
-rw-r--r-- | 2021/day04/example.py | 59 | ||||
-rw-r--r-- | 2021/day04/resources/input.txt | 601 | ||||
-rw-r--r-- | 2021/day04/src/main.rs | 147 |
4 files changed, 816 insertions, 0 deletions
diff --git a/2021/day04/Cargo.toml b/2021/day04/Cargo.toml new file mode 100644 index 0000000..40e2341 --- /dev/null +++ b/2021/day04/Cargo.toml | |||
@@ -0,0 +1,9 @@ | |||
1 | [package] | ||
2 | name = "day4" | ||
3 | version = "0.1.0" | ||
4 | authors = ["Federico Igne <git@federicoigne.com>"] | ||
5 | edition = "2018" | ||
6 | |||
7 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html | ||
8 | |||
9 | [dependencies] | ||
diff --git a/2021/day04/example.py b/2021/day04/example.py new file mode 100644 index 0000000..4eac08a --- /dev/null +++ b/2021/day04/example.py | |||
@@ -0,0 +1,59 @@ | |||
1 | import sys | ||
2 | |||
3 | infile = sys.argv[1] if len(sys.argv)>1 else '4.in' | ||
4 | |||
5 | # parse input | ||
6 | numbers = None | ||
7 | B = [] | ||
8 | F = [] | ||
9 | board = [] | ||
10 | for line in open(infile): | ||
11 | line = line.strip() | ||
12 | if numbers is None: | ||
13 | numbers = [int(x) for x in line.split(',')] | ||
14 | else: | ||
15 | if line: | ||
16 | board.append([int(x) for x in line.split()]) | ||
17 | else: | ||
18 | if board: | ||
19 | B.append(board) | ||
20 | board = [] | ||
21 | B.append(board) | ||
22 | |||
23 | for b in B: | ||
24 | assert len(b)==5 and len(b[0])==5 | ||
25 | F.append([[False for _ in range(5)] for _ in range(5)]) | ||
26 | |||
27 | WON = [False for _ in range(len(B))] | ||
28 | for num in numbers: | ||
29 | for i in range(len(B)): | ||
30 | for r in range(5): | ||
31 | for c in range(5): | ||
32 | if B[i][r][c] == num: | ||
33 | F[i][r][c] = True | ||
34 | |||
35 | won = False | ||
36 | for r in range(5): | ||
37 | ok = True | ||
38 | for c in range(5): | ||
39 | if not F[i][r][c]: | ||
40 | ok = False | ||
41 | if ok: | ||
42 | won = True | ||
43 | for c in range(5): | ||
44 | ok = True | ||
45 | for r in range(5): | ||
46 | if not F[i][r][c]: | ||
47 | ok = False | ||
48 | if ok: | ||
49 | won = True | ||
50 | if won and not WON[i]: | ||
51 | WON[i] = True | ||
52 | nwin = len([j for j in range(len(B)) if WON[j]]) | ||
53 | if nwin == 1 or nwin == len(B): | ||
54 | unmarked = 0 | ||
55 | for r in range(5): | ||
56 | for c in range(5): | ||
57 | if not F[i][r][c]: | ||
58 | unmarked += B[i][r][c] | ||
59 | print(unmarked * num) | ||
diff --git a/2021/day04/resources/input.txt b/2021/day04/resources/input.txt new file mode 100644 index 0000000..95b1ec4 --- /dev/null +++ b/2021/day04/resources/input.txt | |||
@@ -0,0 +1,601 @@ | |||
1 | 17,2,33,86,38,41,4,34,91,61,11,81,3,59,29,71,26,44,54,89,46,9,85,62,23,76,45,24,78,14,58,48,57,40,21,49,7,99,8,56,50,19,53,55,10,94,75,68,6,83,84,88,52,80,73,74,79,36,70,28,37,0,42,98,96,92,27,90,47,20,5,77,69,93,31,30,95,25,63,65,51,72,60,16,12,64,18,13,1,35,15,66,67,43,22,87,97,32,39,82 | ||
2 | |||
3 | 10 27 53 91 86 | ||
4 | 15 94 47 38 61 | ||
5 | 32 68 8 88 9 | ||
6 | 35 84 3 7 87 | ||
7 | 62 78 90 66 64 | ||
8 | |||
9 | 30 51 26 16 57 | ||
10 | 66 88 47 75 23 | ||
11 | 61 77 64 9 73 | ||
12 | 44 32 28 80 81 | ||
13 | 3 99 67 49 78 | ||
14 | |||
15 | 68 92 82 74 83 | ||
16 | 12 99 80 72 3 | ||
17 | 56 96 36 28 43 | ||
18 | 2 7 14 24 9 | ||
19 | 63 76 40 37 73 | ||
20 | |||
21 | 88 66 96 86 7 | ||
22 | 94 21 70 25 46 | ||
23 | 28 16 12 69 8 | ||
24 | 59 43 89 30 55 | ||
25 | 45 52 0 83 67 | ||
26 | |||
27 | 21 42 92 30 81 | ||
28 | 15 98 26 79 48 | ||
29 | 90 99 5 88 53 | ||
30 | 2 67 74 55 33 | ||
31 | 54 20 69 39 75 | ||
32 | |||
33 | 53 12 4 86 46 | ||
34 | 62 7 98 6 23 | ||
35 | 17 68 39 63 20 | ||
36 | 29 25 84 87 24 | ||
37 | 54 5 42 8 45 | ||
38 | |||
39 | 14 63 36 84 27 | ||
40 | 72 96 95 99 40 | ||
41 | 28 68 78 8 46 | ||
42 | 41 45 33 15 82 | ||
43 | 65 66 64 49 7 | ||
44 | |||
45 | 22 35 72 75 47 | ||
46 | 53 59 17 95 55 | ||
47 | 25 91 57 10 96 | ||
48 | 39 3 18 90 64 | ||
49 | 34 26 71 52 69 | ||
50 | |||
51 | 72 8 67 92 83 | ||
52 | 87 89 25 39 78 | ||
53 | 86 53 55 22 43 | ||
54 | 21 63 40 9 74 | ||
55 | 29 56 44 30 80 | ||
56 | |||
57 | 33 87 52 80 83 | ||
58 | 70 91 74 63 36 | ||
59 | 48 49 29 42 6 | ||
60 | 54 47 96 4 19 | ||
61 | 53 35 30 43 61 | ||
62 | |||
63 | 82 7 38 86 79 | ||
64 | 53 87 21 45 44 | ||
65 | 10 18 46 30 36 | ||
66 | 12 1 50 2 59 | ||
67 | 94 3 39 62 32 | ||
68 | |||
69 | 68 74 24 97 99 | ||
70 | 45 75 41 62 34 | ||
71 | 3 28 49 1 66 | ||
72 | 10 91 95 58 38 | ||
73 | 61 79 50 27 71 | ||
74 | |||
75 | 69 59 96 5 26 | ||
76 | 67 16 2 72 28 | ||
77 | 45 58 55 18 53 | ||
78 | 74 76 98 38 42 | ||
79 | 82 22 79 89 87 | ||
80 | |||
81 | 3 33 73 66 52 | ||
82 | 69 29 78 75 34 | ||
83 | 1 64 15 17 68 | ||
84 | 27 32 46 54 18 | ||
85 | 55 74 60 28 40 | ||
86 | |||
87 | 9 54 84 1 42 | ||
88 | 15 91 77 74 10 | ||
89 | 55 64 60 22 86 | ||
90 | 18 58 73 0 23 | ||
91 | 11 61 2 68 43 | ||
92 | |||
93 | 75 62 34 89 53 | ||
94 | 39 10 84 56 21 | ||
95 | 86 98 87 90 83 | ||
96 | 17 79 1 19 15 | ||
97 | 42 67 55 6 77 | ||
98 | |||
99 | 36 3 60 1 70 | ||
100 | 63 40 7 88 61 | ||
101 | 65 96 18 73 30 | ||
102 | 42 35 44 45 81 | ||
103 | 77 95 39 24 5 | ||
104 | |||
105 | 81 24 39 53 89 | ||
106 | 99 11 27 22 86 | ||
107 | 5 8 36 97 28 | ||
108 | 92 58 38 34 62 | ||
109 | 32 4 1 74 68 | ||
110 | |||
111 | 97 20 54 99 67 | ||
112 | 63 78 61 57 21 | ||
113 | 28 24 4 98 19 | ||
114 | 64 77 14 81 30 | ||
115 | 16 36 89 79 26 | ||
116 | |||
117 | 73 90 0 28 5 | ||
118 | 11 27 56 96 1 | ||
119 | 29 87 12 69 8 | ||
120 | 63 95 72 86 64 | ||
121 | 48 46 50 37 57 | ||
122 | |||
123 | 22 3 7 87 14 | ||
124 | 90 11 67 76 13 | ||
125 | 58 49 16 56 59 | ||
126 | 45 46 19 41 23 | ||
127 | 75 66 61 51 54 | ||
128 | |||
129 | 4 6 84 59 86 | ||
130 | 18 16 40 79 85 | ||
131 | 38 98 95 89 5 | ||
132 | 82 21 76 36 13 | ||
133 | 71 0 17 47 29 | ||
134 | |||
135 | 73 41 26 87 95 | ||
136 | 62 99 58 9 20 | ||
137 | 45 10 71 28 39 | ||
138 | 89 17 29 46 81 | ||
139 | 49 35 24 74 32 | ||
140 | |||
141 | 62 22 95 86 0 | ||
142 | 2 39 9 41 25 | ||
143 | 59 42 94 74 13 | ||
144 | 72 69 75 97 21 | ||
145 | 6 71 90 4 19 | ||
146 | |||
147 | 62 75 92 98 10 | ||
148 | 80 12 57 82 25 | ||
149 | 3 65 67 81 15 | ||
150 | 1 69 43 14 45 | ||
151 | 93 53 36 66 4 | ||
152 | |||
153 | 72 12 47 40 78 | ||
154 | 68 43 24 28 99 | ||
155 | 5 98 70 25 59 | ||
156 | 8 10 58 46 7 | ||
157 | 36 56 37 84 32 | ||
158 | |||
159 | 37 2 68 52 23 | ||
160 | 66 80 18 98 84 | ||
161 | 97 77 96 3 26 | ||
162 | 12 14 40 42 99 | ||
163 | 29 9 30 11 44 | ||
164 | |||
165 | 24 82 7 51 16 | ||
166 | 96 0 10 92 43 | ||
167 | 34 80 5 59 57 | ||
168 | 30 18 72 37 38 | ||
169 | 31 28 81 87 94 | ||
170 | |||
171 | 40 93 85 27 69 | ||
172 | 70 6 41 14 17 | ||
173 | 58 95 79 24 65 | ||
174 | 62 48 11 78 43 | ||
175 | 30 21 19 16 97 | ||
176 | |||
177 | 90 14 51 98 39 | ||
178 | 45 56 69 24 38 | ||
179 | 73 29 88 9 62 | ||
180 | 72 84 27 18 81 | ||
181 | 22 7 23 91 68 | ||
182 | |||
183 | 55 19 29 40 18 | ||
184 | 63 51 26 93 12 | ||
185 | 11 50 60 88 65 | ||
186 | 9 35 22 97 23 | ||
187 | 61 69 82 32 28 | ||
188 | |||
189 | 37 17 81 94 1 | ||
190 | 19 6 0 49 8 | ||
191 | 40 25 34 98 63 | ||
192 | 59 15 53 23 64 | ||
193 | 66 52 69 84 68 | ||
194 | |||
195 | 83 86 19 87 93 | ||
196 | 85 92 24 50 33 | ||
197 | 1 41 40 96 26 | ||
198 | 99 59 9 98 3 | ||
199 | 45 75 60 52 90 | ||
200 | |||
201 | 41 40 36 70 57 | ||
202 | 64 63 72 16 99 | ||
203 | 50 84 69 89 43 | ||
204 | 12 55 54 67 53 | ||
205 | 59 13 42 78 91 | ||
206 | |||
207 | 98 19 96 21 39 | ||
208 | 28 48 83 50 97 | ||
209 | 57 7 12 6 63 | ||
210 | 38 32 52 66 10 | ||
211 | 2 18 42 75 94 | ||
212 | |||
213 | 75 31 77 20 90 | ||
214 | 35 14 28 54 95 | ||
215 | 96 24 86 11 58 | ||
216 | 7 50 97 76 63 | ||
217 | 27 51 34 21 83 | ||
218 | |||
219 | 60 89 11 38 88 | ||
220 | 57 36 77 55 18 | ||
221 | 42 27 67 32 94 | ||
222 | 12 9 24 10 14 | ||
223 | 69 35 79 97 50 | ||
224 | |||
225 | 46 82 60 45 6 | ||
226 | 84 88 0 7 51 | ||
227 | 37 52 64 25 74 | ||
228 | 31 8 75 53 72 | ||
229 | 11 47 34 40 50 | ||
230 | |||
231 | 70 96 35 20 26 | ||
232 | 73 62 54 72 4 | ||
233 | 29 27 8 46 48 | ||
234 | 31 0 90 81 16 | ||
235 | 82 44 88 22 32 | ||
236 | |||
237 | 73 95 77 66 37 | ||
238 | 30 68 12 85 11 | ||
239 | 34 5 57 15 38 | ||
240 | 22 89 78 7 40 | ||
241 | 71 1 54 90 39 | ||
242 | |||
243 | 13 80 22 73 30 | ||
244 | 49 36 98 75 33 | ||
245 | 32 95 74 54 56 | ||
246 | 21 55 68 34 61 | ||
247 | 60 50 3 38 11 | ||
248 | |||
249 | 21 80 17 8 46 | ||
250 | 7 88 18 22 20 | ||
251 | 41 73 72 0 34 | ||
252 | 66 75 45 47 30 | ||
253 | 44 10 93 28 58 | ||
254 | |||
255 | 32 50 78 90 29 | ||
256 | 28 71 77 2 69 | ||
257 | 79 66 30 40 37 | ||
258 | 14 11 63 10 60 | ||
259 | 84 88 65 8 54 | ||
260 | |||
261 | 86 89 64 69 76 | ||
262 | 53 82 24 16 51 | ||
263 | 67 75 3 33 21 | ||
264 | 23 63 99 13 43 | ||
265 | 4 39 7 73 87 | ||
266 | |||
267 | 3 38 22 72 80 | ||
268 | 56 48 1 50 60 | ||
269 | 49 98 67 53 30 | ||
270 | 79 61 66 9 45 | ||
271 | 96 24 23 43 78 | ||
272 | |||
273 | 62 10 16 52 93 | ||
274 | 64 81 45 21 23 | ||
275 | 90 39 98 70 28 | ||
276 | 57 42 37 47 87 | ||
277 | 99 48 94 75 9 | ||
278 | |||
279 | 69 91 72 58 67 | ||
280 | 13 16 52 86 68 | ||
281 | 17 40 23 15 83 | ||
282 | 80 37 85 82 60 | ||
283 | 22 76 3 89 35 | ||
284 | |||
285 | 79 61 4 0 89 | ||
286 | 47 6 10 12 83 | ||
287 | 13 24 31 50 90 | ||
288 | 54 99 45 42 98 | ||
289 | 21 73 39 15 16 | ||
290 | |||
291 | 25 67 43 16 93 | ||
292 | 15 98 5 54 57 | ||
293 | 87 60 64 36 7 | ||
294 | 65 73 41 44 4 | ||
295 | 38 52 47 19 30 | ||
296 | |||
297 | 22 20 1 92 94 | ||
298 | 52 73 90 14 16 | ||
299 | 54 59 29 9 44 | ||
300 | 65 83 89 75 45 | ||
301 | 72 33 77 15 69 | ||
302 | |||
303 | 84 46 85 11 41 | ||
304 | 13 95 28 38 6 | ||
305 | 96 74 19 32 15 | ||
306 | 37 70 29 83 14 | ||
307 | 48 62 92 8 64 | ||
308 | |||
309 | 26 92 89 37 23 | ||
310 | 39 97 2 40 42 | ||
311 | 46 85 52 47 45 | ||
312 | 77 36 67 10 27 | ||
313 | 8 28 24 53 86 | ||
314 | |||
315 | 52 21 54 91 72 | ||
316 | 96 53 17 89 51 | ||
317 | 23 58 5 18 2 | ||
318 | 13 68 32 47 75 | ||
319 | 50 97 30 84 86 | ||
320 | |||
321 | 91 21 13 3 74 | ||
322 | 33 1 4 95 31 | ||
323 | 29 52 62 14 10 | ||
324 | 23 11 56 51 35 | ||
325 | 47 93 8 70 58 | ||
326 | |||
327 | 1 83 91 43 7 | ||
328 | 58 18 66 47 39 | ||
329 | 67 62 89 41 35 | ||
330 | 32 50 96 56 49 | ||
331 | 11 21 12 80 86 | ||
332 | |||
333 | 23 3 63 99 42 | ||
334 | 98 97 66 86 60 | ||
335 | 73 32 96 52 75 | ||
336 | 8 31 59 84 19 | ||
337 | 93 48 35 0 92 | ||
338 | |||
339 | 9 55 36 31 78 | ||
340 | 24 81 3 10 80 | ||
341 | 88 42 91 14 87 | ||
342 | 6 59 44 30 12 | ||
343 | 71 68 58 1 57 | ||
344 | |||
345 | 85 36 3 58 11 | ||
346 | 16 44 69 60 39 | ||
347 | 51 31 65 95 87 | ||
348 | 82 63 8 14 49 | ||
349 | 67 7 64 91 59 | ||
350 | |||
351 | 52 65 60 39 22 | ||
352 | 1 77 81 91 46 | ||
353 | 19 18 87 31 88 | ||
354 | 23 11 32 10 79 | ||
355 | 4 50 8 59 68 | ||
356 | |||
357 | 54 60 99 68 42 | ||
358 | 40 20 88 5 69 | ||
359 | 14 27 73 80 30 | ||
360 | 47 62 33 86 35 | ||
361 | 72 74 12 8 15 | ||
362 | |||
363 | 37 32 15 90 21 | ||
364 | 14 61 52 82 76 | ||
365 | 44 27 58 51 55 | ||
366 | 49 2 10 17 79 | ||
367 | 29 48 71 86 30 | ||
368 | |||
369 | 36 63 48 89 92 | ||
370 | 38 71 1 46 41 | ||
371 | 3 83 79 14 34 | ||
372 | 51 11 96 69 35 | ||
373 | 61 74 99 22 95 | ||
374 | |||
375 | 25 3 2 88 13 | ||
376 | 7 98 22 89 40 | ||
377 | 30 47 42 43 31 | ||
378 | 55 65 75 99 24 | ||
379 | 23 64 29 90 10 | ||
380 | |||
381 | 57 85 31 17 98 | ||
382 | 70 3 81 51 34 | ||
383 | 43 90 23 50 37 | ||
384 | 13 75 89 25 88 | ||
385 | 12 99 46 62 36 | ||
386 | |||
387 | 97 48 96 15 53 | ||
388 | 45 87 35 0 77 | ||
389 | 46 72 89 55 54 | ||
390 | 98 81 69 92 42 | ||
391 | 95 47 19 33 63 | ||
392 | |||
393 | 65 58 47 51 17 | ||
394 | 61 60 43 10 9 | ||
395 | 4 2 53 3 25 | ||
396 | 37 93 18 59 75 | ||
397 | 42 96 11 32 35 | ||
398 | |||
399 | 10 96 37 83 17 | ||
400 | 2 87 64 18 99 | ||
401 | 81 73 1 0 66 | ||
402 | 78 80 42 72 56 | ||
403 | 59 97 53 9 12 | ||
404 | |||
405 | 59 97 49 11 58 | ||
406 | 6 99 83 27 12 | ||
407 | 21 67 79 16 57 | ||
408 | 96 9 39 69 81 | ||
409 | 18 43 42 45 95 | ||
410 | |||
411 | 10 37 77 48 85 | ||
412 | 15 19 71 92 44 | ||
413 | 57 94 39 28 1 | ||
414 | 52 46 79 60 38 | ||
415 | 11 55 65 74 93 | ||
416 | |||
417 | 10 92 67 91 2 | ||
418 | 8 28 47 80 98 | ||
419 | 48 33 1 21 37 | ||
420 | 41 15 44 73 17 | ||
421 | 31 96 5 68 65 | ||
422 | |||
423 | 87 55 85 48 7 | ||
424 | 10 53 42 80 84 | ||
425 | 81 91 68 54 27 | ||
426 | 32 45 67 76 34 | ||
427 | 30 62 31 72 12 | ||
428 | |||
429 | 15 13 94 65 7 | ||
430 | 42 83 84 55 8 | ||
431 | 56 78 38 54 87 | ||
432 | 97 37 67 10 29 | ||
433 | 3 96 2 30 14 | ||
434 | |||
435 | 96 20 38 1 41 | ||
436 | 51 29 98 21 36 | ||
437 | 87 32 85 13 66 | ||
438 | 15 94 61 0 83 | ||
439 | 5 43 73 10 39 | ||
440 | |||
441 | 74 19 4 13 53 | ||
442 | 31 92 66 40 39 | ||
443 | 42 3 21 33 95 | ||
444 | 14 34 23 45 60 | ||
445 | 16 82 89 44 7 | ||
446 | |||
447 | 64 7 12 85 32 | ||
448 | 78 23 26 39 34 | ||
449 | 42 97 41 54 59 | ||
450 | 83 4 86 57 98 | ||
451 | 87 72 0 55 96 | ||
452 | |||
453 | 32 65 88 4 57 | ||
454 | 15 79 17 58 70 | ||
455 | 8 64 89 14 82 | ||
456 | 10 40 18 94 75 | ||
457 | 84 85 92 63 56 | ||
458 | |||
459 | 19 95 11 31 38 | ||
460 | 15 0 82 75 13 | ||
461 | 25 67 78 59 18 | ||
462 | 99 69 57 21 81 | ||
463 | 14 63 12 85 35 | ||
464 | |||
465 | 41 82 78 99 90 | ||
466 | 15 10 3 87 65 | ||
467 | 54 2 6 32 22 | ||
468 | 39 89 4 14 8 | ||
469 | 85 75 76 25 74 | ||
470 | |||
471 | 69 43 56 78 26 | ||
472 | 41 11 40 8 73 | ||
473 | 64 28 55 52 44 | ||
474 | 13 33 18 77 88 | ||
475 | 50 16 60 79 83 | ||
476 | |||
477 | 34 24 48 22 11 | ||
478 | 74 60 61 42 26 | ||
479 | 37 89 84 53 7 | ||
480 | 38 41 43 31 69 | ||
481 | 17 64 88 52 14 | ||
482 | |||
483 | 40 69 43 12 29 | ||
484 | 39 79 82 0 48 | ||
485 | 17 87 73 31 71 | ||
486 | 74 35 34 85 3 | ||
487 | 76 47 13 80 20 | ||
488 | |||
489 | 6 21 8 58 86 | ||
490 | 10 84 38 5 74 | ||
491 | 19 62 88 49 1 | ||
492 | 48 44 59 56 4 | ||
493 | 60 63 61 16 73 | ||
494 | |||
495 | 40 99 77 5 11 | ||
496 | 63 30 68 94 39 | ||
497 | 36 66 13 47 89 | ||
498 | 70 22 18 53 96 | ||
499 | 24 56 87 4 93 | ||
500 | |||
501 | 9 29 90 57 60 | ||
502 | 31 97 52 16 22 | ||
503 | 36 99 50 87 13 | ||
504 | 64 84 72 0 71 | ||
505 | 43 45 68 5 7 | ||
506 | |||
507 | 64 38 78 3 89 | ||
508 | 97 25 48 65 57 | ||
509 | 39 93 77 54 6 | ||
510 | 49 10 19 53 47 | ||
511 | 84 69 76 11 86 | ||
512 | |||
513 | 88 86 29 33 72 | ||
514 | 14 93 40 36 59 | ||
515 | 19 71 47 17 91 | ||
516 | 92 16 67 27 55 | ||
517 | 51 15 2 5 84 | ||
518 | |||
519 | 55 2 36 73 61 | ||
520 | 49 25 96 56 27 | ||
521 | 42 4 89 39 83 | ||
522 | 13 14 9 52 51 | ||
523 | 71 20 92 3 5 | ||
524 | |||
525 | 81 59 60 45 25 | ||
526 | 98 94 86 89 8 | ||
527 | 57 78 51 73 53 | ||
528 | 14 15 61 71 47 | ||
529 | 79 0 92 5 55 | ||
530 | |||
531 | 67 45 73 55 53 | ||
532 | 27 88 35 85 60 | ||
533 | 71 24 6 23 21 | ||
534 | 82 76 3 9 22 | ||
535 | 86 78 8 44 47 | ||
536 | |||
537 | 31 89 58 12 71 | ||
538 | 30 92 81 61 14 | ||
539 | 4 39 60 44 94 | ||
540 | 62 85 65 98 3 | ||
541 | 88 25 40 56 47 | ||
542 | |||
543 | 75 85 40 89 19 | ||
544 | 45 86 81 74 92 | ||
545 | 62 33 78 37 1 | ||
546 | 80 2 39 76 68 | ||
547 | 91 5 79 0 54 | ||
548 | |||
549 | 56 45 33 86 47 | ||
550 | 63 73 96 15 95 | ||
551 | 69 85 22 80 20 | ||
552 | 51 43 64 0 58 | ||
553 | 3 6 29 52 74 | ||
554 | |||
555 | 74 33 86 65 16 | ||
556 | 91 80 17 53 88 | ||
557 | 23 61 90 62 79 | ||
558 | 2 95 82 26 49 | ||
559 | 15 47 77 9 46 | ||
560 | |||
561 | 27 49 21 51 53 | ||
562 | 8 26 97 74 34 | ||
563 | 38 48 81 98 46 | ||
564 | 14 80 18 11 9 | ||
565 | 36 82 66 85 86 | ||
566 | |||
567 | 44 7 89 5 45 | ||
568 | 29 48 93 37 41 | ||
569 | 77 67 21 68 81 | ||
570 | 96 28 38 49 58 | ||
571 | 19 80 1 0 50 | ||
572 | |||
573 | 95 10 63 75 76 | ||
574 | 77 43 62 46 18 | ||
575 | 91 79 57 74 85 | ||
576 | 93 81 35 61 98 | ||
577 | 86 67 32 80 84 | ||
578 | |||
579 | 78 41 61 20 40 | ||
580 | 26 34 69 7 13 | ||
581 | 49 60 92 22 56 | ||
582 | 35 99 24 82 29 | ||
583 | 0 85 53 1 75 | ||
584 | |||
585 | 19 18 55 70 84 | ||
586 | 28 68 71 20 6 | ||
587 | 27 90 86 52 2 | ||
588 | 44 43 15 48 39 | ||
589 | 14 37 63 83 75 | ||
590 | |||
591 | 73 61 41 96 68 | ||
592 | 89 40 53 12 91 | ||
593 | 29 37 59 10 19 | ||
594 | 69 98 88 82 24 | ||
595 | 65 72 25 42 4 | ||
596 | |||
597 | 62 50 34 16 8 | ||
598 | 75 88 84 33 29 | ||
599 | 2 64 31 41 86 | ||
600 | 94 45 76 70 3 | ||
601 | 39 89 66 4 24 | ||
diff --git a/2021/day04/src/main.rs b/2021/day04/src/main.rs new file mode 100644 index 0000000..fd74866 --- /dev/null +++ b/2021/day04/src/main.rs | |||
@@ -0,0 +1,147 @@ | |||
1 | use std::fs; | ||
2 | use std::fmt; | ||
3 | use std::path::Path; | ||
4 | |||
5 | struct Bingo { | ||
6 | cards: Vec<BingoCard> | ||
7 | } | ||
8 | |||
9 | impl Bingo { | ||
10 | fn update(&mut self, draw: u32) -> Vec<(usize,u32)> { | ||
11 | self.cards.iter_mut().enumerate().filter_map( | ||
12 | |(i,c)| { | ||
13 | if let Some(s) = c.mark(draw) { | ||
14 | if c.ingame { return Some((i,s)) } | ||
15 | } | ||
16 | None | ||
17 | } | ||
18 | ).collect() | ||
19 | } | ||
20 | |||
21 | fn simulate(&mut self, draws: &[u32]) -> u32 { | ||
22 | if draws.len() > 0 { | ||
23 | if let Some((_,score)) = self.update(draws[0]).first() { | ||
24 | *score | ||
25 | } else { | ||
26 | self.simulate(&draws[1..]) | ||
27 | } | ||
28 | } else { | ||
29 | unreachable!() | ||
30 | } | ||
31 | } | ||
32 | |||
33 | fn simulate_all(&mut self, draws: &[u32]) -> u32 { | ||
34 | if draws.len() > 0 { | ||
35 | for (index,score) in self.update(draws[0]) { | ||
36 | if self.cards.iter().filter(|c| c.ingame).count() == 1 { | ||
37 | return score | ||
38 | } | ||
39 | self.cards[index].ingame = false; | ||
40 | } | ||
41 | self.simulate_all(&draws[1..]) | ||
42 | } else { | ||
43 | unreachable!() | ||
44 | } | ||
45 | } | ||
46 | } | ||
47 | |||
48 | #[derive(Clone)] | ||
49 | struct BingoCard { | ||
50 | ingame: bool, | ||
51 | nums: Vec<(u32,bool)> | ||
52 | } | ||
53 | |||
54 | impl BingoCard { | ||
55 | fn mark(&mut self, n: u32) -> Option<u32> { | ||
56 | if let Some(pos) = self.nums.iter().position(|c| c.0 == n) { | ||
57 | self.nums[pos].1 = true; | ||
58 | if self.check(pos) { | ||
59 | Some(self.score() * n) | ||
60 | } else { None } | ||
61 | } else { None } | ||
62 | } | ||
63 | |||
64 | fn check(&self, pos: usize) -> bool { | ||
65 | let row = pos / 5; | ||
66 | let col = pos % 5; | ||
67 | (5*row..5*row+5).all(|c| self.nums[c].1) | ||
68 | || (0usize..5).all(|c| self.nums[c*5+col].1) | ||
69 | } | ||
70 | |||
71 | fn score(&self) -> u32 { | ||
72 | self.nums.iter().filter_map(|c| if c.1 { None } else { Some(c.0) }).sum() | ||
73 | } | ||
74 | } | ||
75 | |||
76 | impl fmt::Display for BingoCard { | ||
77 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | ||
78 | let str = self.nums.iter().enumerate().map( | ||
79 | |(n,c)| format!("{:>2}{}{}", c.0, if c.1 { '*' } else { ' ' }, if (n+1)%5 == 0 { '\n' } else { ' ' }) | ||
80 | ).collect::<Vec<String>>().join(""); | ||
81 | write!(f, "{}", str) | ||
82 | } | ||
83 | } | ||
84 | |||
85 | impl From<&str> for BingoCard { | ||
86 | fn from(s: &str) -> Self { | ||
87 | let mut nums = Vec::with_capacity(25); | ||
88 | s.lines().for_each( | ||
89 | |l| l.split_whitespace().for_each( | ||
90 | |n| nums.push((n.parse().expect("Malformed input"), false)) | ||
91 | ) | ||
92 | ); | ||
93 | BingoCard { ingame: true, nums } | ||
94 | } | ||
95 | } | ||
96 | |||
97 | /* AOC21 Day 4: https://adventofcode.com/2021/day/4 */ | ||
98 | fn main() { | ||
99 | let input = Path::new("resources").join("input.txt"); | ||
100 | let content = fs::read_to_string(input).expect("Unable to read input file"); | ||
101 | let report: Vec<&str> = content.split("\n\n").collect(); | ||
102 | let draws: Vec<u32> = report[0].split(",").map(|x| x.parse().expect("Malformed input")).collect(); | ||
103 | let cards: Vec<BingoCard> = report[1..].iter().map(|&c| BingoCard::from(c)).collect(); | ||
104 | println!("Ex1: The result is {}", Bingo { cards: cards.clone() }.simulate(&draws)); | ||
105 | println!("Ex1: The result is {}", Bingo { cards }.simulate_all(&draws)); | ||
106 | } | ||
107 | |||
108 | #[cfg(test)] | ||
109 | mod tests { | ||
110 | use super::*; | ||
111 | |||
112 | const INPUT: &str = "7,4,9,5,11,17,23,2,0,14,21,24,10,16,13,6,15,25,12,22,18,20,8,19,3,26,1 | ||
113 | |||
114 | 22 13 17 11 0 | ||
115 | 8 2 23 4 24 | ||
116 | 21 9 14 16 7 | ||
117 | 6 10 3 18 5 | ||
118 | 1 12 20 15 19 | ||
119 | |||
120 | 3 15 0 2 22 | ||
121 | 9 18 13 17 5 | ||
122 | 19 8 7 25 23 | ||
123 | 20 11 10 24 4 | ||
124 | 14 21 16 12 6 | ||
125 | |||
126 | 14 21 17 24 4 | ||
127 | 10 16 15 9 19 | ||
128 | 18 8 23 26 20 | ||
129 | 22 11 13 6 5 | ||
130 | 2 0 12 3 7"; | ||
131 | |||
132 | #[test] | ||
133 | fn winning_score() { | ||
134 | let report: Vec<&str> = INPUT.split("\n\n").collect(); | ||
135 | let draws: Vec<u32> = report[0].split(",").map(|x| x.parse().expect("Malformed input")).collect(); | ||
136 | let cards: Vec<BingoCard> = report[1..].iter().map(|&c| BingoCard::from(c)).collect(); | ||
137 | assert_eq!(4512, Bingo { cards }.simulate(&draws)) | ||
138 | } | ||
139 | |||
140 | #[test] | ||
141 | fn last_winning_score() { | ||
142 | let report: Vec<&str> = INPUT.split("\n\n").collect(); | ||
143 | let draws: Vec<u32> = report[0].split(",").map(|x| x.parse().expect("Malformed input")).collect(); | ||
144 | let cards: Vec<BingoCard> = report[1..].iter().map(|&c| BingoCard::from(c)).collect(); | ||
145 | assert_eq!(1924, Bingo { cards }.simulate_all(&draws)) | ||
146 | } | ||
147 | } | ||