2017/7.hs

29 lines
923 B
Haskell

import Data.HashSet (Set, fromList, delete)
import Data.List.Split
type Weight = Int
type Program = String
type Programs = [Program]
discardEmpty :: [String] -> [String]
discardEmpty [""] = []
discardEmpty xs = xs
parseLine :: String -> (Program, Weight, Programs)
parseLine line =
let nameAndWeight : programsString : _ = splitOn ")" line
programs = discardEmpty $ splitOn ", " $ last $ splitOn " -> " programsString
name : weight : _ = splitOn " (" nameAndWeight
in (name, read weight, programs)
main :: IO ()
main = do
input <- readFile "7.txt"
let list = map parseLine $ lines input
nameSet = fromList $ map (\(name, _, _) -> name) list
bottom = foldr (\(name, _, programs) set ->
case programs of
[] -> delete name set
ps -> foldr delete set ps)
nameSet list
print $ bottom