31 lines
982 B
Haskell
31 lines
982 B
Haskell
|
import Data.HashSet (Set, fromList, delete)
|
||
|
import Data.List.Split
|
||
|
import Debug.Trace
|
||
|
|
||
|
type Weight = Int
|
||
|
type Program = String
|
||
|
type Programs = [Program]
|
||
|
--type Tree = Map Program (Weight, Programs)
|
||
|
|
||
|
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
|
||
|
names = fromList $ map (\(name, _, _) -> name) list
|
||
|
bottom = foldr (\(name, _, programs) set ->
|
||
|
case programs of
|
||
|
[] -> delete name set
|
||
|
ps -> foldr delete set ps)
|
||
|
names list
|
||
|
print $ bottom
|