import Data.List.Split import qualified Data.Map as M import Data.Ratio main :: IO () main = do content <- parseContent <$> readFile "testinput1" print content parseContent :: String -> M.Map String [(String, Ratio Int)] parseContent = M.fromList . map (parseRecipe . splitOn " => ") . lines parseRecipe :: [String] -> (String, [(String,Ratio Int)]) parseRecipe r = (result,ingredients) where parseIngredients = map (splitOn " ") . splitOn ", " left = parseIngredients $ head r right = concat $ parseIngredients $ last r result = last right resultDenom = read $ head right :: Int processIngredient n ing = (last ing,read (head ing) % n) ingredients = map (processIngredient resultDenom) left part1 :: M.Map String [(String, Ratio Int)] -> (String,Ratio Int) -> Ratio Int part1 _ ("ORE",x) = x part1 m (key,x) = x * sum (map (part1 m) (m M.! key))