From ef213fd0c871fc871f758941298ad839f998dc21 Mon Sep 17 00:00:00 2001 From: Tomasz Kramkowski Date: Wed, 13 Dec 2023 14:32:28 +0000 Subject: day 13 --- 13.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 13.py (limited to '13.py') diff --git a/13.py b/13.py new file mode 100644 index 0000000..2538e53 --- /dev/null +++ b/13.py @@ -0,0 +1,35 @@ +# pyright: strict +from collections.abc import Iterable +from functools import cache +from sys import stdin + + +@cache +def rocks_to_int(bits: Iterable[str]) -> int: + return sum(2**i for i, bit in enumerate(bits) if bit == "#") + + +@cache +def diff(nums: tuple[int], cut: int) -> int: + return sum( + (nums[a] ^ nums[b]).bit_count() + for a, b in zip(range(cut - 1, -1, -1), range(cut, len(nums))) + ) + + +def find_mirror(nums: tuple[int, ...], difference: int) -> int: + for n in range(1, len(nums)): + if diff(nums, n) == difference: + return n + return 0 + + +p1 = p2 = 0 +for pattern in stdin.read().rstrip("\n").split("\n\n"): + pattern = pattern.split("\n") + rows = tuple(map(rocks_to_int, pattern)) + cols = tuple(map(rocks_to_int, zip(*pattern))) + p1 += find_mirror(cols, 0) or find_mirror(rows, 0) * 100 + p2 += find_mirror(cols, 1) or find_mirror(rows, 1) * 100 + +print(p1, p2, sep="\n") -- cgit v1.2.3-54-g00ecf