[hs] Solve 2020_07

This commit is contained in:
Joscha 2020-12-07 09:52:01 +00:00
parent 589eced514
commit fe41f42ccc
2 changed files with 75 additions and 0 deletions

View file

@ -9,6 +9,7 @@ import qualified Aoc.Y2020.D03 as D03
import qualified Aoc.Y2020.D04 as D04 import qualified Aoc.Y2020.D04 as D04
import qualified Aoc.Y2020.D05 as D05 import qualified Aoc.Y2020.D05 as D05
import qualified Aoc.Y2020.D06 as D06 import qualified Aoc.Y2020.D06 as D06
import qualified Aoc.Y2020.D07 as D07
year :: Year year :: Year
year = Year 2020 year = Year 2020
@ -18,4 +19,5 @@ year = Year 2020
, ( 4, D04.day) , ( 4, D04.day)
, ( 5, D05.day) , ( 5, D05.day)
, ( 6, D06.day) , ( 6, D06.day)
, ( 7, D07.day)
] ]

73
hs/src/Aoc/Y2020/D07.hs Normal file
View file

@ -0,0 +1,73 @@
{-# LANGUAGE OverloadedStrings #-}
module Aoc.Y2020.D07
( day
) where
import Control.Monad
import Data.Maybe
import qualified Data.Map as Map
import qualified Data.Set as Set
import qualified Data.Text as T
import Aoc.Day
import Aoc.Parse
type BagName = T.Text
data BagCount = BagCount
{ bcName :: BagName
, bcNum :: Int
} deriving (Show)
type BagMap = Map.Map BagName [BagCount]
pBagName :: Parser T.Text
pBagName = do
first <- word
void $ char ' '
second <- word
void $ char ' '
void $ string "bags" <|> string "bag"
pure $ first <> " " <> second
pBagCount :: Parser BagCount
pBagCount = do
n <- decimal
void $ char ' '
name <- pBagName
pure $ BagCount name n
parser :: Parser BagMap
parser = fmap Map.fromList $ manyLines $ do
name <- pBagName
void $ string " contain "
bags <- ([] <$ string "no other bags") <|> (pBagCount `sepBy1` string ", ")
void $ char '.'
pure (name, bags)
children :: BagMap -> BagName -> Set.Set BagName
children m b =
let ch = map bcName $ fromMaybe [] $ m Map.!? b
in foldr Set.union (Set.fromList ch) $ map (children m) ch
countChildren :: BagMap -> BagName -> Int
countChildren m b =
let ch = fromMaybe [] $ m Map.!? b
in sum $ map (\(BagCount name num) -> num + num * countChildren m name) ch
myBag :: BagName
myBag = "shiny gold"
solver :: BagMap -> IO ()
solver bags = do
putStrLn ">> Part 1"
print $ length $ filter (Set.member myBag) $ map (children bags) $ Set.toList $ Map.keysSet bags
putStrLn ""
putStrLn ">> Part 2"
print $ countChildren bags myBag
day :: Day
day = dayParse parser solver