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

  • @VegOwOtenks
    link
    English
    4
    edit-2
    17 hours ago

    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)