45 lines
908 B
Haskell
45 lines
908 B
Haskell
module Aoc.Y2020.D02
|
|
( day
|
|
) where
|
|
|
|
import qualified Data.Text as T
|
|
|
|
import Aoc.Day
|
|
import Aoc.Parse
|
|
|
|
data Line = Line
|
|
{ lMin :: Int
|
|
, lMax :: Int
|
|
, lChar :: Char
|
|
, lPw :: T.Text
|
|
}
|
|
|
|
parser :: Parser [Line]
|
|
parser = manyLines $ Line
|
|
<$> (decimal <* char '-')
|
|
<*> (decimal <* space)
|
|
<*> (anySingle <* char ':' <* space)
|
|
<*> line
|
|
|
|
validCount :: Line -> Bool
|
|
validCount l = n >= lMin l && n <= lMax l
|
|
where
|
|
n = T.count (T.singleton $ lChar l) $ lPw l
|
|
|
|
validPositions :: Line -> Bool
|
|
validPositions l = (left == lChar l) /= (right == lChar l)
|
|
where
|
|
left = T.index (lPw l) (lMin l - 1)
|
|
right = T.index (lPw l) (lMax l - 1)
|
|
|
|
solver :: [Line] -> IO ()
|
|
solver ls = do
|
|
putStrLn ">> Part 1"
|
|
print $ length $ filter validCount ls
|
|
|
|
putStrLn ""
|
|
putStrLn ">> Part 2"
|
|
print $ length $ filter validPositions ls
|
|
|
|
day :: Day
|
|
day = dayParse parser solver
|