Day 13: Claw Contraption
Megathread guidelines
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/6637268
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
C
“The cheapest way” “the fewest tokens”, that evil chap!
I’m on a weekend trip and thought to do the puzzle in the 3h train ride but I got silly stumped on 2D line intersection*, was too stubborn to look it up, and fell asleep 🤡
When I woke up, so did the little nugget of elementary algebra somewhere far in the back of my mind. Tonight I finally got to implementing, which was smooth sailing except for this lesson I learnt:
int64 friends don’t let int64 friends play with float32s.
*) on two parts:
- how can you capture a two-dimensional problem in a linear equation (ans: use slopes), and
- what unknown was I supposed to be finding? (ans: either x or y of intersection will do)
Code
#include "common.h"
static int64_t
score(int ax, int ay, int bx, int by, int64_t px, int64_t py)
{
int64_t a,b, x;
double as,bs;
as = (double)ay / ax;
bs = (double)by / bx;
/* intersection between a (from start) and b (from end) */
x = (int64_t)round((px*bs - py) / (bs-as));
a = x / ax;
b = (px-x) / bx;
return
a*ax + b*bx == px &&
a*ay + b*by == py ? a*3 + b : 0;
}
int
main(int argc, char **argv)
{
int ax,ay, bx,by;
int64_t p1=0,p2=0, px,py;
if (argc > 1)
DISCARD(freopen(argv[1], "r", stdin));
while (scanf(
" Button A: X+%d, Y+%d"
" Button B: X+%d, Y+%d"
" Prize: X=%"SCNd64", Y=%"SCNd64,
&ax, &ay, &bx, &by, &px, &py) == 6) {
p1 += score(ax,ay, bx,by, px,py);
p2 += score(ax,ay, bx,by,
px + 10000000000000LL,
py + 10000000000000LL);
}
printf("13: %"PRId64" %"PRId64"\n", p1, p2);
return 0;
}