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

  • sjmulder@lemmy.sdf.org
    link
    fedilink
    English
    arrow-up
    2
    ·
    edit-2
    13 days ago

    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:

    1. how can you capture a two-dimensional problem in a linear equation (ans: use slopes), and
    2. 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;
    }
    

    https://github.com/sjmulder/aoc/blob/master/2024/c/day13.c

    • lwhjp@lemmy.sdf.org
      link
      fedilink
      arrow-up
      1
      ·
      13 days ago

      Line intersection is a nice way of looking at it. My immediate thought was “change of basis”.