Refactor 2021 for new UI.
This commit is contained in:
		| @@ -1,14 +1,17 @@ | ||||
| import sys | ||||
| from typing import Any, Iterator | ||||
|  | ||||
| lines = sys.stdin.read().splitlines() | ||||
| from ..base import BaseSolver | ||||
|  | ||||
|  | ||||
| class Solver(BaseSolver): | ||||
|     def solve(self, input: str) -> Iterator[Any]: | ||||
|         lines = input.splitlines() | ||||
|  | ||||
|         values = [int(line) for line in lines] | ||||
|  | ||||
|         # part 1 | ||||
| answer_1 = sum(v2 > v1 for v1, v2 in zip(values[:-1], values[1:])) | ||||
| print(f"answer 1 is {answer_1}") | ||||
|         yield sum(v2 > v1 for v1, v2 in zip(values[:-1], values[1:])) | ||||
|  | ||||
|         # part 2 | ||||
|         runnings = [sum(values[i : i + 3]) for i in range(len(values) - 2)] | ||||
| answer_2 = sum(v2 > v1 for v1, v2 in zip(runnings[:-1], runnings[1:])) | ||||
| print(f"answer 2 is {answer_2}") | ||||
|         yield sum(v2 > v1 for v1, v2 in zip(runnings[:-1], runnings[1:])) | ||||
|   | ||||
| @@ -1,11 +1,7 @@ | ||||
| import sys | ||||
| from typing import Any, Iterator | ||||
|  | ||||
| lines = sys.stdin.read().splitlines() | ||||
| from ..base import BaseSolver | ||||
|  | ||||
| # part 1 | ||||
| answer_1 = ... | ||||
| print(f"answer 1 is {answer_1}") | ||||
|  | ||||
| # part 2 | ||||
| answer_2 = ... | ||||
| print(f"answer 2 is {answer_2}") | ||||
| class Solver(BaseSolver): | ||||
|     def solve(self, input: str) -> Iterator[Any]: ... | ||||
|   | ||||
| @@ -1,11 +1,7 @@ | ||||
| import sys | ||||
| from typing import Any, Iterator | ||||
|  | ||||
| lines = sys.stdin.read().splitlines() | ||||
| from ..base import BaseSolver | ||||
|  | ||||
| # part 1 | ||||
| answer_1 = ... | ||||
| print(f"answer 1 is {answer_1}") | ||||
|  | ||||
| # part 2 | ||||
| answer_2 = ... | ||||
| print(f"answer 2 is {answer_2}") | ||||
| class Solver(BaseSolver): | ||||
|     def solve(self, input: str) -> Iterator[Any]: ... | ||||
|   | ||||
| @@ -1,11 +1,7 @@ | ||||
| import sys | ||||
| from typing import Any, Iterator | ||||
|  | ||||
| lines = sys.stdin.read().splitlines() | ||||
| from ..base import BaseSolver | ||||
|  | ||||
| # part 1 | ||||
| answer_1 = ... | ||||
| print(f"answer 1 is {answer_1}") | ||||
|  | ||||
| # part 2 | ||||
| answer_2 = ... | ||||
| print(f"answer 2 is {answer_2}") | ||||
| class Solver(BaseSolver): | ||||
|     def solve(self, input: str) -> Iterator[Any]: ... | ||||
|   | ||||
| @@ -1,11 +1,7 @@ | ||||
| import sys | ||||
| from typing import Any, Iterator | ||||
|  | ||||
| lines = sys.stdin.read().splitlines() | ||||
| from ..base import BaseSolver | ||||
|  | ||||
| # part 1 | ||||
| answer_1 = ... | ||||
| print(f"answer 1 is {answer_1}") | ||||
|  | ||||
| # part 2 | ||||
| answer_2 = ... | ||||
| print(f"answer 2 is {answer_2}") | ||||
| class Solver(BaseSolver): | ||||
|     def solve(self, input: str) -> Iterator[Any]: ... | ||||
|   | ||||
| @@ -1,11 +1,7 @@ | ||||
| import sys | ||||
| from typing import Any, Iterator | ||||
|  | ||||
| lines = sys.stdin.read().splitlines() | ||||
| from ..base import BaseSolver | ||||
|  | ||||
| # part 1 | ||||
| answer_1 = ... | ||||
| print(f"answer 1 is {answer_1}") | ||||
|  | ||||
| # part 2 | ||||
| answer_2 = ... | ||||
| print(f"answer 2 is {answer_2}") | ||||
| class Solver(BaseSolver): | ||||
|     def solve(self, input: str) -> Iterator[Any]: ... | ||||
|   | ||||
| @@ -1,11 +1,7 @@ | ||||
| import sys | ||||
| from typing import Any, Iterator | ||||
|  | ||||
| lines = sys.stdin.read().splitlines() | ||||
| from ..base import BaseSolver | ||||
|  | ||||
| # part 1 | ||||
| answer_1 = ... | ||||
| print(f"answer 1 is {answer_1}") | ||||
|  | ||||
| # part 2 | ||||
| answer_2 = ... | ||||
| print(f"answer 2 is {answer_2}") | ||||
| class Solver(BaseSolver): | ||||
|     def solve(self, input: str) -> Iterator[Any]: ... | ||||
|   | ||||
| @@ -1,11 +1,7 @@ | ||||
| import sys | ||||
| from typing import Any, Iterator | ||||
|  | ||||
| lines = sys.stdin.read().splitlines() | ||||
| from ..base import BaseSolver | ||||
|  | ||||
| # part 1 | ||||
| answer_1 = ... | ||||
| print(f"answer 1 is {answer_1}") | ||||
|  | ||||
| # part 2 | ||||
| answer_2 = ... | ||||
| print(f"answer 2 is {answer_2}") | ||||
| class Solver(BaseSolver): | ||||
|     def solve(self, input: str) -> Iterator[Any]: ... | ||||
|   | ||||
| @@ -1,11 +1,7 @@ | ||||
| import sys | ||||
| from typing import Any, Iterator | ||||
|  | ||||
| lines = sys.stdin.read().splitlines() | ||||
| from ..base import BaseSolver | ||||
|  | ||||
| # part 1 | ||||
| answer_1 = ... | ||||
| print(f"answer 1 is {answer_1}") | ||||
|  | ||||
| # part 2 | ||||
| answer_2 = ... | ||||
| print(f"answer 2 is {answer_2}") | ||||
| class Solver(BaseSolver): | ||||
|     def solve(self, input: str) -> Iterator[Any]: ... | ||||
|   | ||||
| @@ -1,11 +1,7 @@ | ||||
| import sys | ||||
| from typing import Any, Iterator | ||||
|  | ||||
| lines = sys.stdin.read().splitlines() | ||||
| from ..base import BaseSolver | ||||
|  | ||||
| # part 1 | ||||
| answer_1 = ... | ||||
| print(f"answer 1 is {answer_1}") | ||||
|  | ||||
| # part 2 | ||||
| answer_2 = ... | ||||
| print(f"answer 2 is {answer_2}") | ||||
| class Solver(BaseSolver): | ||||
|     def solve(self, input: str) -> Iterator[Any]: ... | ||||
|   | ||||
| @@ -1,11 +1,7 @@ | ||||
| import sys | ||||
| from typing import Any, Iterator | ||||
|  | ||||
| lines = sys.stdin.read().splitlines() | ||||
| from ..base import BaseSolver | ||||
|  | ||||
| # part 1 | ||||
| answer_1 = ... | ||||
| print(f"answer 1 is {answer_1}") | ||||
|  | ||||
| # part 2 | ||||
| answer_2 = ... | ||||
| print(f"answer 2 is {answer_2}") | ||||
| class Solver(BaseSolver): | ||||
|     def solve(self, input: str) -> Iterator[Any]: ... | ||||
|   | ||||
| @@ -1,16 +1,19 @@ | ||||
| import sys | ||||
| from math import prod | ||||
| from typing import Literal, TypeAlias, cast | ||||
| from typing import Any, Iterator, Literal, TypeAlias, cast | ||||
|  | ||||
| lines = sys.stdin.read().splitlines() | ||||
| from ..base import BaseSolver | ||||
|  | ||||
| Command: TypeAlias = Literal["forward", "up", "down"] | ||||
|  | ||||
|  | ||||
| class Solver(BaseSolver): | ||||
|     def solve(self, input: str) -> Iterator[Any]: | ||||
|         lines = input.splitlines() | ||||
|  | ||||
|         commands: list[tuple[Command, int]] = [ | ||||
|             (cast(Command, (p := line.split())[0]), int(p[1])) for line in lines | ||||
|         ] | ||||
|  | ||||
|  | ||||
|         def depth_and_position(use_aim: bool): | ||||
|             aim, pos, depth = 0, 0, 0 | ||||
|             for command, value in commands: | ||||
| @@ -31,11 +34,5 @@ def depth_and_position(use_aim: bool): | ||||
|  | ||||
|             return depth, pos | ||||
|  | ||||
|  | ||||
| # part 1 | ||||
| answer_1 = prod(depth_and_position(False)) | ||||
| print(f"answer 1 is {answer_1}") | ||||
|  | ||||
| # part 2 | ||||
| answer_2 = prod(depth_and_position(True)) | ||||
| print(f"answer 2 is {answer_2}") | ||||
|         yield prod(depth_and_position(False)) | ||||
|         yield prod(depth_and_position(True)) | ||||
|   | ||||
| @@ -1,11 +1,7 @@ | ||||
| import sys | ||||
| from typing import Any, Iterator | ||||
|  | ||||
| lines = sys.stdin.read().splitlines() | ||||
| from ..base import BaseSolver | ||||
|  | ||||
| # part 1 | ||||
| answer_1 = ... | ||||
| print(f"answer 1 is {answer_1}") | ||||
|  | ||||
| # part 2 | ||||
| answer_2 = ... | ||||
| print(f"answer 2 is {answer_2}") | ||||
| class Solver(BaseSolver): | ||||
|     def solve(self, input: str) -> Iterator[Any]: ... | ||||
|   | ||||
| @@ -1,11 +1,7 @@ | ||||
| import sys | ||||
| from typing import Any, Iterator | ||||
|  | ||||
| lines = sys.stdin.read().splitlines() | ||||
| from ..base import BaseSolver | ||||
|  | ||||
| # part 1 | ||||
| answer_1 = ... | ||||
| print(f"answer 1 is {answer_1}") | ||||
|  | ||||
| # part 2 | ||||
| answer_2 = ... | ||||
| print(f"answer 2 is {answer_2}") | ||||
| class Solver(BaseSolver): | ||||
|     def solve(self, input: str) -> Iterator[Any]: ... | ||||
|   | ||||
| @@ -1,11 +1,7 @@ | ||||
| import sys | ||||
| from typing import Any, Iterator | ||||
|  | ||||
| lines = sys.stdin.read().splitlines() | ||||
| from ..base import BaseSolver | ||||
|  | ||||
| # part 1 | ||||
| answer_1 = ... | ||||
| print(f"answer 1 is {answer_1}") | ||||
|  | ||||
| # part 2 | ||||
| answer_2 = ... | ||||
| print(f"answer 2 is {answer_2}") | ||||
| class Solver(BaseSolver): | ||||
|     def solve(self, input: str) -> Iterator[Any]: ... | ||||
|   | ||||
| @@ -1,11 +1,7 @@ | ||||
| import sys | ||||
| from typing import Any, Iterator | ||||
|  | ||||
| lines = sys.stdin.read().splitlines() | ||||
| from ..base import BaseSolver | ||||
|  | ||||
| # part 1 | ||||
| answer_1 = ... | ||||
| print(f"answer 1 is {answer_1}") | ||||
|  | ||||
| # part 2 | ||||
| answer_2 = ... | ||||
| print(f"answer 2 is {answer_2}") | ||||
| class Solver(BaseSolver): | ||||
|     def solve(self, input: str) -> Iterator[Any]: ... | ||||
|   | ||||
| @@ -1,11 +1,7 @@ | ||||
| import sys | ||||
| from typing import Any, Iterator | ||||
|  | ||||
| lines = sys.stdin.read().splitlines() | ||||
| from ..base import BaseSolver | ||||
|  | ||||
| # part 1 | ||||
| answer_1 = ... | ||||
| print(f"answer 1 is {answer_1}") | ||||
|  | ||||
| # part 2 | ||||
| answer_2 = ... | ||||
| print(f"answer 2 is {answer_2}") | ||||
| class Solver(BaseSolver): | ||||
|     def solve(self, input: str) -> Iterator[Any]: ... | ||||
|   | ||||
| @@ -1,11 +1,7 @@ | ||||
| import sys | ||||
| from typing import Any, Iterator | ||||
|  | ||||
| lines = sys.stdin.read().splitlines() | ||||
| from ..base import BaseSolver | ||||
|  | ||||
| # part 1 | ||||
| answer_1 = ... | ||||
| print(f"answer 1 is {answer_1}") | ||||
|  | ||||
| # part 2 | ||||
| answer_2 = ... | ||||
| print(f"answer 2 is {answer_2}") | ||||
| class Solver(BaseSolver): | ||||
|     def solve(self, input: str) -> Iterator[Any]: ... | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| import sys | ||||
| from collections import Counter | ||||
| from typing import Literal | ||||
| from typing import Any, Iterator, Literal | ||||
|  | ||||
| from ..base import BaseSolver | ||||
|  | ||||
|  | ||||
| def generator_rating( | ||||
| @@ -20,20 +21,23 @@ def generator_rating( | ||||
|     return values[0] | ||||
|  | ||||
|  | ||||
| lines = sys.stdin.read().splitlines() | ||||
|  | ||||
| class Solver(BaseSolver): | ||||
|     def solve(self, input: str) -> Iterator[Any]: | ||||
|         lines = input.splitlines() | ||||
|  | ||||
|         # part 1 | ||||
|         most_and_least_common = [ | ||||
|     tuple(Counter(line[col] for line in lines).most_common(2)[m][0] for m in range(2)) | ||||
|             tuple( | ||||
|                 Counter(line[col] for line in lines).most_common(2)[m][0] | ||||
|                 for m in range(2) | ||||
|             ) | ||||
|             for col in range(len(lines[0])) | ||||
|         ] | ||||
|         gamma_rate = int("".join(most for most, _ in most_and_least_common), base=2) | ||||
|         epsilon_rate = int("".join(least for _, least in most_and_least_common), base=2) | ||||
| print(f"answer 1 is {gamma_rate * epsilon_rate}") | ||||
|         yield gamma_rate * epsilon_rate | ||||
|  | ||||
|         # part 2 | ||||
|         oxygen_generator_rating = int(generator_rating(lines, True, "1"), base=2) | ||||
|         co2_scrubber_rating = int(generator_rating(lines, False, "0"), base=2) | ||||
| answer_2 = oxygen_generator_rating * co2_scrubber_rating | ||||
| print(f"answer 2 is {answer_2}") | ||||
|         yield oxygen_generator_rating * co2_scrubber_rating | ||||
|   | ||||
| @@ -1,8 +1,13 @@ | ||||
| import sys | ||||
| from typing import Any, Iterator | ||||
|  | ||||
| import numpy as np | ||||
|  | ||||
| lines = sys.stdin.read().splitlines() | ||||
| from ..base import BaseSolver | ||||
|  | ||||
|  | ||||
| class Solver(BaseSolver): | ||||
|     def solve(self, input: str) -> Iterator[Any]: | ||||
|         lines = input.splitlines() | ||||
|  | ||||
|         numbers = [int(c) for c in lines[0].split(",")] | ||||
|  | ||||
| @@ -26,7 +31,9 @@ for round, number in enumerate(numbers): | ||||
|                 if winning_rounds[index][0] > 0: | ||||
|                     continue | ||||
|  | ||||
|         if np.any(np.all(marked[index], axis=0) | np.all(marked[index], axis=1)): | ||||
|                 if np.any( | ||||
|                     np.all(marked[index], axis=0) | np.all(marked[index], axis=1) | ||||
|                 ): | ||||
|                     winning_rounds[index] = ( | ||||
|                         round, | ||||
|                         number * int(np.sum(boards[index][~marked[index]])), | ||||
| @@ -38,8 +45,8 @@ for round, number in enumerate(numbers): | ||||
|  | ||||
|         # part 1 | ||||
|         (_, score) = min(winning_rounds, key=lambda w: w[0]) | ||||
| print(f"answer 1 is {score}") | ||||
|         yield score | ||||
|  | ||||
|         # part 2 | ||||
|         (_, score) = max(winning_rounds, key=lambda w: w[0]) | ||||
| print(f"answer 2 is {score}") | ||||
|         yield score | ||||
|   | ||||
| @@ -1,8 +1,13 @@ | ||||
| import sys | ||||
| from typing import Any, Iterator | ||||
|  | ||||
| import numpy as np | ||||
|  | ||||
| lines: list[str] = sys.stdin.read().splitlines() | ||||
| from ..base import BaseSolver | ||||
|  | ||||
|  | ||||
| class Solver(BaseSolver): | ||||
|     def solve(self, input: str) -> Iterator[Any]: | ||||
|         lines = input.splitlines() | ||||
|  | ||||
|         sections: list[tuple[tuple[int, int], tuple[int, int]]] = [ | ||||
|             ( | ||||
| @@ -20,10 +25,8 @@ sections: list[tuple[tuple[int, int], tuple[int, int]]] = [ | ||||
|  | ||||
|         np_sections = np.array(sections).reshape(-1, 4) | ||||
|  | ||||
| x_min, x_max, y_min, y_max = ( | ||||
|     min(np_sections[:, 0].min(), np_sections[:, 2].min()), | ||||
|         x_max, y_max = ( | ||||
|             max(np_sections[:, 0].max(), np_sections[:, 2].max()), | ||||
|     min(np_sections[:, 1].min(), np_sections[:, 3].min()), | ||||
|             max(np_sections[:, 1].max(), np_sections[:, 3].max()), | ||||
|         ) | ||||
|  | ||||
| @@ -41,8 +44,5 @@ for (x1, y1), (x2, y2) in sections: | ||||
|                 for i, j in zip(y_rng, x_rng): | ||||
|                     counts_2[i, j] += 1 | ||||
|  | ||||
| answer_1 = (counts_1 >= 2).sum() | ||||
| print(f"answer 1 is {answer_1}") | ||||
|  | ||||
| answer_2 = (counts_2 >= 2).sum() | ||||
| print(f"answer 2 is {answer_2}") | ||||
|         yield (counts_1 >= 2).sum() | ||||
|         yield (counts_2 >= 2).sum() | ||||
|   | ||||
| @@ -1,6 +1,11 @@ | ||||
| import sys | ||||
| from typing import Any, Iterator | ||||
|  | ||||
| values = [int(c) for c in sys.stdin.read().strip().split(",")] | ||||
| from ..base import BaseSolver | ||||
|  | ||||
|  | ||||
| class Solver(BaseSolver): | ||||
|     def solve(self, input: str) -> Iterator[Any]: | ||||
|         values = [int(c) for c in input.split(",")] | ||||
|  | ||||
|         days = 256 | ||||
|         lanterns = {day: 0 for day in range(days)} | ||||
| @@ -12,10 +17,5 @@ for day in range(days): | ||||
|             for day2 in range(day + 9, days, 7): | ||||
|                 lanterns[day2] += lanterns[day] | ||||
|  | ||||
| # part 1 | ||||
| answer_1 = sum(v for k, v in lanterns.items() if k < 80) + len(values) | ||||
| print(f"answer 1 is {answer_1}") | ||||
|  | ||||
| # part 2 | ||||
| answer_2 = sum(lanterns.values()) + len(values) | ||||
| print(f"answer 2 is {answer_2}") | ||||
|         yield sum(v for k, v in lanterns.items() if k < 80) + len(values) | ||||
|         yield sum(lanterns.values()) + len(values) | ||||
|   | ||||
| @@ -1,19 +1,22 @@ | ||||
| import sys | ||||
| from typing import Any, Iterator | ||||
|  | ||||
| positions = [int(c) for c in sys.stdin.read().strip().split(",")] | ||||
| from ..base import BaseSolver | ||||
|  | ||||
|  | ||||
| class Solver(BaseSolver): | ||||
|     def solve(self, input: str) -> Iterator[Any]: | ||||
|         positions = [int(c) for c in input.split(",")] | ||||
|  | ||||
|         min_position, max_position = min(positions), max(positions) | ||||
|  | ||||
|         # part 1 | ||||
| answer_1 = min( | ||||
|         yield min( | ||||
|             sum(abs(p - position) for p in positions) | ||||
|             for position in range(min_position, max_position + 1) | ||||
|         ) | ||||
| print(f"answer 1 is {answer_1}") | ||||
|  | ||||
|         # part 2 | ||||
| answer_2 = min( | ||||
|         yield min( | ||||
|             sum(abs(p - position) * (abs(p - position) + 1) // 2 for p in positions) | ||||
|             for position in range(min_position, max_position + 1) | ||||
|         ) | ||||
| print(f"answer 2 is {answer_2}") | ||||
|   | ||||
| @@ -1,8 +1,7 @@ | ||||
| import itertools | ||||
| import os | ||||
| import sys | ||||
| from typing import Any, Iterator | ||||
|  | ||||
| VERBOSE = os.getenv("AOC_VERBOSE") == "True" | ||||
| from ..base import BaseSolver | ||||
|  | ||||
| digits = { | ||||
|     "abcefg": 0, | ||||
| @@ -17,14 +16,18 @@ digits = { | ||||
|     "abcdfg": 9, | ||||
| } | ||||
|  | ||||
| lines = sys.stdin.read().splitlines() | ||||
|  | ||||
| class Solver(BaseSolver): | ||||
|     def solve(self, input: str) -> Iterator[Any]: | ||||
|         lines = input.splitlines() | ||||
|  | ||||
|         # part 1 | ||||
|         lengths = {len(k) for k, v in digits.items() if v in (1, 4, 7, 8)} | ||||
| answer_1 = sum( | ||||
|     len(p) in lengths for line in lines for p in line.split("|")[1].strip().split() | ||||
|         yield sum( | ||||
|             len(p) in lengths | ||||
|             for line in lines | ||||
|             for p in line.split("|")[1].strip().split() | ||||
|         ) | ||||
| print(f"answer 1 is {answer_1}") | ||||
|  | ||||
|         # part 2 | ||||
|         values: list[int] = [] | ||||
| @@ -49,7 +52,9 @@ for line in lines: | ||||
|             bd = [u for u in per_length[4][0] if u not in cf] | ||||
|  | ||||
|             # the 3 digits of length 5 have a, d and g in common | ||||
|     adg = [u for u in per_length[5][0] if all(u in pe for pe in per_length[5][1:])] | ||||
|             adg = [ | ||||
|                 u for u in per_length[5][0] if all(u in pe for pe in per_length[5][1:]) | ||||
|             ] | ||||
|  | ||||
|             # we can remove a | ||||
|             dg = [u for u in adg if u != a] | ||||
| @@ -77,11 +82,8 @@ for line in lines: | ||||
|                 digit = "".join(sorted(mapping[c] for c in number)) | ||||
|                 value = 10 * value + digits[digit] | ||||
|  | ||||
|     if VERBOSE: | ||||
|         print(value) | ||||
|             self.logger.info(f"value for '{line}' is {value}") | ||||
|  | ||||
|             values.append(value) | ||||
|  | ||||
|  | ||||
| answer_2 = sum(values) | ||||
| print(f"answer 2 is {answer_2}") | ||||
|         yield sum(values) | ||||
|   | ||||
| @@ -1,18 +1,18 @@ | ||||
| import sys | ||||
| from math import prod | ||||
| from typing import Any, Iterator | ||||
|  | ||||
| values = [[int(c) for c in row] for row in sys.stdin.read().splitlines()] | ||||
| n_rows, n_cols = len(values), len(values[0]) | ||||
| from ..base import BaseSolver | ||||
|  | ||||
|  | ||||
| def neighbors(point: tuple[int, int]): | ||||
| def neighbors(point: tuple[int, int], n_rows: int, n_cols: int): | ||||
|     i, j = point | ||||
|     for di, dj in ((-1, 0), (+1, 0), (0, -1), (0, +1)): | ||||
|         if 0 <= i + di < n_rows and 0 <= j + dj < n_cols: | ||||
|             yield (i + di, j + dj) | ||||
|  | ||||
|  | ||||
| def basin(start: tuple[int, int]) -> set[tuple[int, int]]: | ||||
| def basin(values: list[list[int]], start: tuple[int, int]) -> set[tuple[int, int]]: | ||||
|     n_rows, n_cols = len(values), len(values[0]) | ||||
|     visited: set[tuple[int, int]] = set() | ||||
|     queue = [start] | ||||
|  | ||||
| @@ -23,22 +23,25 @@ def basin(start: tuple[int, int]) -> set[tuple[int, int]]: | ||||
|             continue | ||||
|  | ||||
|         visited.add((i, j)) | ||||
|         queue.extend(neighbors((i, j))) | ||||
|         queue.extend(neighbors((i, j), n_rows, n_cols)) | ||||
|  | ||||
|     return visited | ||||
|  | ||||
|  | ||||
| class Solver(BaseSolver): | ||||
|     def solve(self, input: str) -> Iterator[Any]: | ||||
|         values = [[int(c) for c in row] for row in input.splitlines()] | ||||
|         n_rows, n_cols = len(values), len(values[0]) | ||||
|  | ||||
|         low_points = [ | ||||
|             (i, j) | ||||
|             for i in range(n_rows) | ||||
|             for j in range(n_cols) | ||||
|     if all(values[ti][tj] > values[i][j] for ti, tj in neighbors((i, j))) | ||||
|             if all( | ||||
|                 values[ti][tj] > values[i][j] | ||||
|                 for ti, tj in neighbors((i, j), n_rows, n_cols) | ||||
|             ) | ||||
|         ] | ||||
|  | ||||
| # part 1 | ||||
| answer_1 = sum(values[i][j] + 1 for i, j in low_points) | ||||
| print(f"answer 1 is {answer_1}") | ||||
|  | ||||
| # part 2 | ||||
| answer_2 = prod(sorted(len(basin(point)) for point in low_points)[-3:]) | ||||
| print(f"answer 2 is {answer_2}") | ||||
|         yield sum(values[i][j] + 1 for i, j in low_points) | ||||
|         yield prod(sorted(len(basin(values, point)) for point in low_points)[-3:]) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user