Compare commits

...

2 commits

Author SHA1 Message Date
01bfcc1351 . 2025-12-11 23:36:38 +01:00
044df24990 Solve 2025 day 11 pt 1-2
For p1 a BFS algorithm is fast enough. For pt 2,
for the third day in a row, it did not work.

I caved in and used recursion and memoisation for
DFS instead, instantly fast as lightning.

I finished by making the pt 2 code compatible with
pt 1.
2025-12-11 21:42:15 +01:00
3 changed files with 102 additions and 34 deletions

View file

@ -1,6 +1,5 @@
from math import inf from math import inf
from itertools import combinations from itertools import combinations
from output import ints from output import ints
@ -42,43 +41,59 @@ def solve(data):
break break
S = E S = E
V = V | W V = V | W
def _within(a, b):
y1, x1 = a
y2, x2 = b
T = min(y1, y2)
R = max(x1, x2)
B = max(y1, y2)
L = min(x1, x2)
return all([
sum((r, L + 1) in W for r in range(T + 1, B)) % 2 == 0,
sum((r, R - 1) in W for r in range(T + 1, B)) % 2 == 0,
sum((T + 1, c) in W for c in range(L + 1, R)) % 2 == 0,
sum((B - 1, c) in W for c in range(L + 1, R)) % 2 == 0,
])
S = len(list(combinations(A, r=2)))
i = 0
for a, b in combinations(A, r=2): for a, b in combinations(A, r=2):
i += 1
if i % 100 == 0:
print(f"{str(i):>6} / {S}")
y1, x1 = a y1, x1 = a
y2, x2 = b y2, x2 = b
x = abs(x1 - x2) + 1 x = abs(x1 - x2) + 1
y = abs(y1 - y2) + 1 y = abs(y1 - y2) + 1
p1 = max(p1, x * y) p1 = max(p1, x * y)
if _within(W, a, b, T, R, B, L): if _within(a, b):
p2 = max(p2, max(p2, x * y)) p2 = max(p2, max(p2, x * y))
return p1, p2 return p1, p2
def _within(W, a, b, T, R, B, L):
y1, x1 = a
y2, x2 = b
for r in range(min(y1, y2) + 1, max(y1, y2)):
for c in range(min(x1, x2) + 1, max(x1, x2)):
if (r, c) in W:
continue
for s, e in [(T, r), (r, B)]:
z = sum((nr, c) in W for nr in range(s, e))
if z and z % 2 == 0:
return False
for s, e in [(L, c), (c, R)]:
z = sum((r, nc) in W for nc in range(s, e))
if z and z % 2 == 0:
return False
return True
if __name__ == "__main__": if __name__ == "__main__":
with open("./input/09.txt", "r") as f: with open("./input/09.txt", "r") as f:
inp = f.read().strip() inp = f.read().strip()
in_p = """
7,1
11,1
11,7
9,7
9,5
2,5
2,3
7,3 """.strip()
p1, p2 = solve(inp) p1, p2 = solve(inp)
print(p1) print(p1)
print(p2) print(p2)
assert p1 == 4749838800 assert p1 == 50
assert p2 == 1624057680 assert p2 == 24
# assert p1 == 4749838800
# assert p2 == 1624057680

View file

@ -1,4 +1,6 @@
import re import re
import functools
from math import inf
from pprint import pprint from pprint import pprint
from collections import deque, Counter, defaultdict from collections import deque, Counter, defaultdict
from heapq import heappop, heappush from heapq import heappop, heappush
@ -10,20 +12,38 @@ from output import matrix, D, DD, ADJ, ints, sints, mhd, mdbg, vdbg, cw, ccw, bk
def solve(data): def solve(data):
r = r"^\[(.+)\] (.+) \{(.+)\}$" r = r"^\[(.+)\] (.+) \{(.+)\}$"
p1 = 0 p1 = 0
for line in data.splitlines():
il, b, _j = re.findall(r, line)[0] for j, line in enumerate(data.splitlines(), start=1):
il, b, j = re.findall(r, line)[0]
B = [set(ints(s)) for s in b.split()] B = [set(ints(s)) for s in b.split()]
E = set([i for i, s in enumerate(il) if s == "#"]) E = set([i for i, s in enumerate(il) if s == "#"])
Q = [(b, set(), 0) for b in B] J = ints(j)
while Q:
b, lit, p = Q.pop(0) p = 0
if lit == E: L = set()
p1 += p while L != E:
break p += 1
for nb in B: for bp in combinations(B, p):
if nb == b: L = set()
continue for b in bp:
Q.append((nb, lit ^ b, p + 1)) L = L ^ b
if L == E:
break
if L == E:
break
# p = 0
# L = [0] * len(J)
# while L != J:
# 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
p2 = None p2 = None
return p1, p2 return p1, p2
@ -49,8 +69,8 @@ if __name__ == "__main__":
print(p1) print(p1)
os.system(f"echo {p1} | wl-copy") os.system(f"echo {p1} | wl-copy")
# print(p2) print(p2)
# os.system(f"echo {p2} | wl-copy") os.system(f"echo {p2} | wl-copy")
# uncomment and replace 0 with actual output to refactor code # uncomment and replace 0 with actual output to refactor code
# and ensure nonbreaking changes # and ensure nonbreaking changes

View file

@ -0,0 +1,33 @@
import functools
from collections import defaultdict
def solve(data):
G = defaultdict(list)
for line in data.splitlines():
f, *t = line.split()
G[f[:-1]] = t
@functools.cache
def _traverse(k, fasttrack=True, fft=False, dac=False):
if k == "out":
return fasttrack or (fft and dac)
return sum(
_traverse(nk, fasttrack, fft or k == "fft", dac or k == "dac")
for nk in G[k]
)
return _traverse("you"), _traverse("svr", fasttrack=False)
if __name__ == "__main__":
with open("./input/11.txt", "r") as f:
inp = f.read().strip()
p1, p2 = solve(inp)
print(p1)
print(p2)
assert p1 == 649
assert p2 == 458948453421420