[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.D19 as D19
import qualified Aoc.Y2020.D20 as D20
import qualified Aoc.Y2020.D21 as D21
year :: Year
year = Year 2020
@ -46,4 +47,5 @@ year = Year 2020
, (18, D18.day)
, (19, D19.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