27 lines
920 B
Haskell
27 lines
920 B
Haskell
|
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))
|