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
Haskell
Pen and Paper solved these equations for me.
import Control.Arrow import qualified Data.Char as Char import qualified Data.List as List import qualified Data.Maybe as Maybe window6 :: [Int] -> [[Int]] window6 [] = [] window6 is = List.splitAt 6 >>> second window6 >>> uncurry (:) $ is parse :: String -> [[Int]] parse s = window6 . map read . words . List.filter ((Char.isDigit &&& Char.isSpace) >>> uncurry (||)) $ s solveEquation (ax:ay:bx:by:tx:ty:[]) transformT | (aNum `mod` aDenom) /= 0 = Nothing | (bNum `mod` bDenom) /= 0 = Nothing | otherwise = Just (abs $ aNum `div` aDenom, abs $ bNum `div` bDenom) where tx' = transformT tx ty' = transformT ty aNum = (bx*ty') - (by*tx') aDenom = (ax*by) - (bx*ay) bNum = (ax*ty') - (ay*tx') bDenom = (ax*by) - (bx*ay) part1 = map (flip solveEquation id) >>> Maybe.catMaybes >>> map (first (*3)) >>> map (uncurry (+)) >>> sum part2 = map (flip solveEquation (+ 10000000000000)) >>> Maybe.catMaybes >>> map (first (*3)) >>> map (uncurry (+)) >>> sum main = getContents >>= print . (part1 &&& part2) . parse
(Edit: coding style)