aboutsummaryrefslogtreecommitdiff
path: root/2021
diff options
context:
space:
mode:
Diffstat (limited to '2021')
-rw-r--r--2021/04/.gitignore1
-rw-r--r--2021/04/Makefile8
-rw-r--r--2021/04/input601
-rw-r--r--2021/04/puzzles.py51
4 files changed, 661 insertions, 0 deletions
diff --git a/2021/04/.gitignore b/2021/04/.gitignore
new file mode 100644
index 0000000..ffc46fe
--- /dev/null
+++ b/2021/04/.gitignore
@@ -0,0 +1 @@
+puzzle-[12].py
diff --git a/2021/04/Makefile b/2021/04/Makefile
new file mode 100644
index 0000000..247194a
--- /dev/null
+++ b/2021/04/Makefile
@@ -0,0 +1,8 @@
+all:
+ sed '/START PART 2/,/END PART 2/d' puzzles.py >puzzle-1.py
+ sed '/START PART 1/,/END PART 1/d' puzzles.py >puzzle-2.py
+ chmod +x puzzle-[12].py
+
+.PHONY: clean
+clean:
+ rm -f puzzle-[12].py
diff --git a/2021/04/input b/2021/04/input
new file mode 100644
index 0000000..ee55530
--- /dev/null
+++ b/2021/04/input
@@ -0,0 +1,601 @@
+27,14,70,7,85,66,65,57,68,23,33,78,4,84,25,18,43,71,76,61,34,82,93,74,26,15,83,64,2,35,19,97,32,47,6,51,99,20,77,75,56,73,80,86,55,36,13,95,52,63,79,72,9,10,16,8,69,11,50,54,81,22,45,1,12,88,44,17,62,0,96,94,31,90,39,92,37,40,5,98,24,38,46,21,30,49,41,87,91,60,48,29,59,89,3,42,58,53,67,28
+
+31 23 52 26 8
+27 89 37 80 46
+97 19 63 34 79
+13 59 45 12 73
+42 25 22 6 39
+
+27 71 24 3 0
+79 42 32 72 62
+99 52 11 92 33
+38 22 16 44 39
+35 26 76 49 58
+
+39 19 82 53 57
+52 98 69 77 23
+ 1 40 18 66 83
+34 85 28 48 16
+15 93 38 96 27
+
+74 50 88 84 99
+34 2 11 25 17
+57 4 19 83 1
+59 77 42 36 33
+73 22 23 37 55
+
+98 91 56 84 78
+45 21 24 83 40
+46 58 8 67 4
+33 97 55 7 86
+ 2 68 64 27 69
+
+68 29 14 49 26
+ 4 21 87 71 32
+58 5 17 46 93
+45 96 8 83 2
+78 91 9 20 42
+
+49 81 19 48 37
+38 23 45 82 92
+93 99 67 66 42
+40 74 25 56 16
+21 47 26 75 61
+
+53 66 72 30 34
+55 82 77 6 92
+60 56 8 22 88
+ 5 71 49 29 74
+28 2 32 84 73
+
+52 31 24 68 41
+48 82 19 29 65
+51 91 97 39 80
+ 3 55 43 40 38
+20 89 53 45 75
+
+29 74 19 89 18
+32 88 93 46 63
+91 4 94 64 5
+57 54 49 36 40
+97 81 39 77 1
+
+ 7 57 94 84 39
+92 3 28 15 75
+88 45 65 81 63
+86 4 89 37 71
+ 8 13 66 42 85
+
+60 66 35 47 98
+96 27 40 51 39
+ 3 64 25 28 74
+58 17 97 59 29
+95 31 18 44 37
+
+ 3 31 97 85 71
+79 82 22 61 98
+87 14 17 66 75
+36 89 88 83 63
+44 8 81 25 48
+
+73 84 28 90 94
+25 19 44 10 23
+ 8 59 17 9 93
+20 77 97 64 6
+98 82 27 70 91
+
+18 51 16 99 2
+58 22 89 13 19
+39 66 91 8 32
+49 24 85 94 42
+45 70 10 86 4
+
+23 81 66 13 34
+25 80 97 5 42
+79 35 2 78 9
+ 0 6 91 94 45
+21 90 76 50 56
+
+50 92 2 96 75
+85 82 80 97 31
+61 35 55 27 56
+74 42 9 29 90
+86 15 88 47 1
+
+18 20 54 92 62
+45 22 32 61 75
+ 1 38 50 81 42
+82 4 21 77 65
+27 51 56 39 48
+
+36 10 62 28 70
+94 99 34 54 6
+15 1 41 13 12
+92 52 2 63 82
+90 64 29 69 32
+
+23 77 33 90 17
+45 78 5 67 28
+57 73 89 81 21
+49 64 37 15 14
+ 7 59 4 43 16
+
+81 92 25 28 90
+93 72 43 94 26
+24 9 13 74 10
+21 2 36 32 51
+87 97 55 86 71
+
+82 71 99 17 90
+69 95 65 55 10
+ 9 92 39 62 78
+59 13 61 24 44
+ 8 31 58 0 57
+
+17 83 55 99 27
+79 4 33 76 7
+81 43 44 49 72
+ 2 48 97 20 77
+47 60 35 16 63
+
+93 95 94 1 98
+61 57 84 55 22
+85 40 65 46 59
+21 15 63 77 7
+13 99 49 3 96
+
+ 8 21 14 45 41
+65 63 82 62 28
+91 44 22 79 96
+20 75 86 3 26
+74 11 42 59 36
+
+ 5 52 43 92 99
+46 63 10 45 81
+13 66 21 32 89
+25 28 96 40 88
+27 18 31 73 34
+
+ 3 26 43 32 36
+68 87 67 65 99
+73 61 20 90 7
+21 52 2 82 10
+58 49 56 16 80
+
+97 25 93 63 32
+87 14 5 22 76
+89 92 91 3 51
+ 0 24 95 69 20
+96 11 10 1 55
+
+95 86 44 75 70
+59 76 45 2 99
+ 1 34 71 81 41
+87 14 33 84 96
+ 8 38 9 82 68
+
+27 71 70 75 76
+25 87 2 79 96
+20 88 50 37 32
+48 94 63 86 22
+15 6 34 78 59
+
+30 89 51 31 77
+74 10 86 71 84
+29 54 58 44 5
+11 90 26 50 63
+64 62 20 40 46
+
+37 9 46 23 31
+68 21 25 36 90
+17 33 6 50 30
+11 89 20 47 60
+26 59 34 62 77
+
+84 52 40 97 7
+88 30 42 58 94
+64 10 2 90 83
+44 35 77 91 47
+14 74 9 78 53
+
+86 14 0 39 24
+87 69 58 8 73
+88 74 27 40 51
+63 54 55 93 61
+16 66 15 21 48
+
+43 70 9 81 42
+36 54 99 34 95
+98 19 90 25 44
+69 56 18 77 49
+58 16 67 75 57
+
+36 44 14 98 23
+31 5 83 46 3
+45 21 41 11 60
+33 81 88 92 65
+13 51 48 59 71
+
+12 5 70 87 32
+42 18 90 73 88
+68 29 76 38 55
+67 62 15 77 34
+39 27 51 54 19
+
+87 8 92 93 88
+77 54 15 1 43
+35 97 26 21 29
+13 46 96 69 47
+51 38 91 32 63
+
+73 99 30 15 16
+42 58 21 88 44
+45 13 27 68 9
+36 6 81 53 5
+78 76 11 60 1
+
+57 76 50 78 31
+45 42 68 53 16
+ 9 88 89 19 21
+96 61 97 69 34
+98 87 33 82 0
+
+ 4 16 89 57 64
+46 75 77 65 23
+71 42 96 52 38
+ 1 21 93 0 35
+59 80 53 36 58
+
+97 62 35 1 88
+98 60 17 45 94
+12 43 65 23 19
+71 52 3 40 59
+50 76 61 20 22
+
+92 65 38 93 13
+55 26 10 46 29
+85 23 19 74 34
+60 14 27 36 18
+53 4 52 49 17
+
+99 56 93 70 28
+25 0 77 80 57
+91 50 72 76 23
+53 58 95 78 59
+75 85 90 44 9
+
+30 8 5 60 6
+28 35 59 70 96
+20 99 98 81 79
+94 78 27 71 4
+ 7 34 43 46 51
+
+93 65 22 69 33
+92 49 75 35 11
+58 39 62 86 83
+64 4 76 48 82
+74 1 56 95 31
+
+ 1 78 98 90 55
+80 14 36 99 7
+85 8 10 9 92
+76 11 40 70 62
+43 53 74 35 58
+
+46 78 35 28 49
+84 73 65 25 34
+40 59 66 36 67
+16 22 29 0 45
+20 56 39 88 91
+
+32 58 35 25 79
+78 94 57 38 14
+89 87 68 48 76
+ 7 67 40 51 33
+95 31 43 93 92
+
+38 21 82 31 23
+54 16 77 37 42
+73 99 7 34 90
+71 26 5 91 52
+22 27 47 85 62
+
+ 2 86 28 37 55
+ 1 82 9 36 31
+52 98 89 30 60
+13 17 63 38 57
+73 50 42 20 12
+
+56 3 67 62 35
+59 39 19 22 27
+21 58 57 41 54
+75 13 82 50 32
+23 5 99 66 10
+
+ 7 19 45 66 78
+38 57 40 73 87
+58 30 99 53 83
+64 1 8 56 95
+70 77 16 18 82
+
+72 83 95 37 35
+54 59 92 21 79
+ 7 81 86 29 41
+52 99 42 57 71
+ 3 15 75 34 77
+
+ 7 70 5 69 4
+34 60 40 73 6
+74 54 67 32 38
+93 62 17 51 86
+57 88 99 3 16
+
+42 74 11 34 7
+82 47 71 31 58
+69 23 43 4 64
+32 19 98 93 41
+63 97 8 85 48
+
+63 54 34 38 86
+ 4 27 15 49 0
+61 77 53 98 74
+62 23 88 97 37
+93 28 25 50 13
+
+56 82 41 27 79
+23 31 64 7 65
+52 98 93 16 57
+88 49 10 11 62
+43 95 53 51 83
+
+41 10 87 54 86
+19 22 13 40 17
+37 27 45 29 63
+83 85 81 90 7
+57 88 47 66 56
+
+67 44 54 88 89
+20 46 61 28 92
+86 49 60 83 95
+42 78 97 51 96
+11 62 4 26 31
+
+18 68 87 26 70
+62 84 11 33 90
+ 0 45 66 83 6
+20 19 27 44 55
+52 8 5 7 3
+
+54 94 88 76 92
+13 98 22 33 26
+95 62 53 81 24
+29 69 15 87 25
+61 40 84 90 93
+
+ 7 31 3 28 46
+20 51 21 18 38
+30 92 39 70 61
+27 88 35 96 74
+23 5 66 11 42
+
+40 61 90 57 54
+41 14 99 62 59
+92 10 48 81 52
+22 29 77 18 87
+31 79 25 94 13
+
+17 26 44 98 57
+74 83 51 14 11
+76 91 96 64 33
+43 45 92 72 27
+66 3 28 20 40
+
+88 82 44 71 55
+83 47 51 76 24
+86 19 42 34 99
+30 31 87 48 62
+98 53 68 9 21
+
+ 3 31 6 41 61
+24 77 81 96 44
+78 73 1 98 11
+40 80 27 65 92
+62 67 2 30 10
+
+78 46 50 65 56
+84 16 32 58 86
+22 12 54 99 35
+ 9 43 55 10 94
+66 81 59 92 76
+
+78 3 55 23 83
+13 42 94 91 22
+14 37 31 67 71
+ 8 61 57 34 43
+74 50 0 39 65
+
+78 16 13 91 34
+14 74 86 3 97
+12 89 58 65 51
+29 57 48 44 93
+95 1 42 39 92
+
+93 96 16 85 25
+59 3 70 19 17
+21 84 58 38 86
+57 10 35 95 79
+81 44 73 63 9
+
+22 1 96 7 93
+40 49 2 4 66
+87 21 17 32 48
+44 28 42 99 26
+69 8 85 86 75
+
+21 31 37 87 28
+89 43 74 83 57
+95 29 92 88 35
+94 25 97 81 50
+15 19 73 45 63
+
+92 62 67 95 57
+30 8 4 39 64
+99 31 70 63 96
+25 53 24 93 35
+34 51 82 91 28
+
+41 30 20 56 46
+16 32 98 60 35
+67 9 43 42 88
+78 90 71 5 29
+49 31 37 63 18
+
+80 40 88 5 62
+ 3 6 74 71 97
+19 58 63 59 38
+50 64 34 68 45
+25 30 21 33 83
+
+10 65 67 17 50
+21 51 18 68 59
+29 78 77 99 76
+62 35 96 7 95
+82 53 42 49 69
+
+74 65 89 6 1
+18 30 72 75 24
+60 50 52 55 82
+68 99 4 61 22
+ 9 37 84 57 87
+
+96 85 56 72 2
+ 9 38 98 12 4
+34 45 74 97 86
+18 94 64 70 68
+91 41 58 39 66
+
+34 13 26 80 29
+ 0 4 21 60 90
+39 73 12 2 19
+64 44 61 88 45
+59 50 8 91 49
+
+34 85 55 2 75
+10 15 89 12 63
+90 29 87 73 71
+38 17 84 45 9
+97 98 77 23 61
+
+47 43 22 58 1
+63 44 2 94 99
+33 81 51 49 13
+38 86 42 91 23
+ 7 67 68 39 84
+
+ 4 26 12 38 41
+43 16 88 71 99
+50 24 19 77 98
+23 73 44 10 51
+56 42 30 52 59
+
+57 16 9 62 27
+26 65 56 10 82
+ 0 74 78 12 99
+77 18 38 5 37
+ 7 60 40 90 23
+
+14 69 18 51 8
+21 79 60 36 12
+68 44 59 45 16
+90 50 85 25 70
+91 31 30 54 26
+
+24 40 51 72 63
+31 60 62 25 96
+ 9 44 35 28 91
+97 4 34 81 2
+61 68 94 52 86
+
+ 0 57 95 88 94
+36 38 25 35 19
+13 6 8 61 98
+45 85 86 69 97
+41 32 7 15 59
+
+41 82 19 29 34
+44 96 6 91 76
+69 21 32 94 98
+ 4 10 88 30 2
+ 8 74 56 65 99
+
+36 91 73 15 54
+62 55 40 27 44
+11 60 95 61 46
+31 32 21 41 35
+74 86 83 89 79
+
+ 2 96 94 82 68
+39 83 49 30 15
+62 11 86 99 59
+51 80 12 72 58
+87 66 98 53 29
+
+44 71 18 63 85
+11 75 60 66 13
+36 9 94 57 8
+10 12 32 3 86
+ 4 29 54 70 21
+
+27 33 76 83 67
+77 29 65 39 44
+52 34 25 93 64
+35 4 57 92 84
+41 51 88 96 0
+
+21 91 82 3 26
+23 8 36 20 73
+54 39 60 34 57
+49 99 97 69 43
+41 93 95 80 63
+
+73 77 4 9 22
+17 33 15 86 79
+38 16 99 98 30
+64 92 76 50 68
+83 85 52 87 88
+
+57 53 13 36 76
+ 7 10 91 3 22
+ 8 84 56 73 59
+62 80 85 38 33
+68 97 47 14 96
+
+36 8 98 43 70
+85 95 31 1 51
+33 41 78 89 56
+76 16 15 34 82
+12 18 39 4 3
+
+98 49 41 30 95
+68 89 81 48 84
+15 19 90 66 14
+32 1 88 34 64
+73 65 6 20 86
+
+22 18 13 74 34
+75 4 60 88 46
+25 97 54 94 91
+42 67 40 11 81
+ 5 12 49 48 15
+
+82 91 18 73 57
+97 50 34 16 66
+29 43 81 20 15
+19 44 85 4 32
+90 58 39 53 42
+
+50 53 83 10 0
+93 16 84 23 13
+89 63 75 69 51
+65 35 67 56 70
+ 4 37 29 47 38
diff --git a/2021/04/puzzles.py b/2021/04/puzzles.py
new file mode 100644
index 0000000..581aef5
--- /dev/null
+++ b/2021/04/puzzles.py
@@ -0,0 +1,51 @@
+#!/usr/bin/env python3
+
+board = list[list[int]]
+last: board = [[]] * 5
+
+
+def bingo(board: board) -> bool:
+ global last
+
+ if any(
+ board[0][i] == board[1][i]
+ and board[1][i] == board[2][i]
+ and board[2][i] == board[3][i]
+ and board[3][i] == board[4][i]
+ or len(set(board[i])) == 1
+ for i in range(5)
+ ):
+ last = board
+ return True
+
+ return False
+
+
+def main() -> None:
+ boards: list[board] = []
+ with open("input", "r", encoding="utf-8") as f:
+ lines = f.readlines()
+ for i, line in enumerate(lines):
+ if i == 0:
+ draws = list(map(int, line.strip().split(",")))
+ elif line == "\n":
+ boards.append([list(map(int, lines[i + j].strip().split())) for j in range(1, 6)])
+
+ # START PART 1
+ while not any(bingo(b) for b in boards):
+ # END PART 1 START PART 2
+ while len(draws) > 0 and len(boards) > 0:
+ # END PART 2
+ num = draws.pop(0)
+ for i, board in enumerate(boards):
+ for j, row in enumerate(board):
+ boards[i][j] = [-1 if n == num else n for n in row]
+ # START PART 2
+ boards = list(filter(lambda b: not bingo(b), boards))
+ # END PART 2
+
+ print(num * sum(map(lambda x: sum(filter(lambda n: n != -1, x)), last)))
+
+
+if __name__ == "__main__":
+ main()