From 194094b13115c0fb0d8c208e5566e50794ab890e Mon Sep 17 00:00:00 2001 From: Joscha Date: Mon, 21 Dec 2020 11:13:04 +0000 Subject: [PATCH] [hs] Solve 2020_21 part 1 --- hs/src/Aoc/Y2020.hs | 2 ++ hs/src/Aoc/Y2020/D21.hs | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 hs/src/Aoc/Y2020/D21.hs diff --git a/hs/src/Aoc/Y2020.hs b/hs/src/Aoc/Y2020.hs index 9fb52bd..e2d650f 100644 --- a/hs/src/Aoc/Y2020.hs +++ b/hs/src/Aoc/Y2020.hs @@ -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) ] diff --git a/hs/src/Aoc/Y2020/D21.hs b/hs/src/Aoc/Y2020/D21.hs new file mode 100644 index 0000000..1bfe559 --- /dev/null +++ b/hs/src/Aoc/Y2020/D21.hs @@ -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