Compare commits
1 Commits
38a9eb3c9f
...
47c1560549
Author | SHA1 | Date |
---|---|---|
Gaël Depreeuw | 47c1560549 | 4 years ago |
4 changed files with 1087 additions and 1 deletions
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,75 @@ |
||||
{-# LANGUAGE OverloadedStrings #-} |
||||
|
||||
module Day4 (day4) where |
||||
|
||||
import Control.Applicative ((<|>)) |
||||
import Control.Monad (void) |
||||
import qualified Data.Attoparsec.Text as P |
||||
import qualified Data.Map as M |
||||
import Data.Maybe (catMaybes) |
||||
import qualified Data.Text as T |
||||
|
||||
type BYR = T.Text |
||||
|
||||
type IYR = T.Text |
||||
|
||||
type EYR = T.Text |
||||
|
||||
type HGT = T.Text |
||||
|
||||
type HCL = T.Text |
||||
|
||||
type ECL = T.Text |
||||
|
||||
type PID = T.Text |
||||
|
||||
type CID = T.Text |
||||
|
||||
data Passport = ValidPassport |
||||
{ byr :: BYR, |
||||
iyr :: IYR, |
||||
eyr :: EYR, |
||||
hgt :: HGT, |
||||
hcl :: HCL, |
||||
ecl :: ECL, |
||||
pid :: PID, |
||||
cid :: Maybe CID -- Definitely not a hack! |
||||
} |
||||
deriving (Eq, Show) |
||||
|
||||
parserPair :: P.Parser (T.Text, T.Text) |
||||
parserPair = do |
||||
key <- P.count 3 P.letter |
||||
_ <- P.char ':' |
||||
value <- P.takeWhile1 (P.inClass "a-zA-Z0-9#") |
||||
return (T.pack key, value) |
||||
|
||||
parserEntry :: P.Parser (M.Map T.Text T.Text) |
||||
parserEntry = M.fromList <$> parserPair `P.sepBy` (void P.space <|> P.endOfLine) |
||||
|
||||
fromMap :: M.Map T.Text T.Text -> Maybe Passport |
||||
fromMap m = do |
||||
byr <- m M.!? "byr" |
||||
iyr <- m M.!? "iyr" |
||||
eyr <- m M.!? "eyr" |
||||
hgt <- m M.!? "hgt" |
||||
hcl <- m M.!? "hcl" |
||||
ecl <- m M.!? "ecl" |
||||
pid <- m M.!? "pid" |
||||
return $ ValidPassport byr iyr eyr hgt hcl ecl pid (m M.!? "cid") |
||||
|
||||
parserPassport :: P.Parser (Maybe Passport) |
||||
parserPassport = fromMap <$> parserEntry |
||||
|
||||
parseList :: String -> [Maybe Passport] |
||||
parseList s = |
||||
let p = parserPassport `P.sepBy` P.endOfLine |
||||
in case P.parseOnly p (T.pack s) of |
||||
Left s -> error (show s) |
||||
Right r -> r |
||||
|
||||
day4 :: IO () |
||||
day4 = do |
||||
r <- readFile "./input/day4" |
||||
putStr "[Day 4-1] # trees: " |
||||
print . length . catMaybes . parseList $ r |
Loading…
Reference in new issue