summary refs log tree commit diff
path: root/4/1.hs
diff options
context:
space:
mode:
Diffstat (limited to '4/1.hs')
-rw-r--r--4/1.hs23
1 files changed, 23 insertions, 0 deletions
diff --git a/4/1.hs b/4/1.hs
new file mode 100644
index 0000000..275a04c
--- /dev/null
+++ b/4/1.hs
@@ -0,0 +1,23 @@
+import Prelude
+import Text.Parsec.String (Parser)
+import Text.Parsec
+import System.Environment
+import Control.Monad
+import qualified Data.Set as S
+
+type Card = (Int, S.Set Int, S.Set Int)
+
+numbers = S.fromList <$> ((many1 space) *> sepEndBy (read <$> many1 digit) (many1 space))
+
+card :: Parser Card
+card = (,,) <$> (string "Card" *> spaces *> (read <$> many1 digit) <* char ':') <*> numbers <* (char '|') <*> numbers
+
+cards = many1 card
+
+solution :: [Card] -> Int
+solution xs = sum $ map f xs where 
+    f (id,picked,winning) = case (length $ S.intersection picked winning) of
+        0 -> 0
+        n -> 2 ^ (pred n)
+
+main = liftM2 (>>=) readFile (((print . solution . either (error.show) id) .) . parse cards) =<< head <$> getArgs
\ No newline at end of file