diff options
Diffstat (limited to 'execs')
-rw-r--r-- | execs/Day07.hs | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/execs/Day07.hs b/execs/Day07.hs index 1587e2b..72043af 100644 --- a/execs/Day07.hs +++ b/execs/Day07.hs | |||
@@ -2,6 +2,7 @@ module Main where | |||
2 | 2 | ||
3 | import Data.Map (Map) | 3 | import Data.Map (Map) |
4 | import qualified Data.Map as Map | 4 | import qualified Data.Map as Map |
5 | import Utils | ||
5 | 6 | ||
6 | myBag = "shiny gold" | 7 | myBag = "shiny gold" |
7 | 8 | ||
@@ -19,18 +20,14 @@ parseLine s = (leadingBag, contained) | |||
19 | 20 | ||
20 | canContain :: Map String [(Int, String)] -> String -> Bool | 21 | canContain :: Map String [(Int, String)] -> String -> Bool |
21 | canContain m outer = myBag `elem` inners || any (canContain m) inners | 22 | canContain m outer = myBag `elem` inners || any (canContain m) inners |
22 | where (Just inners) = map snd <$> Map.lookup outer m | 23 | where inners = map snd $ m Map.! outer |
23 | 24 | ||
24 | countNested :: String -> Map String [(Int, String)] -> Int | 25 | countNested :: String -> Map String [(Int, String)] -> Int |
25 | countNested s m = if null l | 26 | countNested s m = foldl (\acc (c,b) -> acc + c * (1 + countNested b m)) 0 $ m Map.! s |
26 | then 0 | ||
27 | else sum $ map counter l | ||
28 | where (Just l) = Map.lookup s m | ||
29 | counter (count, bag) = count + count * countNested bag m | ||
30 | 27 | ||
31 | main :: IO () | 28 | main :: IO () |
32 | main = do | 29 | main = do |
33 | n <- map (parseLine . words) . lines <$> readFile "input/07" | 30 | n <- map (parseLine . words) . lines <$> readFile "input/07" |
34 | let q = Map.fromList n | 31 | let q = Map.fromList n |
35 | print $ length $ filter (== True) $ map (canContain q . fst) $ Map.toList q | 32 | print $ howMany (canContain q . fst) $ Map.toList q |
36 | print $ countNested myBag q | 33 | print $ countNested myBag q |