aoc

Advent of Code
git clone https://git.pngu.org/aoc
Log | Files | Refs | README

10_2025.py (1407B)


import z3

input = open("data/10_2025.txt")
data = input.read().splitlines()
p1, p2 = 0, 0

for i in data:
    words = i.split()
    goal = words[0]
    goal = goal[1:-1]
    goal_n = 0
    for j, k in enumerate(goal):
        if k == "#":
            goal_n += 2**j

    buttons = words[1:-1]
    b, ns = [], []

    for j in buttons:
        n = [int(x) for x in j[1:-1].split(",")]
        button_n = sum(2**x for x in n)
        b.append(button_n)
        ns.append(n)

    score = len(buttons)
    for j in range(2 ** len(buttons)):
        a_n, a_score = 0, 0
        for k in range(len(buttons)):
            if ((j >> k) % 2) == 1:
                a_n ^= b[k]
                a_score += 1
        if a_n == goal_n:
            score = min(score, a_score)
    p1 += score
    joltage = words[-1]
    joltage_ns = [int(x) for x in joltage[1:-1].split(",")]
    v = []
    for j in range(len(buttons)):
        v.append(z3.Int(f"b{j}"))
    eq = []
    for j in range(len(joltage_ns)):
        terms = []
        for k in range(len(buttons)):
            if j in ns[k]:
                terms.append(v[k])
        eq_n = sum(terms) == joltage_ns[j]
        eq.append(eq_n)
    o = z3.Optimize()
    o.minimize(sum(v))
    for j in eq:
        o.add(j)
    for j in v:
        o.add(j >= 0)
    assert o.check()
    m = o.model()
    for j in m.decls():
        p2 += m[j].as_long()

print(p1)
print(p2)