Skip to content

Commit 8fc7062

Browse files
committed
Add solution to 2025-12-10
1 parent c7cb303 commit 8fc7062

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed

2025/day10/solutions.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import numpy as np
2+
from scipy.optimize import linprog
3+
from collections import deque
4+
5+
6+
with open("input") as f:
7+
ls = f.read().strip().split("\n")
8+
9+
tasks = []
10+
for l in ls:
11+
toggles, *buttons, counters = l.split()
12+
toggles = set(i for i, x in enumerate(toggles[1:-1]) if x == "#")
13+
moves = [set(map(int, b[1:-1].split(","))) for b in buttons]
14+
counters = tuple(map(int, counters[1:-1].split(",")))
15+
tasks.append((toggles, moves, counters))
16+
17+
18+
def solve1(goal, moves):
19+
q = deque()
20+
q.append((set(), 0))
21+
seen = set()
22+
while q:
23+
curr, steps = q.popleft()
24+
if curr == goal:
25+
return steps
26+
for m in moves:
27+
newset = curr ^ m
28+
if newset in seen:
29+
continue
30+
seen.add(frozenset(newset))
31+
q.append((newset, steps + 1))
32+
33+
34+
print(sum(solve1(goal, moves) for goal, moves, _ in tasks))
35+
36+
37+
# Part 2
38+
def solve2(goal, moves):
39+
c = np.ones(len(moves))
40+
A_eq = np.zeros((len(goal), len(moves)))
41+
b_eq = np.array(goal)
42+
for i in range(len(goal)):
43+
A_eq[i] = [i in m for m in moves]
44+
return linprog(c, A_eq=A_eq, b_eq=b_eq, integrality=True).fun
45+
46+
47+
print(sum(solve2(counters, moves) for _, moves, counters in tasks))

0 commit comments

Comments
 (0)