[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.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
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