Day 04
This commit is contained in:
parent
eeb25a1e5a
commit
54c97ceb71
40
2020/day04/day04.hs
Normal file
40
2020/day04/day04.hs
Normal file
@ -0,0 +1,40 @@
|
||||
import Data.Char
|
||||
import Data.List
|
||||
import Data.List.Split
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
input <- map (unwords . lines) . splitOn "\n\n" <$> readFile "input"
|
||||
print $ day4 input validateA
|
||||
print $ day4 input validateB
|
||||
|
||||
day4 :: [String] -> ([[String]] -> Bool) -> Int
|
||||
day4 input vldt = length $ filter vldt $ map (map (splitOn ":") . words) input
|
||||
|
||||
validateA :: [[String]] -> Bool
|
||||
validateA =
|
||||
null . (\\) ["byr", "iyr", "eyr", "hgt", "hcl", "ecl", "pid"] . map head
|
||||
|
||||
validateB :: [[String]] -> Bool
|
||||
validateB input = validateA input && all val input
|
||||
where
|
||||
val (x:xs)
|
||||
| "byr" <- x = pars >= 1920 && pars <= 2002
|
||||
| "iyr" <- x = pars >= 2010 && pars <= 2020
|
||||
| "eyr" <- x = pars >= 2020 && pars <= 2030
|
||||
| "hgt" <- x =
|
||||
case partition isDigit b of
|
||||
(y, "cm") -> read y >= 150 && read y <= 193
|
||||
(y, "in") -> read y >= 59 && read y <= 76
|
||||
_ -> False
|
||||
| "hcl" <- x =
|
||||
(head b == '#') &&
|
||||
all (`elem` (['0' .. '9'] `union` ['a' .. 'f'])) (tail b) &&
|
||||
(length b == 7)
|
||||
| "ecl" <- x = b `elem` ["amb", "blu", "brn", "gry", "grn", "hzl", "oth"]
|
||||
| "pid" <- x = length b == 9 && null (dropWhile isDigit b)
|
||||
| "cid" <- x = True
|
||||
| _ <- x = False
|
||||
where
|
||||
pars = read b
|
||||
b = head xs
|
1023
2020/day04/input
Normal file
1023
2020/day04/input
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user