2025 #5

Open
aey wants to merge 16 commits from 2025 into main
3 changed files with 72 additions and 37 deletions
Showing only changes of commit 01bfcc1351 - Show all commits

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:
p += 1
for bp in combinations(B, p):
L = set()
for b in bp:
L = L ^ b
if L == E:
break break
for nb in B: if L == E:
if nb == b: break
continue # p = 0
Q.append((nb, lit ^ b, p + 1)) # 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

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