2nd part
This commit is contained in:
parent
76ff0f8047
commit
a0c525538d
|
@ -0,0 +1,48 @@
|
|||
import Text.Parsec
|
||||
import Text.Parsec.Char
|
||||
import Data.List
|
||||
|
||||
contain
|
||||
= do { num <- many1 digit;
|
||||
many1 space;
|
||||
x <- many1 letter;
|
||||
many1 space;
|
||||
y <- many1 letter;
|
||||
many1 space;
|
||||
if num == "1" then
|
||||
string "bag"
|
||||
else
|
||||
string "bags";
|
||||
return (x ++ " " ++ y, read num :: Integer);
|
||||
}
|
||||
|
||||
line
|
||||
= do { x <- many1 letter;
|
||||
many1 space;
|
||||
y <- many1 letter;
|
||||
many1 space;
|
||||
string "bags contain";
|
||||
many1 space;
|
||||
z <- do { rcar <- contain;
|
||||
rcdr <- many $ (string "," >> many space >> contain);
|
||||
return $ rcar:rcdr;
|
||||
} <|> (string "no other bags" >> return []);
|
||||
char '.';
|
||||
return (x ++ " " ++ y, z)
|
||||
}
|
||||
|
||||
p
|
||||
= many1 $ line >>= \x -> many1 space >> return x
|
||||
|
||||
calc :: [(String, [(String, Integer)])]
|
||||
-> String
|
||||
-> Integer
|
||||
calc dict target
|
||||
= case lookup target dict of
|
||||
Just lst -> sum $ map (\(s, i) -> i + i * calc dict s) lst
|
||||
Nothing -> error ""
|
||||
|
||||
main
|
||||
= readFile "7" >>= \x -> putStrLn $ case runParser p () "7" x of
|
||||
Left err -> show err
|
||||
Right x -> show $ calc x "shiny gold"
|
Loading…
Reference in New Issue