summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--day4/__init__.py121
-rw-r--r--day4/example.txt19
-rw-r--r--day4/input.txt601
3 files changed, 741 insertions, 0 deletions
diff --git a/day4/__init__.py b/day4/__init__.py
new file mode 100644
index 0000000..74c01f1
--- /dev/null
+++ b/day4/__init__.py
@@ -0,0 +1,121 @@
1from collections import Counter
2from copy import copy
3from dataclasses import dataclass
4from typing import Iterator, List, Optional, Tuple, Callable
5
6from aoc import BaseAssignment
7
8def bold(item: str, condition: Callable[[], bool]):
9 return f'\033[36m{item}\033[0m' if condition() else item
10
11@dataclass
12class Number:
13 nr: int
14 marked: bool = False
15
16 def __int__(self):
17 return self.nr
18
19 def __bool__(self):
20 return self.marked
21
22 def __radd__(self, other):
23 return other + int(self)
24
25 def mark(self):
26 self.marked = True
27
28@dataclass
29class BingoCard:
30 card: List[List[Number]]
31
32 @property
33 def bingo(self) -> bool:
34 return any([
35 *[all(bool(item) for item in row) for row in self.card],
36 *[all(bool(row[col_index]) for row in self.card) for col_index in range(5)]
37 ])
38
39 def mark(self, nr: int):
40 for row in self.card:
41 for item in row:
42 if int(item) == nr:
43 item.mark()
44
45 @property
46 def unmarked(self):
47 return [
48 item
49 for row in self.card
50 for item in row
51 if not bool(item)
52 ]
53
54 def __str__(self):
55 return '\n'.join([
56 ''.join([
57 bold(str(int(item)).rjust(2, ' ').ljust(3, ' '), lambda: item.marked)
58 for item in row
59 ])
60 for row in self.card
61 ])
62
63
64class Assignment(BaseAssignment):
65 def read_input(self, example = False) -> Tuple[List[int], List[BingoCard]]:
66 cards = []
67 card = None
68
69 input = super().read_input(example)
70 nrs = [ int(n) for n in next(input).split(',') ]
71
72 try:
73 row = next(input)
74
75 while True:
76 if row == '':
77 if card is not None:
78 cards.append(BingoCard(card=card))
79 card = []
80 else:
81 card.append([ Number(nr=int(item)) for item in row.split(' ') if item != ''])
82
83 row = next(input)
84
85 except StopIteration:
86 if card is not None:
87 cards.append(BingoCard(card=card))
88
89 return nrs, cards
90
91
92class AssignmentOne(Assignment):
93 example_result = 4512
94
95 def run(self, input: Tuple[List[int], List[BingoCard]]) -> int:
96 nrs, cards = input
97
98 for nr in nrs:
99 for card in cards:
100 card.mark(nr)
101
102 if card.bingo:
103 return nr * sum(card.unmarked)
104
105
106class AssignmentTwo(Assignment):
107 example_result = 1924
108
109 def run(self, input: Tuple[List[int], List[BingoCard]]) -> int:
110 nrs, cards = input
111
112 in_game = copy(cards)
113 for nr in nrs:
114 for card in copy(in_game):
115 card.mark(nr)
116
117 if card.bingo:
118 in_game.remove(card)
119
120 if len(in_game) == 0:
121 return nr * sum(card.unmarked) \ No newline at end of file
diff --git a/day4/example.txt b/day4/example.txt
new file mode 100644
index 0000000..49d17bc
--- /dev/null
+++ b/day4/example.txt
@@ -0,0 +1,19 @@
17,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
2
322 13 17 11 0
4 8 2 23 4 24
521 9 14 16 7
6 6 10 3 18 5
7 1 12 20 15 19
8
9 3 15 0 2 22
10 9 18 13 17 5
1119 8 7 25 23
1220 11 10 24 4
1314 21 16 12 6
14
1514 21 17 24 4
1610 16 15 9 19
1718 8 23 26 20
1822 11 13 6 5
19 2 0 12 3 7 \ No newline at end of file
diff --git a/day4/input.txt b/day4/input.txt
new file mode 100644
index 0000000..0c1c262
--- /dev/null
+++ b/day4/input.txt
@@ -0,0 +1,601 @@
117,25,31,22,79,72,58,47,62,50,30,91,11,63,66,83,33,75,44,18,56,81,32,46,93,13,41,65,14,95,19,38,8,35,52,7,12,70,84,23,4,42,90,60,6,40,97,16,27,86,5,48,54,64,29,67,26,89,99,53,34,0,57,3,92,37,59,9,21,78,51,80,73,82,76,28,88,96,45,69,98,1,2,71,68,49,36,15,55,39,87,77,74,94,61,85,10,43,20,24
2
336 11 70 77 80
463 3 56 75 28
589 91 27 33 82
653 79 52 96 32
758 14 78 65 38
8
926 15 50 56 2
1020 27 42 11 16
1193 44 38 28 68
1266 88 78 81 77
1391 46 55 86 6
14
1546 53 14 17 75
1671 4 70 99 48
1765 96 68 80 72
18 3 97 62 37 88
1982 35 36 23 39
20
2117 1 61 77 5
2274 60 12 24 48
2334 19 68 65 86
2444 59 38 40 95
2567 64 9 52 27
26
2744 60 8 81 3
2830 71 85 23 99
2968 88 38 97 48
3027 70 63 28 12
3167 57 34 13 93
32
3352 82 88 61 0
3468 21 59 75 71
3586 36 39 20 48
3650 40 19 6 34
3793 26 14 41 49
38
3974 18 93 59 77
4014 45 57 61 92
4110 78 42 63 52
4287 3 0 62 20
4325 64 48 22 96
44
4511 73 88 47 30
4610 6 5 25 67
4789 41 62 94 85
4845 99 58 7 57
4977 19 66 43 48
50
5194 47 45 73 44
5222 8 84 79 6
5314 58 26 92 5
5440 48 42 25 2
5537 76 18 80 74
56
5715 3 89 77 98
5813 99 10 97 59
5918 96 64 47 37
6068 92 90 56 11
6176 81 12 91 69
62
6382 97 69 47 10
6451 12 41 23 45
6571 6 67 80 46
6631 70 40 9 42
6727 1 17 25 74
68
69 2 77 1 37 29
7050 8 87 12 76
7174 88 48 60 79
7241 35 92 33 34
7345 52 75 24 28
74
7597 41 49 40 96
7684 54 12 24 45
7739 1 17 85 52
78 3 29 67 33 9
7950 7 47 48 81
80
8176 77 15 84 71
8241 7 32 29 62
8330 87 14 10 48
8498 22 96 45 9
8566 91 83 21 55
86
8720 42 33 9 91
8811 71 64 83 61
8982 54 67 38 60
9077 57 81 78 98
9118 1 27 55 87
92
93 7 13 36 93 47
9445 25 44 58 72
9574 80 52 24 15
9664 43 96 42 20
9782 10 73 46 57
98
9940 36 86 87 76
10016 11 70 81 25
10155 31 83 72 88
10257 33 44 58 5
10364 15 19 67 53
104
10561 95 27 3 20
10685 1 76 25 80
10712 78 98 36 4
10886 90 19 64 38
10922 65 96 87 68
110
11111 52 17 89 64
11290 35 94 81 62
11365 30 51 67 85
11440 32 37 78 74
11597 27 10 96 91
116
11745 14 34 23 49
11879 21 90 56 4
11925 44 92 0 31
12016 24 88 48 84
12115 63 50 76 52
122
12342 31 84 64 24
12434 58 53 3 73
12556 35 33 89 41
12616 8 85 92 6
12740 19 51 14 4
128
12946 61 74 54 30
13035 79 63 8 10
13164 38 71 23 98
13259 72 83 70 50
13391 77 69 55 84
134
13593 40 9 49 66
13645 35 71 65 61
137 5 14 20 83 10
13884 47 53 96 97
139 6 30 77 52 67
140
14119 78 68 18 86
14294 82 16 21 95
14371 63 22 3 72
14491 27 59 49 11
14553 69 46 52 36
146
14744 94 30 21 22
14825 81 60 74 99
14932 62 10 79 39
15028 63 96 90 55
15158 85 93 36 76
152
15390 71 76 51 87
15426 64 2 49 19
15554 47 32 93 92
15688 69 24 60 94
15742 73 67 56 23
158
159 8 22 47 12 10
16059 31 99 41 17
16160 23 37 0 57
16221 11 77 79 91
16350 34 16 72 15
164
16527 11 12 7 83
166 9 50 47 84 35
16775 99 97 78 53
16820 70 51 76 44
16973 90 0 62 58
170
17160 49 0 40 8
17274 73 95 3 90
17327 39 10 19 35
174 6 50 16 72 82
17571 36 11 99 52
176
17715 97 9 75 37
17833 65 30 18 10
17993 14 77 80 36
18082 35 88 12 21
18140 22 84 49 81
182
18318 74 94 79 17
18439 51 98 8 99
18533 63 50 65 40
18629 55 75 91 90
18724 54 87 97 48
188
18944 81 21 77 10
190 8 52 54 5 88
19137 29 59 43 34
19270 30 86 31 56
19335 40 13 4 45
194
19512 84 38 37 54
19672 69 86 90 91
19731 45 15 52 59
19851 9 1 34 63
19953 29 20 3 56
200
20143 46 86 35 73
20294 87 90 39 95
20325 0 17 84 54
20422 27 76 26 63
20591 68 2 14 37
206
20767 63 20 21 27
20898 78 4 51 82
20974 86 46 12 56
21057 94 81 33 11
21129 13 83 37 40
212
21311 87 71 33 64
21452 97 91 79 24
21554 37 72 55 0
21621 67 80 51 10
217 6 35 49 68 18
218
21927 7 95 81 93
22099 97 67 65 72
22159 92 32 43 50
22256 74 42 75 41
22313 36 79 78 23
224
22594 9 47 30 85
226 5 80 86 55 11
22744 54 17 74 36
22822 98 84 7 88
22952 34 0 97 73
230
23110 70 26 89 28
23298 41 77 64 38
23346 8 22 5 29
23471 11 57 20 31
23597 90 50 95 51
236
23726 23 73 25 11
23880 97 68 7 27
23943 72 47 49 93
240 2 21 50 82 66
24134 81 90 18 48
242
24379 61 33 42 50
24428 44 30 99 88
24557 14 35 60 31
24615 27 34 13 19
24772 71 64 76 21
248
24980 73 78 18 28
25079 1 76 42 58
25190 85 48 81 61
25252 44 51 53 39
25363 98 25 24 70
254
25522 63 35 31 11
25655 48 85 65 68
25749 52 40 74 97
25837 69 98 79 67
259 2 91 7 41 16
260
26128 43 21 66 67
26256 88 77 37 41
26363 55 79 94 62
26461 60 23 45 87
26558 12 99 47 73
266
267 2 21 26 27 42
26865 47 71 85 4
26976 13 40 56 29
27050 53 28 97 90
27117 1 14 74 48
272
273 4 98 39 40 11
27490 88 87 86 13
27592 80 95 99 51
27654 18 70 34 38
27775 37 28 78 46
278
279 7 11 73 51 47
28026 69 61 91 57
28155 48 14 94 82
28219 37 15 54 65
28325 43 90 16 81
284
28550 30 78 7 61
28699 32 91 13 21
287 5 27 11 92 73
28871 54 29 20 12
289 8 75 65 9 39
290
29184 13 22 90 7
29264 6 21 3 23
293 8 72 67 61 62
29444 32 20 25 45
29557 81 49 98 77
296
29712 9 53 94 8
29885 0 70 35 82
29990 67 48 79 54
30026 88 51 2 46
30178 63 61 36 29
302
30386 27 13 55 37
30467 61 39 1 66
30579 97 40 42 7
30664 85 33 31 46
30734 65 24 54 50
308
309 8 58 80 35 47
31031 66 45 36 54
311 9 27 64 16 5
31234 14 10 57 85
31340 79 60 61 3
314
31549 31 2 25 9
31634 65 14 54 61
31788 28 45 3 76
318 7 94 24 1 86
31929 66 70 96 50
320
32172 35 31 84 37
322 8 86 4 17 46
32339 80 43 11 3
32426 76 44 20 95
32571 5 51 65 32
326
32798 33 8 41 75
32894 49 27 95 72
32944 18 82 0 90
33086 74 2 59 45
33120 57 25 87 42
332
33364 72 33 23 96
33470 2 68 97 69
33559 49 19 35 10
33687 92 85 34 90
33756 95 88 66 94
338
33997 23 75 47 43
34032 19 69 29 94
34145 38 61 4 40
34226 82 30 16 2
34395 76 5 67 83
344
345 4 75 91 82 23
34652 38 47 49 46
34797 17 6 90 59
348 8 16 12 73 85
34988 64 32 99 11
350
351 2 61 15 7 37
35245 57 43 46 92
35376 99 34 14 9
35451 8 18 81 50
35519 47 97 29 26
356
35770 61 79 67 17
35825 69 78 4 24
35987 11 95 68 91
36051 89 39 66 80
36129 98 43 64 86
362
36395 40 97 32 48
36444 0 64 45 83
36534 88 20 86 31
36684 16 96 78 65
367 2 81 72 69 43
368
36998 88 93 3 10
37053 72 68 81 62
37156 38 36 87 27
37229 99 76 28 23
37316 59 71 21 92
374
37595 17 8 7 46
37671 61 5 90 38
37763 65 25 45 22
37811 16 93 34 14
37955 56 36 91 49
380
38161 36 9 12 40
38260 51 57 41 87
38335 97 75 20 21
38474 34 19 14 95
38584 68 98 62 0
386
387 3 5 57 40 61
38830 79 94 86 84
38920 9 13 27 34
39059 98 17 12 14
39128 73 18 97 75
392
393 3 86 99 48 2
39465 97 26 82 79
39551 16 70 7 89
39622 83 50 78 32
39731 72 28 21 60
398
39967 27 78 91 14
40021 4 20 42 62
40152 3 36 17 18
402 6 40 46 39 63
40380 75 54 96 99
404
40589 77 18 59 99
406 5 55 14 52 12
40791 70 85 16 24
40872 42 80 81 76
40946 95 37 23 11
410
41148 66 23 26 15
41216 76 81 10 49
41357 74 68 67 98
41443 31 53 94 86
41580 71 85 0 33
416
41795 69 45 80 35
41838 88 62 28 1
41944 10 91 39 31
42074 81 64 63 98
42133 13 89 53 56
422
42385 22 55 95 44
42493 9 58 11 27
42515 40 2 28 87
426 5 84 77 48 42
42794 18 16 12 79
428
42969 74 75 16 77
43045 56 60 81 68
43133 73 49 14 92
43294 51 24 38 15
43390 10 89 6 32
434
43515 86 73 20 71
436 7 33 47 36 96
43731 55 87 22 14
43813 35 8 77 89
439 3 37 98 52 34
440
44192 79 95 74 85
44219 3 5 73 67
44393 41 81 78 77
44448 88 57 82 15
44536 38 42 4 69
446
44787 36 38 65 91
44818 47 41 66 35
449 0 63 59 54 10
45044 1 37 81 48
45175 96 42 4 25
452
45314 19 63 8 36
45435 38 84 66 42
45599 7 70 74 6
456 4 12 86 65 22
45746 40 60 31 80
458
45938 29 26 65 85
46021 6 15 77 14
46161 25 86 12 35
46271 67 74 59 42
46346 52 30 19 93
464
46510 61 18 67 26
46615 27 20 62 38
46758 24 28 45 90
46898 39 59 3 92
46964 35 60 68 19
470
47134 44 11 25 56
472 2 63 5 94 76
47372 92 0 27 84
47460 8 80 48 90
47523 7 75 70 47
476
47778 18 19 34 39
47831 66 95 9 36
47964 99 57 94 75
48029 97 51 45 47
48193 79 23 84 24
482
48372 23 78 90 21
48441 67 31 4 57
48534 58 50 46 74
48655 37 81 63 45
48785 8 48 28 12
488
48918 30 28 50 81
49067 47 41 45 59
49151 14 92 6 68
492 8 46 69 84 13
49393 25 58 26 75
494
49576 16 78 36 18
496 3 7 28 73 41
49734 97 42 23 8
498 9 67 49 83 64
49981 5 29 85 79
500
501 3 35 80 53 5
50291 96 77 52 69
50344 32 4 60 26
50441 13 28 39 64
50573 27 34 71 92
506
50772 4 77 80 29
50832 36 70 47 79
50996 56 69 2 90
51013 20 24 81 67
51123 25 83 89 91
512
51332 46 88 81 75
514 5 98 15 72 31
51556 89 90 21 16
51637 2 82 93 18
51763 52 49 19 41
518
51952 51 76 91 33
52029 37 32 43 42
52127 34 21 72 87
52262 64 8 73 41
52323 46 67 96 85
524
52582 19 5 88 54
52671 27 92 48 16
52725 96 40 56 37
52841 11 26 58 95
52963 17 1 0 24
530
53146 36 85 78 32
53255 50 94 9 57
533 0 20 24 68 28
53452 22 3 84 17
53516 2 1 66 69
536
53714 87 83 79 36
538 9 64 77 49 24
53925 92 5 62 91
54073 33 74 6 65
54139 2 59 71 50
542
54399 0 48 98 45
54450 27 92 8 73
54591 80 54 42 57
54618 78 55 19 36
54776 28 53 6 7
548
54929 68 27 95 47
55040 32 79 60 2
55144 53 57 6 25
55241 56 66 30 77
55326 13 83 23 51
554
555 7 76 59 44 22
55681 15 48 8 47
55777 79 32 61 39
55865 29 95 35 45
559 1 6 13 9 3
560
561 3 52 93 20 70
56249 80 40 66 53
563 2 71 41 1 13
56444 24 15 83 0
56514 17 7 56 63
566
56777 12 99 19 21
56862 63 98 56 66
56928 4 22 68 55
57049 65 96 84 57
57141 74 46 60 53
572
57364 7 16 8 38
57455 68 21 43 99
57592 0 79 35 96
57675 28 51 87 53
57757 73 84 18 3
578
57995 90 17 40 51
58046 12 23 91 38
58180 10 68 9 93
58265 69 49 27 66
58394 4 39 97 31
584
585 4 64 39 3 33
58626 88 10 96 54
58721 48 7 78 50
58822 90 16 15 72
58992 2 71 70 68
590
59142 26 72 54 41
59297 94 80 47 63
59319 24 90 78 6
59448 34 50 98 89
59533 81 66 38 10
596
59765 24 23 1 19
59854 35 76 71 49
59910 75 99 91 97
60021 78 17 18 81
601 3 48 72 7 96 \ No newline at end of file