-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday04.hs
50 lines (45 loc) · 1.05 KB
/
day04.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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'