summary refs log tree commit diff
path: root/4/2.hs
blob: b728231c678f7d302bf302b71a19723560bad32b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import Prelude
import Text.Parsec.String (Parser)
import Text.Parsec
import System.Environment
import Control.Monad
import qualified Data.Set as S
import Data.Maybe

type Card = (S.Set Int, S.Set Int)

numbers = S.fromList <$> ((many1 space) *> sepEndBy (read <$> many1 digit) (many1 space))

card :: Parser Card
card = string "Card" *> spaces *> many1 digit *> char ':' *> liftM2 (,) (numbers <* (char '|')) numbers

cards = many1 card

solution :: [Card] -> Int
solution = sum . map (+1) . foldr f [] where
    f (picked,winning) ws = w : ws where
        m = length $ S.intersection picked winning
        w = m + sum (take m ws)

main = liftM2 (>>=) readFile (((print . solution . either (error.show) id) .) . parse cards) =<< head <$> getArgs