[hs] Solve 2020_16 part 1

This commit is contained in:
Joscha 2020-12-16 16:51:32 +00:00
parent 7746d81fde
commit 5a89816e03
2 changed files with 54 additions and 0 deletions

View file

@ -18,6 +18,7 @@ import qualified Aoc.Y2020.D12 as D12
import qualified Aoc.Y2020.D13 as D13 import qualified Aoc.Y2020.D13 as D13
import qualified Aoc.Y2020.D14 as D14 import qualified Aoc.Y2020.D14 as D14
import qualified Aoc.Y2020.D15 as D15 import qualified Aoc.Y2020.D15 as D15
import qualified Aoc.Y2020.D16 as D16
year :: Year year :: Year
year = Year 2020 year = Year 2020
@ -36,4 +37,5 @@ year = Year 2020
, (13, D13.day) , (13, D13.day)
, (14, D14.day) , (14, D14.day)
, (15, D15.day) , (15, D15.day)
, (16, D16.day)
] ]

52
hs/src/Aoc/Y2020/D16.hs Normal file
View file

@ -0,0 +1,52 @@
{-# LANGUAGE OverloadedStrings #-}
module Aoc.Y2020.D16
( day
) where
import Control.Monad
import qualified Data.Map as Map
import qualified Data.Text as T
import Aoc.Day
import Aoc.Parse
data Input = Input
{ iFields :: Map.Map T.Text [(Int, Int)]
, iMyTicket :: [Int]
, iNearbyTickets :: [[Int]]
} deriving (Show)
parser :: Parser Input
parser = do
fields <- Map.fromList <$> many (fieldLine <* newline)
void $ string "\nyour ticket:\n"
myTicket <- ticket <* newline
void $ string "\nnearby tickets:\n"
nearbyTickets <- many (ticket <* newline)
pure $ Input fields myTicket nearbyTickets
where
fieldLine = do
name <- takeWhileP Nothing $ \c -> (c /= ':') && (c /= '\n')
void $ string ": "
ranges <- sepBy ((,) <$> (decimal <* string "-") <*> decimal) (string " or ")
pure (name, ranges)
ticket = decimal `sepBy` string ","
valid :: Int -> [(Int, Int)] -> Bool
valid n = any (\(a, b) -> a <= n && n <= b)
findValid :: Map.Map T.Text [(Int, Int)] -> Int -> [T.Text]
findValid fields n = map fst $ filter (valid n . snd) $ Map.toList fields
anyValid :: Map.Map T.Text [(Int, Int)] -> Int -> Bool
anyValid fields = not . null . findValid fields
solver :: Input -> IO ()
solver i = do
putStrLn ">> Part 1"
print $ sum $ filter (not . anyValid (iFields i)) $ concat $ iNearbyTickets i
day :: Day
day = dayParse parser solver