Compare commits

..

4 commits

Author SHA1 Message Date
a585a687c9 . 2026-01-10 23:39:39 +01:00
050429ce6c Solve 2025 day 12 pt 1-2
Got this one ruined due to a post not masking
spoilers:

https://www.reddit.com/r/adventofcode/comments/1pkxibs/2025_day_25_part_1_still_pretty_clueless_why_its/

Basically, ignore the test case and just wing it by
asuming the 3x3 can be placed without overlaps. Id
the number of shapes * 3x3 is bigger than the available
canvas, it won't fit.

A naive first check to do before making premature
optimizations.

I would have gone the zip() hell route to prove
it actually works, but after grasping at the puzzle
input i realized it would tka a looong time to
calculate.
2025-12-14 23:17:18 +01:00
9e97c8e2b4 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-14 23:09:08 +01:00
eda78750a8 Solve 2025 day 10 pt 1 2025-12-14 23:08:55 +01:00
3 changed files with 54 additions and 59 deletions

View file

@ -1,5 +1,6 @@
from math import inf from math import inf
from itertools import combinations from itertools import combinations
from output import ints from output import ints
@ -41,59 +42,43 @@ 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(a, b): if _within(W, a, b, T, R, B, L):
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 == 50 assert p1 == 4749838800
assert p2 == 24 assert p2 == 1624057680
# assert p1 == 4749838800
# assert p2 == 1624057680

View file

@ -1,6 +1,6 @@
import re import re
import functools import functools
from math import inf from math import gcd, 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
@ -12,12 +12,12 @@ 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
p2 = 0
for j, line in enumerate(data.splitlines(), start=1): 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()] 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 == "#"])
J = ints(j) j = tuple(ints(j))
p = 0 p = 0
L = set() L = set()
@ -31,20 +31,30 @@ def solve(data):
break break
if L == E: if L == E:
break 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 p1 += p
p2 = None
@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
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 return p1, p2
@ -62,7 +72,7 @@ if __name__ == "__main__":
# uncomment to use AoC provided puzzle input # uncomment to use AoC provided puzzle input
with open("./input/10.txt", "r") as f: 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 # uncomment to do initial data processing shared by part 1-2
p1, p2 = solve(inp) p1, p2 = solve(inp)
@ -74,5 +84,5 @@ if __name__ == "__main__":
# 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
# assert p1 == 0 # assert p1 == 466
# assert p2 == 0 # assert p2 == 17214

View file

@ -3,10 +3,10 @@ from collections import defaultdict
def solve(data): def solve(data):
G = defaultdict(list) G = defaultdict(set)
for line in data.splitlines(): for line in data.splitlines():
f, *t = line.split() f, *t = line.split()
G[f[:-1]] = t G[f[:-1]] = set(t)
@functools.cache @functools.cache
def _traverse(k, fasttrack=True, fft=False, dac=False): def _traverse(k, fasttrack=True, fft=False, dac=False):
@ -15,7 +15,7 @@ def solve(data):
return sum( return sum(
_traverse(nk, fasttrack, fft or k == "fft", dac or k == "dac") _traverse(nk, fasttrack, fft or k == "fft", dac or k == "dac")
for nk in G[k] for nk in G[k]
) )
return _traverse("you"), _traverse("svr", fasttrack=False) return _traverse("you"), _traverse("svr", fasttrack=False)