import Data.List.Split main :: IO () main = do input <- lines <$> readFile "input" print $ day2 f1 input print $ day2 f2 input day2 :: (String -> Int -> Int -> Char -> Bool) -> [String] -> Int day2 f = length . filter (predicate f) f1 :: String -> Int -> Int -> Char -> Bool f1 str a b c = (l >= a) && (l <= b) where l = length $ filter (== c) str f2 :: String -> Int -> Int -> Char -> Bool f2 str a b c = (str !! pred a == c) /= (str !! pred b == c) predicate :: (String -> Int -> Int -> Char -> Bool) -> String -> Bool predicate f line = f str a b c where c = head $ words p !! 1 [a, b] = map read $ splitOn "-" $ head $ words p [p, str] = splitOn ": " line