[hs] Solve 2020_21 part 1
This commit is contained in:
parent
562c836b11
commit
194094b131
2 changed files with 37 additions and 0 deletions
|
|
@ -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
35
hs/src/Aoc/Y2020/D21.hs
Normal 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
|
||||||
Loading…
Add table
Add a link
Reference in a new issue