Signed-off-by: Amneesh Singh <natto@weirdnatto.in>
This commit is contained in:
2024-12-13 20:05:34 +05:30
parent 94ad51eb31
commit 2cb456a7c4
2 changed files with 75 additions and 0 deletions

View File

@@ -102,3 +102,9 @@ executable day12
hs-source-dirs: src
main-is: Day12.hs
build-depends: containers
executable day13
import: common
hs-source-dirs: src
main-is: Day13.hs
build-depends: libaoc

69
src/Day13.hs Normal file
View File

@@ -0,0 +1,69 @@
module Main where
import qualified AoC as A (extract)
import Control.Monad (void)
import Text.Parsec (digit, eof, many1, newline, parse, sepBy1, string, try, (<|>))
import Text.Parsec.String (Parser)
type Pair = (Int, Int)
type Conf = (Pair, Pair, Pair)
parseConfs :: Parser [Conf]
parseConfs = parseConf `sepBy1` newline
where
parseConf :: Parser Conf
parseConf = do
ax <- string "Button A: X+" *> (read <$> many1 digit)
ay <- string ", Y+" *> (read <$> many1 digit)
_ <- newline
bx <- string "Button B: X+" *> (read <$> many1 digit)
by <- string ", Y+" *> (read <$> many1 digit)
_ <- newline
px <- string "Prize: X=" *> (read <$> many1 digit)
py <- string ", Y=" *> (read <$> many1 digit)
try (void newline <|> eof)
return ((ax, ay), (bx, by), (px, py))
-- the matrix is never singular somehow, wtf aoc!
soln :: Conf -> Maybe (Int, Int)
soln ((ax, ay), (bx, by), (cx, cy))
| det == 0 = error "Singular Matrix Encountered, |A| = 0"
| (b, 0) <- (cy * ax - cx * ay) `quotRem` det, -- remainder 0 for integer solns
(a, 0) <- (cy - by * b) `quotRem` ay =
Just (a, b)
| otherwise = Nothing
where
det = ax * by - bx * ay
part1 :: [Conf] -> Int
part1 confs =
sum
[ 3 * a + b
| conf <- confs,
Just (a, b) <- [soln conf],
a <= 100 && b <= 100
]
transform :: Conf -> Conf
transform (a, b, (x, y)) = (a, b, (x + 10000000000000, y + 10000000000000))
part2 :: [Conf] -> Int
part2 confs =
sum
[ 3 * a + b
| conf <- map transform confs,
Just (a, b) <- [soln conf]
]
main :: IO ()
main =
do
raw <- readFile "./inputs/day13.in"
let confs = A.extract $ parse parseConfs "" raw
putStr "Part 1: " >> print (part1 confs)
putStr "Part 2: " >> print (part2 confs)