4 changed files with 1406 additions and 0 deletions
@ -0,0 +1,80 @@ |
|||||
|
--- Day 13: Claw Contraption --- |
||||
|
|
||||
|
Next up: the lobby of a resort on a tropical island. The Historians take a moment to admire the hexagonal floor tiles before spreading out. |
||||
|
|
||||
|
Fortunately, it looks like the resort has a new arcade! Maybe you can win some prizes from the claw machines? |
||||
|
|
||||
|
The claw machines here are a little unusual. Instead of a joystick or directional buttons to control the claw, these machines have two buttons labeled A and B. Worse, you can't just put in a token and play; it costs 3 tokens to push the A button and 1 token to push the B button. |
||||
|
|
||||
|
With a little experimentation, you figure out that each machine's buttons are configured to move the claw a specific amount to the right (along the X axis) and a specific amount forward (along the Y axis) each time that button is pressed. |
||||
|
|
||||
|
Each machine contains one prize; to win the prize, the claw must be positioned exactly above the prize on both the X and Y axes. |
||||
|
|
||||
|
You wonder: what is the smallest number of tokens you would have to spend to win as many prizes as possible? You assemble a list of every machine's button behavior and prize location (your puzzle input). For example: |
||||
|
|
||||
|
Button A: X+94, Y+34 |
||||
|
Button B: X+22, Y+67 |
||||
|
Prize: X=8400, Y=5400 |
||||
|
|
||||
|
Button A: X+26, Y+66 |
||||
|
Button B: X+67, Y+21 |
||||
|
Prize: X=12748, Y=12176 |
||||
|
|
||||
|
Button A: X+17, Y+86 |
||||
|
Button B: X+84, Y+37 |
||||
|
Prize: X=7870, Y=6450 |
||||
|
|
||||
|
Button A: X+69, Y+23 |
||||
|
Button B: X+27, Y+71 |
||||
|
Prize: X=18641, Y=10279 |
||||
|
|
||||
|
This list describes the button configuration and prize location of four different claw machines. |
||||
|
|
||||
|
For now, consider just the first claw machine in the list: |
||||
|
|
||||
|
Pushing the machine's A button would move the claw 94 units along the X axis and 34 units along the Y axis. |
||||
|
Pushing the B button would move the claw 22 units along the X axis and 67 units along the Y axis. |
||||
|
The prize is located at X=8400, Y=5400; this means that from the claw's initial position, it would need to move exactly 8400 units along the X axis and exactly 5400 units along the Y axis to be perfectly aligned with the prize in this machine. |
||||
|
|
||||
|
The cheapest way to win the prize is by pushing the A button 80 times and the B button 40 times. This would line up the claw along the X axis (because 80*94 + 40*22 = 8400) and along the Y axis (because 80*34 + 40*67 = 5400). Doing this would cost 80*3 tokens for the A presses and 40*1 for the B presses, a total of 280 tokens. |
||||
|
|
||||
|
For the second and fourth claw machines, there is no combination of A and B presses that will ever win a prize. |
||||
|
|
||||
|
For the third claw machine, the cheapest way to win the prize is by pushing the A button 38 times and the B button 86 times. Doing this would cost a total of 200 tokens. |
||||
|
|
||||
|
So, the most prizes you could possibly win is two; the minimum tokens you would have to spend to win all (two) prizes is 480. |
||||
|
|
||||
|
You estimate that each button would need to be pressed no more than 100 times to win a prize. How else would someone be expected to play? |
||||
|
|
||||
|
Figure out how to win as many prizes as possible. What is the fewest tokens you would have to spend to win all possible prizes? |
||||
|
|
||||
|
Your puzzle answer was 37128. |
||||
|
--- Part Two --- |
||||
|
|
||||
|
As you go to win the first prize, you discover that the claw is nowhere near where you expected it would be. Due to a unit conversion error in your measurements, the position of every prize is actually 10000000000000 higher on both the X and Y axis! |
||||
|
|
||||
|
Add 10000000000000 to the X and Y position of every prize. After making this change, the example above would now look like this: |
||||
|
|
||||
|
Button A: X+94, Y+34 |
||||
|
Button B: X+22, Y+67 |
||||
|
Prize: X=10000000008400, Y=10000000005400 |
||||
|
|
||||
|
Button A: X+26, Y+66 |
||||
|
Button B: X+67, Y+21 |
||||
|
Prize: X=10000000012748, Y=10000000012176 |
||||
|
|
||||
|
Button A: X+17, Y+86 |
||||
|
Button B: X+84, Y+37 |
||||
|
Prize: X=10000000007870, Y=10000000006450 |
||||
|
|
||||
|
Button A: X+69, Y+23 |
||||
|
Button B: X+27, Y+71 |
||||
|
Prize: X=10000000018641, Y=10000000010279 |
||||
|
|
||||
|
Now, it is only possible to win a prize on the second and fourth claw machines. Unfortunately, it will take many more than 100 presses to do so. |
||||
|
|
||||
|
Using the corrected prize coordinates, figure out how to win as many prizes as possible. What is the fewest tokens you would have to spend to win all possible prizes? |
||||
|
|
||||
|
Your puzzle answer was 74914228471331. |
||||
|
|
||||
|
Both parts of this puzzle are complete! They provide two gold stars: ** |
@ -0,0 +1,32 @@ |
|||||
|
#!/usr/bin/env python3 |
||||
|
|
||||
|
import sys, re |
||||
|
from sympy import solve |
||||
|
from sympy.abc import x, y |
||||
|
|
||||
|
|
||||
|
def prizes(a, b, prize): |
||||
|
sols = solve([a[0] * x + b[0] * y - prize[0], a[1] * x + b[1] * y - prize[1]], x, y, dict=True) |
||||
|
if len(sols) > 1: print('help!', sols) |
||||
|
if int(sols[0][x]) != sols[0][x] or int(sols[0][y]) != sols[0][y]: return 0 |
||||
|
else: return 3*sols[0][x]+sols[0][y] |
||||
|
|
||||
|
|
||||
|
if __name__ == '__main__': |
||||
|
cms = open(sys.argv[1]).read().split('\n\n') |
||||
|
res1, res2 = 0, 0 |
||||
|
for cm in cms: |
||||
|
g = re.search(r'Button A: X\+(?P<xa>\d+), Y\+(?P<ya>\d+)\nButton B: X\+(?P<xb>\d+), Y\+(?P<yb>\d+)\nPrize: X=(?P<px>\d+), Y=(?P<py>\d+)', cm) |
||||
|
button_a = (int(g['xa']), int(g['ya'])) |
||||
|
button_b = (int(g['xb']), int(g['yb'])) |
||||
|
prize = (int(g['px']), int(g['py'])) |
||||
|
res1 += prizes(button_a, button_b, prize) |
||||
|
prize = (prize[0]+10000000000000, prize[1]+10000000000000) |
||||
|
res2 += prizes(button_a, button_b, prize) |
||||
|
|
||||
|
# challenge 1 |
||||
|
print(f"challenge 1:\n{res1}\n") |
||||
|
|
||||
|
# challenge 2 |
||||
|
print(f"challenge 2:\n{res2}") |
||||
|
|
@ -0,0 +1,15 @@ |
|||||
|
Button A: X+94, Y+34 |
||||
|
Button B: X+22, Y+67 |
||||
|
Prize: X=8400, Y=5400 |
||||
|
|
||||
|
Button A: X+26, Y+66 |
||||
|
Button B: X+67, Y+21 |
||||
|
Prize: X=12748, Y=12176 |
||||
|
|
||||
|
Button A: X+17, Y+86 |
||||
|
Button B: X+84, Y+37 |
||||
|
Prize: X=7870, Y=6450 |
||||
|
|
||||
|
Button A: X+69, Y+23 |
||||
|
Button B: X+27, Y+71 |
||||
|
Prize: X=18641, Y=10279 |
File diff suppressed because it is too large
Loading…
Reference in new issue