diff --git a/3.py b/3.py index 10eb917..cf4dea7 100644 --- a/3.py +++ b/3.py @@ -1,6 +1,7 @@ +from __future__ import annotations import sys -bitstrings = [] +bitstrings: list[str] = [] for x in sys.stdin: bitstrings.append(x.rstrip()) diff --git a/4.py b/4.py new file mode 100644 index 0000000..418d778 --- /dev/null +++ b/4.py @@ -0,0 +1,62 @@ +import numpy as np + + +def has_bingo(board: np.ndarray) -> bool: + for row in board: + if np.all(row == -1): + return True + + for col in board.T: + if np.all(col == -1): + return True + + return False + + +def part_one(boards, number): + for number in numbers: + boards[boards == number] = -1 + + for board in boards: + if has_bingo(board): + return board[board != -1].sum() * number + + +def part_two(boards: np.ndarray, number): + for number in numbers: + boards[boards == number] = -1 + + done_boards = [] + + for b, board in enumerate(boards): + if has_bingo(board): + done_boards.append(b) + + if len(boards) == 1 and len(done_boards) == 1: + board = boards[0] + return board[board != -1].sum() * number + + boards = np.delete(boards, done_boards, 0) + + +if __name__ == "__main__": + numbers = [int(x) for x in input().split(",")] + + input() # Skip blank line + + boards = [] + + try: + while True: + current_board = [] + while (line := input().strip()) != "": + current_board.append([int(x) for x in line.split()]) + boards.append(current_board) + except EOFError: + boards.append(current_board) + + boards = np.array(boards) + + print("Winning board:", part_one(boards.copy(), numbers)) + + print("Losing board :", part_two(boards.copy(), numbers)) diff --git a/ex4.in b/ex4.in new file mode 100644 index 0000000..669a51d --- /dev/null +++ b/ex4.in @@ -0,0 +1,19 @@ +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 + +22 13 17 11 0 + 8 2 23 4 24 +21 9 14 16 7 + 6 10 3 18 5 + 1 12 20 15 19 + + 3 15 0 2 22 + 9 18 13 17 5 +19 8 7 25 23 +20 11 10 24 4 +14 21 16 12 6 + +14 21 17 24 4 +10 16 15 9 19 +18 8 23 26 20 +22 11 13 6 5 + 2 0 12 3 7 diff --git a/input4.in b/input4.in new file mode 100644 index 0000000..59ebdb2 --- /dev/null +++ b/input4.in @@ -0,0 +1,601 @@ +92,12,94,64,14,4,99,71,47,59,37,73,29,7,16,32,40,53,30,76,74,39,70,88,55,45,17,0,24,65,35,20,63,68,89,84,33,66,18,50,38,10,83,75,67,42,3,56,82,34,90,46,87,52,49,2,21,62,93,86,25,78,19,57,77,26,81,15,23,31,54,48,98,11,91,85,60,72,8,69,6,22,97,96,80,95,58,36,44,1,51,43,9,61,41,79,5,27,28,13 + +60 79 46 9 58 +97 81 6 94 84 +38 40 17 61 29 +11 28 0 91 15 +24 77 34 59 36 + +52 75 98 41 92 +73 5 29 45 62 +17 57 0 37 93 +59 36 35 84 18 + 7 66 72 55 9 + +51 83 36 4 46 +99 3 34 2 1 +37 5 35 32 24 +98 82 75 0 22 +12 91 45 39 69 + +98 52 56 74 8 + 7 29 20 85 58 +51 95 32 77 72 +54 81 37 1 71 + 2 5 66 83 42 + + 3 60 86 77 21 +70 53 4 57 88 +95 50 41 34 67 + 7 13 45 80 33 +42 0 22 63 71 + +56 35 68 58 84 +62 74 81 79 64 +10 12 73 51 76 +36 41 37 17 70 +18 50 87 69 95 + +68 98 72 45 33 +21 58 93 55 5 +59 51 88 81 0 + 1 14 69 66 34 +64 42 11 39 83 + +80 8 12 47 54 +74 71 30 5 78 +86 11 58 35 7 +63 44 10 51 85 +69 91 56 40 89 + +76 70 95 67 23 +98 65 3 53 80 +14 22 71 4 60 +26 87 94 89 13 +82 7 32 86 12 + +59 52 58 93 88 +28 45 84 64 34 +13 23 19 60 80 +11 38 54 27 76 +68 74 1 36 55 + +46 89 75 79 19 +67 45 34 47 90 +72 60 68 42 8 + 0 88 12 29 40 + 9 99 66 43 94 + +74 39 77 10 11 +14 94 13 27 61 +21 31 87 16 52 +95 33 71 98 5 + 0 38 12 96 54 + +77 15 50 52 79 +98 71 48 68 93 +41 97 39 58 99 +40 3 91 96 7 +82 89 33 65 1 + +51 38 12 83 74 +37 52 29 2 35 +99 54 3 20 44 +23 66 59 72 50 +88 6 79 24 67 + +69 90 33 28 22 +98 62 52 50 12 + 8 77 61 54 59 +11 18 49 42 17 +20 85 48 82 27 + +31 77 92 20 14 +52 83 50 6 97 +70 76 53 67 79 + 1 98 96 65 34 +19 66 13 56 89 + +59 22 70 86 99 +39 14 89 75 42 +12 87 55 67 28 +71 26 11 31 65 +73 74 58 46 94 + + 8 62 56 29 42 +83 35 53 78 26 +73 60 49 98 18 +84 19 16 10 25 +80 48 0 74 63 + +32 5 55 44 71 + 2 29 67 93 64 +18 58 7 4 13 +28 51 91 79 53 +77 80 20 19 30 + +63 95 73 55 68 +88 37 62 85 61 +13 18 99 17 94 + 9 49 32 76 83 + 7 84 45 59 5 + +35 37 38 28 91 +58 12 89 10 49 +60 2 36 18 15 +69 26 99 63 97 +90 20 95 61 51 + +94 54 69 46 36 +27 41 19 95 39 +89 18 76 12 35 +80 10 56 62 30 +90 91 28 64 81 + +18 59 38 71 82 + 7 15 24 89 25 +95 70 87 34 63 +83 33 64 50 69 +57 32 56 93 1 + + 2 35 87 96 11 +40 62 39 22 74 +19 8 58 33 6 +26 79 37 0 82 +30 88 5 47 72 + +23 72 44 17 80 +71 94 6 9 68 +81 53 87 46 40 +88 15 97 98 63 +45 0 43 21 28 + + 8 33 6 38 12 +32 75 19 13 27 + 5 58 51 61 42 +81 72 3 91 55 +37 97 79 87 30 + +46 55 24 32 63 +14 60 81 28 58 +10 91 13 69 57 +92 94 38 83 86 +84 82 11 35 16 + +33 86 85 61 66 +51 46 7 12 19 +92 32 69 5 26 +64 99 79 63 37 + 4 52 54 38 16 + +34 48 19 54 46 +31 82 11 91 77 +98 38 30 69 26 +71 84 63 24 83 +60 53 50 20 57 + +31 54 46 50 65 +21 61 89 32 94 +28 7 72 23 18 +42 83 60 59 98 + 3 82 30 75 14 + +39 96 58 25 86 +89 43 16 59 34 +19 33 82 93 74 +66 90 98 53 94 +36 81 84 99 17 + + 8 80 2 82 46 +62 28 99 29 70 +78 6 13 53 72 +26 47 39 95 86 +76 91 19 41 84 + +36 8 4 50 25 +56 83 72 28 95 +43 74 46 70 5 +55 62 81 11 35 +40 44 82 69 71 + +54 26 15 74 0 + 7 71 63 61 86 +18 79 65 57 14 + 9 82 81 47 78 +24 12 20 10 76 + +54 37 6 41 31 +15 24 73 48 23 +84 53 94 28 26 +95 4 2 32 63 +99 74 20 64 57 + +18 82 17 12 50 +49 32 63 67 40 + 1 31 61 26 24 +15 91 11 22 95 +44 87 19 43 48 + +18 75 5 59 74 +81 11 23 55 22 +20 3 32 30 40 +41 67 78 45 90 +92 72 71 48 28 + +11 83 57 66 68 +81 94 44 19 16 +62 77 46 64 13 +85 50 20 22 61 +12 76 86 17 97 + +52 71 57 82 38 +11 67 25 43 18 +42 34 19 1 50 +22 53 0 62 69 +27 77 88 33 65 + +87 31 73 71 3 + 4 39 64 13 93 +91 82 75 43 35 +72 89 24 11 36 +32 79 80 17 98 + +56 50 78 98 37 + 8 14 30 74 42 +10 95 21 44 48 +12 54 85 29 60 +65 1 3 89 25 + +85 93 31 59 44 +90 5 20 4 28 + 6 63 83 10 27 +40 84 48 78 68 +72 82 71 61 52 + +72 84 48 77 86 +78 69 47 82 73 +45 70 0 11 49 +26 95 88 7 8 +62 12 96 15 44 + +86 92 29 0 49 +17 61 1 28 75 +46 13 42 14 23 +65 82 44 52 9 +41 19 37 63 83 + +27 70 79 26 36 +78 23 73 84 85 +75 32 41 14 87 +68 99 34 93 61 +62 86 49 9 77 + +88 50 27 48 23 +96 90 30 58 55 +29 17 3 22 49 +99 32 8 37 42 +13 81 87 2 53 + +15 51 10 87 88 +30 19 33 46 3 +67 13 44 7 91 +40 83 98 86 50 +95 80 4 35 11 + +79 26 92 61 24 +73 96 86 19 88 +54 98 46 14 48 +78 30 39 9 66 +56 40 11 41 1 + +37 0 63 71 57 +21 6 14 52 20 +16 36 83 76 92 +32 25 79 2 84 +27 89 34 99 3 + +74 31 87 53 20 +32 68 12 54 73 +97 70 57 83 7 +96 88 11 84 29 +23 8 9 48 65 + +95 0 91 41 39 + 1 31 52 40 98 +32 59 45 84 61 +56 64 22 78 24 +51 94 50 74 35 + +31 39 36 5 92 +72 66 28 8 63 + 7 20 85 55 79 +89 90 81 94 12 +59 44 40 65 46 + +80 2 7 61 34 +31 69 15 68 77 +85 17 8 26 38 +55 29 1 42 86 +28 78 66 59 23 + +77 56 1 73 7 +91 55 95 0 38 +90 19 40 74 52 +23 59 53 34 80 +72 50 54 96 5 + +88 44 64 57 9 +68 97 81 2 75 +37 27 25 96 42 +72 89 24 30 45 +93 69 86 76 19 + +78 46 55 84 77 +24 52 8 97 9 + 5 73 4 3 71 + 0 76 70 21 15 +33 87 38 98 63 + +68 4 32 82 34 +95 43 70 74 77 +23 89 94 61 22 +88 51 39 90 75 +56 9 65 29 79 + +23 11 51 45 1 +40 63 21 43 37 +64 28 84 22 9 +86 39 77 48 61 +10 13 15 60 79 + +72 34 84 54 65 +53 58 22 38 46 +42 33 60 85 9 +97 59 28 40 10 +12 6 19 92 4 + +39 43 23 79 29 +33 1 24 88 8 +61 90 73 92 97 +95 86 77 99 27 +25 41 69 70 64 + +92 57 85 51 75 +43 38 83 47 94 +52 5 98 1 25 +35 46 15 34 64 +71 31 53 65 7 + +89 74 98 37 64 +51 85 33 38 96 +54 41 11 52 86 + 2 99 25 17 26 +35 57 95 79 6 + +67 2 10 69 32 +16 27 76 92 90 +49 79 14 61 84 +43 8 75 56 31 +21 77 36 86 13 + +35 60 79 33 43 +72 3 20 74 57 +98 76 38 17 51 +14 4 12 10 90 + 6 55 5 93 36 + +48 99 10 61 98 +62 24 3 21 30 + 0 11 32 9 29 +41 38 16 88 74 +22 1 7 5 40 + +70 41 95 11 57 +40 16 0 21 80 +30 9 34 92 98 +72 60 64 85 61 +31 33 93 58 90 + +81 18 72 37 52 +62 0 46 57 64 + 6 34 33 20 22 +86 87 83 31 75 +50 84 8 5 73 + +50 86 31 25 27 +20 5 54 95 53 +89 68 41 70 32 +93 84 11 74 22 +44 83 8 60 36 + +70 99 54 57 80 +87 75 38 37 46 +31 56 61 44 82 +63 74 27 19 78 +69 6 36 62 83 + +94 9 73 97 6 +55 90 60 11 89 +18 65 68 45 35 +88 14 10 58 93 +77 75 96 69 25 + +46 25 9 57 38 +74 86 69 62 63 +65 44 47 77 17 + 6 72 66 78 3 +27 84 85 94 30 + +52 32 41 55 76 +93 22 69 36 26 +31 49 72 33 46 +10 4 11 34 37 +75 23 29 85 57 + +15 38 98 76 95 + 4 48 39 35 58 +19 44 55 17 94 +37 16 61 28 49 +33 79 67 54 96 + +64 6 81 22 83 +28 3 89 49 1 +41 25 8 18 17 +14 26 76 48 75 +56 24 60 68 67 + +18 84 1 37 97 +92 38 79 23 45 +39 59 17 62 77 +13 36 5 90 71 +51 21 94 34 70 + +24 76 65 37 64 +75 0 79 53 6 +32 46 55 27 81 +23 45 86 96 15 +99 5 95 59 82 + + 8 36 61 47 91 +75 57 92 21 60 +63 2 83 99 32 +16 82 26 43 68 +48 52 20 90 64 + +20 64 15 9 98 +54 18 19 28 46 +87 36 84 99 80 + 5 66 68 60 7 +56 94 52 74 77 + +96 54 11 8 70 +14 97 23 30 9 +75 83 35 32 41 +64 85 37 2 66 +56 89 71 44 25 + +44 67 40 37 82 +87 54 6 65 92 +59 50 17 90 85 +73 41 16 69 98 +24 21 94 80 13 + +94 67 5 91 47 +59 23 0 10 54 +41 16 92 74 86 +87 60 56 34 82 +75 15 40 33 28 + + 1 6 53 31 42 +46 57 40 75 92 +10 39 27 48 5 +91 72 68 41 90 +13 70 44 58 93 + +96 15 55 98 85 +45 68 24 57 31 +12 94 35 84 41 +80 10 66 38 25 +48 8 26 40 69 + +11 64 5 4 68 +44 97 52 96 87 + 6 22 27 47 94 +78 79 84 54 24 +89 16 77 37 20 + +80 73 21 62 64 +30 86 15 26 91 +45 69 37 17 84 +78 41 47 67 33 +82 6 79 20 83 + +85 43 18 19 76 + 1 88 80 89 27 +11 67 63 20 68 +56 23 10 95 6 +32 70 64 0 15 + + 1 2 64 84 52 +85 36 22 72 68 +91 19 24 25 17 + 0 30 74 77 76 +60 75 57 45 95 + +61 39 37 58 45 +40 75 10 71 32 +74 57 4 30 19 + 6 70 49 11 56 +64 36 60 66 63 + +67 7 36 94 34 +92 86 74 59 62 +72 43 40 28 21 +52 63 96 93 2 + 8 82 50 53 42 + +16 64 31 0 23 + 3 65 59 46 54 +52 78 20 29 50 +91 21 93 34 7 + 8 28 30 86 37 + +27 76 75 60 99 +63 26 4 59 31 +10 5 98 39 78 +24 43 48 6 45 + 0 18 82 22 35 + +21 48 58 4 31 +50 6 98 43 41 +88 80 24 35 40 +14 45 61 10 81 +97 27 46 8 20 + +36 17 86 84 56 +82 55 99 35 75 +64 94 92 53 31 +42 19 29 1 23 +76 21 11 28 66 + +90 92 40 41 68 +37 89 5 60 16 +48 25 59 45 29 +15 75 11 30 72 + 6 61 74 23 85 + +37 47 13 68 40 +38 92 78 83 27 +82 81 85 35 31 +25 80 2 77 67 +55 7 72 26 22 + +30 13 80 26 86 + 4 69 62 72 87 +97 21 99 10 24 +61 53 42 93 32 +67 64 15 16 27 + +95 13 68 86 39 + 2 14 81 60 93 +45 69 20 23 59 +46 35 36 89 3 + 5 42 29 71 49 + +99 49 50 92 56 +48 59 76 82 20 +11 53 51 86 10 + 8 91 21 52 94 +12 39 31 40 22 + +50 17 6 12 19 +45 47 22 73 36 +16 78 98 89 72 +90 96 56 68 54 +28 29 51 85 25 + +91 72 10 32 20 +23 18 44 78 61 +46 36 77 60 75 +47 49 16 89 8 + 2 95 48 38 85