[hs] Solve 2020_21 part 1

This commit is contained in:
Joscha 2020-12-21 11:13:04 +00:00
parent 562c836b11
commit 194094b131
2 changed files with 37 additions and 0 deletions

View file

@ -23,6 +23,7 @@ import qualified Aoc.Y2020.D17 as D17
import qualified Aoc.Y2020.D18 as D18 import qualified Aoc.Y2020.D18 as D18
import qualified Aoc.Y2020.D19 as D19 import qualified Aoc.Y2020.D19 as D19
import qualified Aoc.Y2020.D20 as D20 import qualified Aoc.Y2020.D20 as D20
import qualified Aoc.Y2020.D21 as D21
year :: Year year :: Year
year = Year 2020 year = Year 2020
@ -46,4 +47,5 @@ year = Year 2020
, (18, D18.day) , (18, D18.day)
, (19, D19.day) , (19, D19.day)
, (20, D20.day) , (20, D20.day)
, (21, D21.day)
] ]

35
hs/src/Aoc/Y2020/D21.hs Normal file
View file

@ -0,0 +1,35 @@
{-# LANGUAGE OverloadedStrings #-}
module Aoc.Y2020.D21
( day
) where
import Control.Monad
import Data.Char
import qualified Data.Set as Set
import qualified Data.Text as T
import Aoc.Day
import Aoc.Parse
parser :: Parser [(Set.Set T.Text, Set.Set T.Text)]
parser = manyLines $ do
ingredients <- Set.fromList <$> many (lineWhile isAlpha <* string " ")
void $ string "(contains "
allergens <- Set.fromList <$> (lineWhile isAlpha `sepBy` string ", ")
void $ string ")"
pure (ingredients, allergens)
solver :: [(Set.Set T.Text, Set.Set T.Text)] -> IO ()
solver foods = do
putStrLn ">> Part 1"
let allFoods = Set.unions $ map fst foods
allAllergens = Set.toList $ Set.unions $ map snd foods
foodsByAllergen = map (\a -> (a, foldr1 Set.intersection $ map fst $ filter (Set.member a . snd) foods)) allAllergens
foodsWithAllergen = Set.unions $ map snd foodsByAllergen
foodsWithoutAllergen = allFoods Set.\\ foodsWithAllergen
print $ sum $ map (Set.size . Set.intersection foodsWithoutAllergen . fst) foods
day :: Day
day = dayParse parser solver