[hs] Clean up 2020_04
This commit is contained in:
parent
e2f1687798
commit
5a5ddf586b
1 changed files with 10 additions and 20 deletions
|
|
@ -1,4 +1,5 @@
|
||||||
{-# LANGUAGE OverloadedStrings #-}
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
{-# LANGUAGE RankNTypes #-}
|
||||||
|
|
||||||
module Aoc.Y2020.D04
|
module Aoc.Y2020.D04
|
||||||
( day
|
( day
|
||||||
|
|
@ -6,9 +7,11 @@ module Aoc.Y2020.D04
|
||||||
|
|
||||||
import Control.Monad
|
import Control.Monad
|
||||||
import Data.Char
|
import Data.Char
|
||||||
import qualified Data.Text as T
|
import Data.Functor
|
||||||
import Data.Void
|
import Data.Void
|
||||||
|
|
||||||
|
import qualified Data.Text as T
|
||||||
|
|
||||||
import Aoc.Day
|
import Aoc.Day
|
||||||
import Aoc.Parse
|
import Aoc.Parse
|
||||||
|
|
||||||
|
|
@ -64,6 +67,9 @@ instance Semigroup Passport where
|
||||||
instance Monoid Passport where
|
instance Monoid Passport where
|
||||||
mempty = Passport mempty mempty mempty mempty mempty mempty mempty mempty
|
mempty = Passport mempty mempty mempty mempty mempty mempty mempty mempty
|
||||||
|
|
||||||
|
mapFieldsExceptCid :: (forall a. Field a -> b) -> Passport -> [b]
|
||||||
|
mapFieldsExceptCid f p = [f $ byr p, f $ iyr p, f $ eyr p, f $ hgt p, f $ hcl p, f $ ecl p, f $ pid p]
|
||||||
|
|
||||||
pField :: T.Text -> Parser a -> Parser (Field a)
|
pField :: T.Text -> Parser a -> Parser (Field a)
|
||||||
pField name p = do
|
pField name p = do
|
||||||
notFollowedBy oneSpace
|
notFollowedBy oneSpace
|
||||||
|
|
@ -102,7 +108,7 @@ pHgt :: Parser Passport
|
||||||
pHgt = do
|
pHgt = do
|
||||||
f <- pField "hgt" $ do
|
f <- pField "hgt" $ do
|
||||||
i <- decimal
|
i <- decimal
|
||||||
(string "cm" >> guard (150 <= i && i <= 193) >> pure (Cm i)) <|> (string "in" >> guard (59 <= i && i <= 76) >> pure (In i))
|
(string "cm" *> guard (150 <= i && i <= 193) $> Cm i) <|> (string "in" *> guard (59 <= i && i <= 76) $> In i)
|
||||||
pure mempty{hgt = f}
|
pure mempty{hgt = f}
|
||||||
|
|
||||||
pHcl :: Parser Passport
|
pHcl :: Parser Passport
|
||||||
|
|
@ -136,26 +142,10 @@ parser = passport `sepBy` newline
|
||||||
field = pByr <|> pIyr <|> pEyr <|> pHgt <|> pHcl <|> pEcl <|> pPid <|> pCid
|
field = pByr <|> pIyr <|> pEyr <|> pHgt <|> pHcl <|> pEcl <|> pPid <|> pCid
|
||||||
|
|
||||||
hasRequiredKeys :: Passport -> Bool
|
hasRequiredKeys :: Passport -> Bool
|
||||||
hasRequiredKeys p = and
|
hasRequiredKeys = and . mapFieldsExceptCid isPresent
|
||||||
[ isPresent $ byr p
|
|
||||||
, isPresent $ iyr p
|
|
||||||
, isPresent $ eyr p
|
|
||||||
, isPresent $ hgt p
|
|
||||||
, isPresent $ hcl p
|
|
||||||
, isPresent $ ecl p
|
|
||||||
, isPresent $ pid p
|
|
||||||
]
|
|
||||||
|
|
||||||
hasValidKeys :: Passport -> Bool
|
hasValidKeys :: Passport -> Bool
|
||||||
hasValidKeys p = and
|
hasValidKeys = and . mapFieldsExceptCid isValid
|
||||||
[ isValid $ byr p
|
|
||||||
, isValid $ iyr p
|
|
||||||
, isValid $ eyr p
|
|
||||||
, isValid $ hgt p
|
|
||||||
, isValid $ hcl p
|
|
||||||
, isValid $ ecl p
|
|
||||||
, isValid $ pid p
|
|
||||||
]
|
|
||||||
|
|
||||||
solver :: [Passport] -> IO ()
|
solver :: [Passport] -> IO ()
|
||||||
solver passports = do
|
solver passports = do
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue