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

  • @Acters
    link
    2
    edit-2
    4 hours ago

    we are solving for y first. If there is a y then x is found easily.

    (Ax)*x + (Bx)*y = Px and (Ay)*x + (By)*y = Py

    Because of Ax or Ay and Bx or By, lets pretend that they are not (A*x)*x and (A*y)*y for both. they are just names. could be rewritten as: (Aleft)*x + (Bleft)*y = Pleft and (Aright)*x + (Bright)*y = Pright

    but I will keep them short. solving for y turns into this:

    y = (Ay*Px - Ax*Py) / (Ay*Bx - Ax*By)

    if mod of 1 is equal to 0 then there is a solution. We can be confident that x is also a solution, too. Could there be an edge case? I didn’t proof it, but it works flawlessly for my solution.

    Thankfully, divmod does both division and mod of 1 at the same time.

    • @[email protected]
      link
      fedilink
      1
      edit-2
      3 hours ago

      Thank you so much for your explanation! I kind of found some clues looking up perp dot products & other vector math things, but this breaks it down very nicely.

      I implemented your solution in rust, and part 2 failed by +447,761,194,259 (this was using signed 64-bit integers, i64). When I changed it to use signed 64 bit floating-point f64 and checked that the solution for x produces a whole number it worked.

      • @Acters
        link
        12 hours ago

        Did you run my python code as is? I would hope it works for everyone. though, I am unsure what the edge cases are, then.