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:
*) on two parts:
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; }
https://github.com/sjmulder/aoc/blob/master/2024/c/day13.c
Line intersection is a nice way of looking at it. My immediate thought was “change of basis”.