{-# OPTIONS -Wno-type-defaults #-} module Main where import Data.List import Data.Maybe import Input closing :: Char -> Maybe Char closing '(' = Just ')' closing '[' = Just ']' closing '{' = Just '}' closing '<' = Just '>' closing _ = Nothing score1 :: Char -> Int score1 ')' = 3 score1 ']' = 3 * 19 score1 '}' = 3^2 * 7 * 19 score1 '>' = 3^3 * 7^2 * 19 score1 _ = 0 score2 :: Char -> Int score2 = fromMaybe 0 . fmap succ . flip elemIndex ")]}>" data Result = SErr Char | Incomplete String | Ok deriving (Show) parse :: String -> Result parse = go [] where go s (c : cs) | Just cl <- closing c = go (cl : s) cs go (c:s) (c':cs) | c == c' = go s cs go _ (c:_) = SErr c go s [] = Incomplete s main :: IO () main = do inp <- getInput 10 print $ sum [score1 c | SErr c <- map parse inp] let middle l = sort l !! (length l `div` 2) print $ middle [sum (zipWith (*) (reverse $ map score2 s) (iterate (*5) 1)) | Incomplete s <- map parse inp]