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
You are viewing a single thread.
View all comments 4 points
*
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)