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
This commit is contained in:
parent
19aee1363a
commit
1e807b5daf
2 changed files with 40 additions and 2 deletions
|
|
@ -25,11 +25,13 @@ def solve(data):
|
||||||
areas += 1
|
areas += 1
|
||||||
y, x = rc
|
y, x = rc
|
||||||
for dy, dx in D:
|
for dy, dx in D:
|
||||||
if (0 <= y + dy < H and 0 <= x + dx <W) and grid[y + dy][x + dx] == col:
|
if (0 <= y + dy < H and 0 <= x + dx < W) and grid[y + dy][
|
||||||
|
x + dx
|
||||||
|
] == col:
|
||||||
q.append((y + dy, x + dx))
|
q.append((y + dy, x + dx))
|
||||||
else:
|
else:
|
||||||
perimeters += 1
|
perimeters += 1
|
||||||
p1 += areas*perimeters
|
p1 += areas * perimeters
|
||||||
p2 = None
|
p2 = None
|
||||||
return p1, p2
|
return p1, p2
|
||||||
|
|
||||||
|
|
|
||||||
36
2024-python/output/day_13.py
Normal file
36
2024-python/output/day_13.py
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
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)
|
||||||
Loading…
Add table
Reference in a new issue