diff --git a/2025-python/output/day_10.py b/2025-python/output/day_10.py index c33f965..25cda24 100644 --- a/2025-python/output/day_10.py +++ b/2025-python/output/day_10.py @@ -1,4 +1,6 @@ import re +import functools +from math import gcd, inf from pprint import pprint from collections import deque, Counter, defaultdict from heapq import heappop, heappush @@ -10,21 +12,49 @@ from output import matrix, D, DD, ADJ, ints, sints, mhd, mdbg, vdbg, cw, ccw, bk def solve(data): r = r"^\[(.+)\] (.+) \{(.+)\}$" p1 = 0 + p2 = 0 for line in data.splitlines(): - il, b, _j = re.findall(r, line)[0] + il, b, j = re.findall(r, line)[0] B = [set(ints(s)) for s in b.split()] E = set([i for i, s in enumerate(il) if s == "#"]) - Q = [(b, set(), 0) for b in B] - while Q: - b, lit, p = Q.pop(0) - if lit == E: - p1 += p - break - for nb in B: - if nb == b: + j = tuple(ints(j)) + + p = 0 + L = set() + while L != E: + p += 1 + for bp in combinations(B, p): + L = set() + for b in bp: + L = L ^ b + if L == E: + break + if L == E: + break + p1 += p + + @functools.cache + def _press(T): + if not any(T): + return 0 + L = set(i for i, s in enumerate(T) if s % 2 == 1) + R = inf + for p in [bb for ii, bb in enumerate(B) if ii in L]: + tt = list(T) + for b in p: + for i in b: + tt[i] -= 1 + if any(j < 0 for j in tt): continue - Q.append((nb, lit ^ b, p + 1)) - p2 = None + Th = tuple(j // 2 for j in tt) + n = _press(Th) + if n is None: + continue + R = min(R, len(p) + 2 * n) + return R + + p2 = _press(j) + return p1, p2 @@ -42,17 +72,17 @@ if __name__ == "__main__": # uncomment to use AoC provided puzzle input with open("./input/10.txt", "r") as f: - inp = f.read().strip() + in_p = f.read().strip() # uncomment to do initial data processing shared by part 1-2 p1, p2 = solve(inp) print(p1) os.system(f"echo {p1} | wl-copy") - # print(p2) - # os.system(f"echo {p2} | wl-copy") + print(p2) + os.system(f"echo {p2} | wl-copy") # uncomment and replace 0 with actual output to refactor code # and ensure nonbreaking changes - # assert p1 == 0 - # assert p2 == 0 + # assert p1 == 466 + # assert p2 == 17214