Compare commits

..

No commits in common. "01bfcc1351f5a99d667fd9a929208f79f665c845" and "0723a8223f466c82398b30306e82ab63d56e1a39" have entirely different histories.

3 changed files with 34 additions and 102 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,4 @@
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
@ -12,38 +10,20 @@ 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():
for j, line in enumerate(data.splitlines(), start=1): 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) Q = [(b, set(), 0) for b in B]
while Q:
p = 0 b, lit, p = Q.pop(0)
L = set() if lit == E:
while L != E: p1 += p
p += 1 break
for bp in combinations(B, p): for nb in B:
L = set() if nb == b:
for b in bp: continue
L = L ^ b Q.append((nb, lit ^ b, p + 1))
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
@ -69,8 +49,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

@ -1,33 +0,0 @@
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