diff --git a/2022/day1.py b/2022/day1.py index 47da67a..4dc115c 100644 --- a/2022/day1.py +++ b/2022/day1.py @@ -1,5 +1,3 @@ -# -*- encoding: utf-8 -*- - import sys blocks = sys.stdin.read().split("\n\n") diff --git a/2022/day10.py b/2022/day10.py index 5519cf2..73470c6 100644 --- a/2022/day10.py +++ b/2022/day10.py @@ -1,5 +1,3 @@ -# -*- encoding: utf-8 -*- - import sys lines = sys.stdin.read().splitlines() diff --git a/2022/day11.py b/2022/day11.py index ed439cd..5c2efd9 100644 --- a/2022/day11.py +++ b/2022/day11.py @@ -1,5 +1,3 @@ -# -*- encoding: utf-8 -*- - import copy import sys from functools import reduce @@ -7,7 +5,6 @@ from typing import Callable, Final, Mapping, Sequence class Monkey: - id: Final[int] items: Final[Sequence[int]] worry_fn: Final[Callable[[int], int]] @@ -97,8 +94,7 @@ def run( # number of inspects inspects = {monkey: 0 for monkey in monkeys} - for round in range(n_rounds): - + for _ in range(n_rounds): for monkey in monkeys: for item in items[monkey]: inspects[monkey] += 1 diff --git a/2022/day12.py b/2022/day12.py index e03bb54..66d1752 100644 --- a/2022/day12.py +++ b/2022/day12.py @@ -1,5 +1,3 @@ -# -*- encoding: utf-8 -*- - import heapq import sys from typing import Callable, Iterator, TypeVar @@ -44,7 +42,6 @@ def dijkstra( visited.add(current) for neighbor in neighbors(current): - if neighbor in visited: continue @@ -60,7 +57,6 @@ def dijkstra( def make_path(parents: dict[Node, Node], start: Node, end: Node) -> list[Node] | None: - if end not in parents: return None @@ -109,7 +105,6 @@ def neighbors( (c_row, c_col - 1), (c_row, c_col + 1), ): - if not (n_row >= 0 and n_row < n_rows and n_col >= 0 and n_col < n_cols): continue diff --git a/2022/day13.py b/2022/day13.py index d717412..c9d2361 100644 --- a/2022/day13.py +++ b/2022/day13.py @@ -1,27 +1,27 @@ -# -*- encoding: utf-8 -*- - import json import sys from functools import cmp_to_key +from typing import TypeAlias, cast blocks = sys.stdin.read().strip().split("\n\n") pairs = [tuple(json.loads(p) for p in block.split("\n")) for block in blocks] +Packet: TypeAlias = list[int | list["Packet"]] -def compare(lhs: list[int | list], rhs: list[int | list]) -> int: +def compare(lhs: Packet, rhs: Packet) -> int: for lhs_a, rhs_a in zip(lhs, rhs): if isinstance(lhs_a, int) and isinstance(rhs_a, int): if lhs_a != rhs_a: return rhs_a - lhs_a else: if not isinstance(lhs_a, list): - lhs_a = [lhs_a] + lhs_a = [lhs_a] # type: ignore elif not isinstance(rhs_a, list): - rhs_a = [rhs_a] + rhs_a = [rhs_a] # type: ignore assert isinstance(rhs_a, list) and isinstance(lhs_a, list) - r = compare(lhs_a, rhs_a) + r = compare(cast(Packet, lhs_a), cast(Packet, rhs_a)) if r != 0: return r diff --git a/2022/day14.py b/2022/day14.py index 829893a..17d937c 100644 --- a/2022/day14.py +++ b/2022/day14.py @@ -1,7 +1,4 @@ -# -*- encoding: utf-8 -*- - import sys -from collections import defaultdict from enum import Enum, auto from typing import Callable, cast @@ -23,10 +20,10 @@ def print_blocks(blocks: dict[tuple[int, int], Cell]): blocks: Set of blocks to print. """ x_min, y_min, x_max, y_max = ( - min(x for x, y in blocks), + min(x for x, _ in blocks), 0, - max(x for x, y in blocks), - max(y for x, y in blocks), + max(x for x, _ in blocks), + max(y for _, y in blocks), ) for y in range(y_min, y_max + 1): @@ -56,13 +53,12 @@ def flow( The input blocks. """ - y_max = max(y for x, y in blocks) + y_max = max(y for _, y in blocks) while True: x, y = 500, 0 while y <= y_max: - moved = False for cx, cy in ((x, y + 1), (x - 1, y + 1), (x + 1, y + 1)): if (cx, cy) not in blocks and fill_fn(cx, cy) == Cell.AIR: @@ -117,10 +113,10 @@ print_blocks(blocks) print() x_min, y_min, x_max, y_max = ( - min(x for x, y in blocks), + min(x for x, _ in blocks), 0, - max(x for x, y in blocks), - max(y for x, y in blocks), + max(x for x, _ in blocks), + max(y for _, y in blocks), ) # === part 1 === diff --git a/2022/day15.py b/2022/day15.py index 6ee3ffa..fd0fb0d 100644 --- a/2022/day15.py +++ b/2022/day15.py @@ -1,5 +1,3 @@ -# -*- encoding: utf-8 -*- - import sys import numpy as np @@ -7,7 +5,6 @@ import parse def part1(sensor_to_beacon: dict[tuple[int, int], tuple[int, int]], row: int) -> int: - no_beacons_row_l: list[np.ndarray] = [] for (sx, sy), (bx, by) in sensor_to_beacon.items(): @@ -37,7 +34,7 @@ def part2_intervals( its.append((max(0, sx - dx), min(sx + dx, xy_max))) its = sorted(its) - s, e = its[0] + _, e = its[0] for si, ei in its[1:]: if si > e + 1: diff --git a/2022/day16.py b/2022/day16.py index 9af5a2c..055ed25 100644 --- a/2022/day16.py +++ b/2022/day16.py @@ -1,5 +1,3 @@ -# -*- encoding: utf-8 -*- - from __future__ import annotations import heapq @@ -69,7 +67,6 @@ def part_1( distances: dict[tuple[Pipe, Pipe], int], relevant_pipes: FrozenSet[Pipe], ): - node_at_times: dict[int, dict[Pipe, dict[FrozenSet[Pipe], int]]] = defaultdict( lambda: defaultdict(lambda: defaultdict(lambda: 0)) ) @@ -79,7 +76,6 @@ def part_1( for c_pipe, nodes in node_at_times[time].items(): for flowing, flow in nodes.items(): for target in relevant_pipes: - distance = distances[c_pipe, target] + 1 if time + distance >= max_time or target in flowing: continue diff --git a/2022/day17.py b/2022/day17.py index 200ed99..6f02c26 100644 --- a/2022/day17.py +++ b/2022/day17.py @@ -1,5 +1,3 @@ -# -*- encoding: utf-8 -*- - import sys from typing import Sequence, TypeVar @@ -49,7 +47,6 @@ def build_tower( early_stop: bool = False, init: np.ndarray = np.ones(WIDTH, dtype=bool), ) -> tuple[np.ndarray, int, int, dict[int, int]]: - tower = EMPTY_BLOCKS.copy() tower[0, :] = init @@ -59,7 +56,6 @@ def build_tower( rock_count = 0 for rock_count in range(n_rocks): - if early_stop: if i_rock == 0 and (i_rock, i_jet) in done_at: break @@ -75,7 +71,6 @@ def build_tower( tower = np.concatenate([tower, EMPTY_BLOCKS], axis=0) while True: - jet, i_jet = next_cycle(jets, i_jet) dx = 0 diff --git a/2022/day18.py b/2022/day18.py index 96aabf5..9feff8b 100644 --- a/2022/day18.py +++ b/2022/day18.py @@ -1,5 +1,3 @@ -# -*- encoding: utf-8 -*- - import sys from typing import FrozenSet diff --git a/2022/day19.py b/2022/day19.py index 0a264b5..cd7860c 100644 --- a/2022/day19.py +++ b/2022/day19.py @@ -1,5 +1,3 @@ -# -*- encoding: utf-8 -*- - import sys from typing import Literal @@ -88,7 +86,6 @@ for line in lines: def run(blueprint: dict[Reagent, dict[Reagent, int]], max_time: int) -> int: - # since we can only build one robot per time, we do not need more than X robots # of type K where X is the maximum number of K required among all robots, e.g., # in the first toy blueprint, we need at most 4 ore robots, 14 clay ones and 7 @@ -100,7 +97,6 @@ def run(blueprint: dict[Reagent, dict[Reagent, int]], max_time: int) -> int: state_after_t: dict[int, set[State]] = {0: [State()]} for t in range(1, max_time + 1): - # list of new states at the end of step t that we are going to prune later states_for_t: set[State] = set() diff --git a/2022/day2.py b/2022/day2.py index 0851812..4d23c7c 100644 --- a/2022/day2.py +++ b/2022/day2.py @@ -1,5 +1,3 @@ -# -*- encoding: utf-8 -*- - import sys @@ -49,7 +47,7 @@ lines = sys.stdin.readlines() values = [(ord(row[0]) - ord("A"), ord(row[2]) - ord("X")) for row in lines] # part 1 - 13526 -print(f"score 1 is {sum(score_1(*v) for v in values)}") +print(f"answer 1 is {sum(score_1(*v) for v in values)}") # part 2 - 14204 -print(f"score 2 is {sum(score_2(*v) for v in values)}") +print(f"answer 2 is {sum(score_2(*v) for v in values)}") diff --git a/2022/day20.py b/2022/day20.py index a8ed796..5448d0a 100644 --- a/2022/day20.py +++ b/2022/day20.py @@ -1,5 +1,3 @@ -# -*- encoding: utf-8 -*- - from __future__ import annotations import sys @@ -21,7 +19,6 @@ class Number: def decrypt(numbers: list[Number], key: int, rounds: int) -> int: - numbers = numbers.copy() original = numbers.copy() diff --git a/2022/day21.py b/2022/day21.py index 6758bca..c5b3736 100644 --- a/2022/day21.py +++ b/2022/day21.py @@ -1,5 +1,3 @@ -# -*- encoding: utf-8 -*- - import operator import sys from typing import Callable diff --git a/2022/day22.py b/2022/day22.py index f43d477..571f314 100644 --- a/2022/day22.py +++ b/2022/day22.py @@ -1,5 +1,3 @@ -# -*- encoding: utf-8 -*- - import re import sys from typing import Callable @@ -126,7 +124,6 @@ def wrap_part_2(y0: int, x0: int, r0: str) -> tuple[int, int, str]: def run(wrap: Callable[[int, int, str], tuple[int, int, str]]) -> tuple[int, int, str]: - y0 = 0 x0 = np.where(board[0] == EMPTY)[0][0] r0 = "E" diff --git a/2022/day23.py b/2022/day23.py index 02c9235..902c20b 100644 --- a/2022/day23.py +++ b/2022/day23.py @@ -1,5 +1,3 @@ -# -*- encoding: utf-8 -*- - import itertools import sys from collections import defaultdict @@ -41,7 +39,7 @@ def round( directions: Directions, ): to_move: dict[tuple[int, int], list[tuple[int, int]]] = defaultdict(lambda: []) - for (y, x) in positions: + for y, x in positions: elves = { (dy, dx): (y + dy, x + dx) in positions for dy, dx in itertools.product((-1, 0, 1), (-1, 0, 1)) diff --git a/2022/day24.py b/2022/day24.py index 975f178..6ea76b9 100644 --- a/2022/day24.py +++ b/2022/day24.py @@ -1,5 +1,3 @@ -# -*- encoding: utf-8 -*- - import heapq import math import sys diff --git a/2022/day25.py b/2022/day25.py index 553141a..4327247 100644 --- a/2022/day25.py +++ b/2022/day25.py @@ -1,5 +1,3 @@ -# -*- encoding: utf-8 -*- - import sys lines = sys.stdin.read().splitlines() diff --git a/2022/day3.py b/2022/day3.py index eda40a1..b7740ed 100644 --- a/2022/day3.py +++ b/2022/day3.py @@ -1,5 +1,3 @@ -# -*- encoding: utf-8 -*- - import string import sys @@ -13,7 +11,7 @@ priorities = {c: i + 1 for i, c in enumerate(string.ascii_letters)} # part 1 part1 = sum(priorities[c] for p1, p2 in parts for c in p1.intersection(p2)) -print(f"score 1 is {part1}") +print(f"answer 1 is {part1}") # part 2 n_per_group = 3 @@ -22,4 +20,4 @@ part2 = sum( for i in range(0, len(lines), n_per_group) for c in set(lines[i]).intersection(*lines[i + 1 : i + n_per_group]) ) -print(f"score 2 is {part2}") +print(f"answer 2 is {part2}") diff --git a/2022/day4.py b/2022/day4.py index efc98b3..bf6aae1 100644 --- a/2022/day4.py +++ b/2022/day4.py @@ -1,5 +1,3 @@ -# -*- encoding: utf-8 -*- - import sys lines = [line.strip() for line in sys.stdin.readlines()] @@ -12,8 +10,8 @@ def make_range(value: str) -> set[int]: sections = [tuple(make_range(part) for part in line.split(",")) for line in lines] -score_1 = sum(s1.issubset(s2) or s2.issubset(s1) for s1, s2 in sections) -print(f"score 1 is {score_1}") +answer_1 = sum(s1.issubset(s2) or s2.issubset(s1) for s1, s2 in sections) +print(f"answer 1 is {answer_1}") -score_2 = sum(bool(s1.intersection(s2)) for s1, s2 in sections) -print(f"score 1 is {score_2}") +answer_2 = sum(bool(s1.intersection(s2)) for s1, s2 in sections) +print(f"answer 1 is {answer_2}") diff --git a/2022/day5.py b/2022/day5.py index 0e53a44..04ba94f 100644 --- a/2022/day5.py +++ b/2022/day5.py @@ -1,5 +1,3 @@ -# -*- encoding: utf-8 -*- - import copy import sys diff --git a/2022/day6.py b/2022/day6.py index abc67ad..086f33e 100644 --- a/2022/day6.py +++ b/2022/day6.py @@ -1,5 +1,3 @@ -# -*- encoding: utf-8 -*- - import sys diff --git a/2022/day7.py b/2022/day7.py index 128a300..c95e1b9 100644 --- a/2022/day7.py +++ b/2022/day7.py @@ -1,5 +1,3 @@ -# -*- encoding: utf-8 -*- - import sys from pathlib import Path diff --git a/2022/day8.py b/2022/day8.py index bc02123..ee75ede 100644 --- a/2022/day8.py +++ b/2022/day8.py @@ -1,8 +1,7 @@ -# -*- encoding: utf-8 -*- - import sys import numpy as np +from numpy.typing import NDArray lines = sys.stdin.read().splitlines() @@ -27,7 +26,7 @@ answer_1 = (highest_trees.min(axis=2) < trees).sum() print(f"answer 1 is {answer_1}") -def viewing_distance(row_of_trees: np.ndarray, value: int) -> int: +def viewing_distance(row_of_trees: NDArray[np.int_], value: int) -> int: w = np.where(row_of_trees >= value)[0] if not w.size: diff --git a/2022/day9.py b/2022/day9.py index cd84ffb..f81ec93 100644 --- a/2022/day9.py +++ b/2022/day9.py @@ -1,12 +1,9 @@ -# -*- encoding: utf-8 -*- - import sys import numpy as np def move(head: tuple[int, int], command: str) -> tuple[int, int]: - h_col, h_row = head if command == "L": @@ -22,7 +19,6 @@ def move(head: tuple[int, int], command: str) -> tuple[int, int]: def follow(head: tuple[int, int], tail: tuple[int, int]) -> tuple[int, int]: - h_col, h_row = head t_col, t_row = tail @@ -33,8 +29,7 @@ def follow(head: tuple[int, int], tail: tuple[int, int]) -> tuple[int, int]: def run(commands: list[str], n_blocks: int) -> list[tuple[int, int]]: - - blocks = [(0, 0) for _ in range(n_blocks)] + blocks: list[tuple[int, int]] = [(0, 0) for _ in range(n_blocks)] visited = [blocks[-1]] for command in commands: