Compare commits
2 commits
0723a8223f
...
01bfcc1351
| Author | SHA1 | Date | |
|---|---|---|---|
| 01bfcc1351 | |||
| 044df24990 |
3 changed files with 102 additions and 34 deletions
|
|
@ -1,6 +1,5 @@
|
|||
from math import inf
|
||||
from itertools import combinations
|
||||
|
||||
from output import ints
|
||||
|
||||
|
||||
|
|
@ -42,43 +41,59 @@ def solve(data):
|
|||
break
|
||||
S = E
|
||||
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):
|
||||
i += 1
|
||||
if i % 100 == 0:
|
||||
print(f"{str(i):>6} / {S}")
|
||||
y1, x1 = a
|
||||
y2, x2 = b
|
||||
x = abs(x1 - x2) + 1
|
||||
y = abs(y1 - y2) + 1
|
||||
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))
|
||||
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__":
|
||||
with open("./input/09.txt", "r") as f:
|
||||
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)
|
||||
|
||||
print(p1)
|
||||
print(p2)
|
||||
|
||||
assert p1 == 4749838800
|
||||
assert p2 == 1624057680
|
||||
assert p1 == 50
|
||||
assert p2 == 24
|
||||
# assert p1 == 4749838800
|
||||
# assert p2 == 1624057680
|
||||
|
|
|
|||
|
|
@ -1,4 +1,6 @@
|
|||
import re
|
||||
import functools
|
||||
from math import inf
|
||||
from pprint import pprint
|
||||
from collections import deque, Counter, defaultdict
|
||||
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):
|
||||
r = r"^\[(.+)\] (.+) \{(.+)\}$"
|
||||
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()]
|
||||
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:
|
||||
continue
|
||||
Q.append((nb, lit ^ b, p + 1))
|
||||
J = 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
|
||||
# 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
|
||||
return p1, p2
|
||||
|
||||
|
|
@ -49,8 +69,8 @@ if __name__ == "__main__":
|
|||
|
||||
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
|
||||
|
|
|
|||
33
2025-python/output/day_11.py
Normal file
33
2025-python/output/day_11.py
Normal 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
|
||||
Loading…
Add table
Reference in a new issue