Files
AoC2023/day04.hs
2023-12-05 16:13:40 +05:30

51 lines
1.0 KiB
Haskell

import Data.Either (rights)
import Data.List (intersect)
import Data.Text qualified as T
import Lib (readFile')
import Text.Parsec
parser :: (Stream s m Char) => ParsecT s u m ([Int], [Int])
parser =
do
card <- string "Card" *> many1 space *> many1 digit <* char ':'
many1 space
winning <- many digit `sepBy` many1 space
char '|'
many1 space
mine <- many digit `sepBy` many1 space
return (read <$> init winning, read <$> mine)
main :: IO ()
main = do
input <- T.lines <$> readFile' "day04.in"
let parsed = rights . map (parse parser "") $ input
putStr "Q1: "
print
. sum
. map
( (\x -> if x < 0 then 0 else 2 ^ x)
. flip (-) 1
. length
. uncurry intersect
)
$ parsed
putStr "Q2: "
print
. sum
. consequence
. map
( \(x, y) ->
length $
intersect x y
)
$ parsed
where
consequence :: [Int] -> [Int]
consequence [] = []
consequence (x : xs) =
let xs' = consequence xs
in 1 + sum (take x xs') : xs'