advent-of-code/2024-python/output/day_13.py
Anders Englöf Ytterström 1e807b5daf Solve 2024:13 p1-2 "Claw Contraption"
Initial version of the code tried to solve pt 1
using BFS, which took way too long even for the
test data.

After some fiddling with algebra with pen and paper,
I realized this 2 formulaes (using first example):

94 * b1 + 22 * b2 == 840
34 * b1 + 67 * b2 == 540

*b1 = button A presses
*b2 = button B presses

... could be rewritten to this single expression:

(94 + 34) * b1 + (22 + 67) * b2 = 840 * 540

I failed to remember the algebra for solving x than
y though, that I had to learn from the subreddit.
In the code, this is the ratio part.

Also, this solution using fractions is SICK.
https://www.reddit.com/r/adventofcode/comments/1hd4wda/comment/m1tz3nf/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button
2025-01-05 00:06:18 +01:00

36 lines
935 B
Python

from output import ints
def solve(data):
offset = 10_000_000_000_000
machines = data.split("\n\n")
p1 = ratio(machines)
p2 = ratio(machines, offset)
return p1, p2
def ratio(machines, offset=0):
cost = 0
for mid, config in enumerate(machines):
a_x, a_y, b_x, b_y, goal_x, goal_y = ints(config)
goal_x, goal_y = goal_x + offset, goal_y + offset
ratio = (goal_x * a_y - goal_y * a_x) / (goal_y * b_x - goal_x * b_y)
a_presses = round(goal_x / (b_x * ratio + a_x))
b_presses = round(a_presses * ratio)
a_presses, b_presses = int(a_presses), int(b_presses)
if (a_x + a_y) * a_presses + (b_x + b_y) * b_presses == goal_x + goal_y:
cost += 3 * a_presses + b_presses
return cost
if __name__ == "__main__":
with open("./input/13.txt", "r") as f:
inp = f.read().strip()
p1, p2 = solve(inp)
print(p1)
print(p2)