diff options
| -rw-r--r-- | day8/__init__.py | 75 | ||||
| -rw-r--r-- | day8/example.txt | 9 | ||||
| -rw-r--r-- | day8/input.txt | 624 |
3 files changed, 708 insertions, 0 deletions
diff --git a/day8/__init__.py b/day8/__init__.py new file mode 100644 index 0000000..c6d086a --- /dev/null +++ b/day8/__init__.py | |||
| @@ -0,0 +1,75 @@ | |||
| 1 | from copy import copy | ||
| 2 | from typing import Generator, Iterator, Any, List, Tuple | ||
| 3 | |||
| 4 | from aoc import BaseAssignment | ||
| 5 | |||
| 6 | |||
| 7 | class Assignment(BaseAssignment): | ||
| 8 | @staticmethod | ||
| 9 | def acc(line, accumulated_value, value): | ||
| 10 | return line + 1, accumulated_value + value | ||
| 11 | |||
| 12 | @staticmethod | ||
| 13 | def jmp(line, accumulated_value, value): | ||
| 14 | return line + value, accumulated_value | ||
| 15 | |||
| 16 | @staticmethod | ||
| 17 | def nop(line, accumulated_value, value): | ||
| 18 | return line + 1, accumulated_value | ||
| 19 | |||
| 20 | def read_input(self, example=False) -> List: | ||
| 21 | return list(super().read_input(example)) | ||
| 22 | |||
| 23 | def parse_item(self, item: str) -> Tuple: | ||
| 24 | instruction, value = item.split(' ') | ||
| 25 | |||
| 26 | return getattr(self, instruction), int(value) | ||
| 27 | |||
| 28 | def run(self, input: List) -> int: | ||
| 29 | executed_lines = set() | ||
| 30 | accumulated_value = 0 | ||
| 31 | line = 0 | ||
| 32 | |||
| 33 | while True: | ||
| 34 | if line in executed_lines: | ||
| 35 | raise Exception( | ||
| 36 | f'Loop detected at line: {line}. ' | ||
| 37 | f'Accumulated value: {accumulated_value}' | ||
| 38 | ) | ||
| 39 | |||
| 40 | try: | ||
| 41 | instruction, value = input[line] | ||
| 42 | except IndexError: | ||
| 43 | break | ||
| 44 | |||
| 45 | executed_lines.add(line) | ||
| 46 | line, accumulated_value = instruction( | ||
| 47 | line, accumulated_value, value | ||
| 48 | ) | ||
| 49 | |||
| 50 | return accumulated_value | ||
| 51 | |||
| 52 | |||
| 53 | class AssignmentOne(Assignment): | ||
| 54 | pass | ||
| 55 | |||
| 56 | |||
| 57 | class AssignmentTwo(Assignment): | ||
| 58 | def patch_instructions(self, input: List) -> Generator: | ||
| 59 | for index, (instruction, value) in enumerate(input): | ||
| 60 | if instruction is self.acc: | ||
| 61 | continue | ||
| 62 | |||
| 63 | patched_input = copy(input) | ||
| 64 | patched_input[index] = ( | ||
| 65 | self.nop if instruction is self.jmp else self.jmp, | ||
| 66 | value | ||
| 67 | ) | ||
| 68 | yield patched_input | ||
| 69 | |||
| 70 | def run(self, input: List) -> int: | ||
| 71 | for patched_input in self.patch_instructions(input): | ||
| 72 | try: | ||
| 73 | return super().run(patched_input) | ||
| 74 | except Exception: | ||
| 75 | continue | ||
diff --git a/day8/example.txt b/day8/example.txt new file mode 100644 index 0000000..6fee349 --- /dev/null +++ b/day8/example.txt | |||
| @@ -0,0 +1,9 @@ | |||
| 1 | nop +0 | ||
| 2 | acc +1 | ||
| 3 | jmp +4 | ||
| 4 | acc +3 | ||
| 5 | jmp -3 | ||
| 6 | acc -99 | ||
| 7 | acc +1 | ||
| 8 | jmp -4 | ||
| 9 | acc +6 \ No newline at end of file | ||
diff --git a/day8/input.txt b/day8/input.txt new file mode 100644 index 0000000..340826c --- /dev/null +++ b/day8/input.txt | |||
| @@ -0,0 +1,624 @@ | |||
| 1 | acc -7 | ||
| 2 | acc +6 | ||
| 3 | acc +4 | ||
| 4 | nop +191 | ||
| 5 | jmp +199 | ||
| 6 | acc +44 | ||
| 7 | acc -9 | ||
| 8 | jmp +505 | ||
| 9 | acc -12 | ||
| 10 | acc +45 | ||
| 11 | jmp +204 | ||
| 12 | jmp +129 | ||
| 13 | acc +17 | ||
| 14 | nop +287 | ||
| 15 | jmp +584 | ||
| 16 | acc +16 | ||
| 17 | jmp +363 | ||
| 18 | acc +4 | ||
| 19 | nop +142 | ||
| 20 | acc +34 | ||
| 21 | nop +345 | ||
| 22 | jmp +522 | ||
| 23 | jmp +53 | ||
| 24 | acc -10 | ||
| 25 | jmp +524 | ||
| 26 | jmp +492 | ||
| 27 | jmp +319 | ||
| 28 | acc -9 | ||
| 29 | jmp +550 | ||
| 30 | acc -19 | ||
| 31 | jmp +15 | ||
| 32 | acc +24 | ||
| 33 | jmp +30 | ||
| 34 | acc -19 | ||
| 35 | acc +12 | ||
| 36 | acc -2 | ||
| 37 | jmp +274 | ||
| 38 | nop +91 | ||
| 39 | acc +10 | ||
| 40 | acc +4 | ||
| 41 | jmp +501 | ||
| 42 | acc +49 | ||
| 43 | acc +29 | ||
| 44 | jmp +488 | ||
| 45 | jmp +504 | ||
| 46 | jmp +277 | ||
| 47 | acc +20 | ||
| 48 | acc +34 | ||
| 49 | jmp -40 | ||
| 50 | acc +10 | ||
| 51 | acc -4 | ||
| 52 | acc -19 | ||
| 53 | acc +38 | ||
| 54 | jmp +239 | ||
| 55 | acc -16 | ||
| 56 | acc -3 | ||
| 57 | nop +513 | ||
| 58 | jmp +526 | ||
| 59 | jmp +131 | ||
| 60 | nop +539 | ||
| 61 | acc -11 | ||
| 62 | jmp +470 | ||
| 63 | acc +30 | ||
| 64 | jmp +166 | ||
| 65 | acc +17 | ||
| 66 | acc -16 | ||
| 67 | nop +315 | ||
| 68 | jmp +364 | ||
| 69 | acc +15 | ||
| 70 | nop -61 | ||
| 71 | acc -12 | ||
| 72 | nop +147 | ||
| 73 | jmp -31 | ||
| 74 | acc -9 | ||
| 75 | jmp +324 | ||
| 76 | acc +0 | ||
| 77 | jmp +1 | ||
| 78 | jmp +321 | ||
| 79 | acc +0 | ||
| 80 | acc +6 | ||
| 81 | acc -17 | ||
| 82 | acc +13 | ||
| 83 | jmp +461 | ||
| 84 | jmp +184 | ||
| 85 | acc +22 | ||
| 86 | jmp +182 | ||
| 87 | jmp +504 | ||
| 88 | nop +131 | ||
| 89 | acc +12 | ||
| 90 | acc -6 | ||
| 91 | acc +29 | ||
| 92 | jmp +187 | ||
| 93 | acc +17 | ||
| 94 | jmp +67 | ||
| 95 | jmp -2 | ||
| 96 | acc +50 | ||
| 97 | acc +17 | ||
| 98 | jmp +442 | ||
| 99 | acc +8 | ||
| 100 | nop +146 | ||
| 101 | acc -12 | ||
| 102 | acc +32 | ||
| 103 | jmp +237 | ||
| 104 | jmp +1 | ||
| 105 | acc +34 | ||
| 106 | acc +1 | ||
| 107 | acc +18 | ||
| 108 | jmp +274 | ||
| 109 | acc +17 | ||
| 110 | acc -12 | ||
| 111 | jmp +282 | ||
| 112 | acc +49 | ||
| 113 | acc +11 | ||
| 114 | acc +28 | ||
| 115 | acc +40 | ||
| 116 | jmp +79 | ||
| 117 | acc +19 | ||
| 118 | acc -8 | ||
| 119 | nop +87 | ||
| 120 | jmp +347 | ||
| 121 | acc +48 | ||
| 122 | nop +189 | ||
| 123 | jmp +419 | ||
| 124 | acc +31 | ||
| 125 | jmp +1 | ||
| 126 | acc +31 | ||
| 127 | jmp +1 | ||
| 128 | jmp -94 | ||
| 129 | nop -45 | ||
| 130 | nop +412 | ||
| 131 | acc -14 | ||
| 132 | acc +35 | ||
| 133 | jmp -49 | ||
| 134 | jmp +177 | ||
| 135 | jmp +127 | ||
| 136 | jmp +360 | ||
| 137 | jmp +114 | ||
| 138 | acc -11 | ||
| 139 | nop +248 | ||
| 140 | jmp -64 | ||
| 141 | acc +31 | ||
| 142 | acc +23 | ||
| 143 | acc +4 | ||
| 144 | nop +110 | ||
| 145 | jmp +61 | ||
| 146 | acc +45 | ||
| 147 | nop +444 | ||
| 148 | jmp +218 | ||
| 149 | jmp -131 | ||
| 150 | acc +36 | ||
| 151 | jmp -142 | ||
| 152 | nop +361 | ||
| 153 | acc -3 | ||
| 154 | acc +6 | ||
| 155 | jmp +161 | ||
| 156 | acc +24 | ||
| 157 | acc -7 | ||
| 158 | acc +4 | ||
| 159 | acc +31 | ||
| 160 | jmp +91 | ||
| 161 | jmp -20 | ||
| 162 | jmp +1 | ||
| 163 | nop -11 | ||
| 164 | jmp -146 | ||
| 165 | acc +25 | ||
| 166 | acc +33 | ||
| 167 | jmp +52 | ||
| 168 | acc -7 | ||
| 169 | jmp +82 | ||
| 170 | acc +7 | ||
| 171 | acc +21 | ||
| 172 | acc +6 | ||
| 173 | jmp +397 | ||
| 174 | acc +12 | ||
| 175 | acc +5 | ||
| 176 | acc -9 | ||
| 177 | acc +24 | ||
