Day 7, part 2 - partial progress: made a tree, I guess?
This commit is contained in:
parent
91d0fb46bc
commit
6410560315
34
7.hs
34
7.hs
|
@ -1,5 +1,6 @@
|
|||
import Data.HashSet (Set, fromList, delete)
|
||||
import Data.HashMap (Map, fromList, toList, delete, findWithDefault)
|
||||
import Data.List.Split
|
||||
import Data.Tree (Tree, unfoldTree, drawTree)
|
||||
|
||||
type Weight = Int
|
||||
type Program = String
|
||||
|
@ -9,21 +10,32 @@ discardEmpty :: [String] -> [String]
|
|||
discardEmpty [""] = []
|
||||
discardEmpty xs = xs
|
||||
|
||||
parseLine :: String -> (Program, Weight, Programs)
|
||||
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)
|
||||
in (name, (read weight, programs))
|
||||
|
||||
getBottom :: Map Program (Weight, Programs) -> [(Program, (Weight, Programs))] -> Program
|
||||
getBottom m l = bottomName
|
||||
where
|
||||
(bottomName, _) : _ = toList $ foldr
|
||||
(\(name, (_, programs)) set ->
|
||||
case programs of
|
||||
[] -> delete name set
|
||||
ps -> foldr delete set ps)
|
||||
m l
|
||||
|
||||
mapToTree :: Map Program (Weight, Programs) -> Program -> Tree Weight
|
||||
mapToTree m = unfoldTree (\s -> findWithDefault undefined s m)
|
||||
|
||||
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
|
||||
let programsList = map parseLine $ lines input
|
||||
programsMap = fromList programsList
|
||||
bottomName = getBottom programsMap programsList
|
||||
programsTree = mapToTree programsMap bottomName
|
||||
print $ bottomName
|
||||
writeFile "7_tree.txt" $ drawTree $ fmap show programsTree
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue