From a0c525538d91e36996b32e280d0f4ef50c22636e Mon Sep 17 00:00:00 2001 From: Misaka Mikoto <4C2BOA6SRQM4VM4I6RNIKOM6W@cybercat.cc> Date: Wed, 9 Dec 2020 08:46:51 +0200 Subject: [PATCH] 2nd part --- 2020/7-2.hs | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 2020/7-2.hs diff --git a/2020/7-2.hs b/2020/7-2.hs new file mode 100644 index 0000000..5b9d9c2 --- /dev/null +++ b/2020/7-2.hs @@ -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"