44 lines
1.1 KiB
Haskell
44 lines
1.1 KiB
Haskell
|
import Data.Char (isDigit, isSpace)
|
||
|
|
||
|
data Color = Red | Green | Blue deriving (Show, Eq)
|
||
|
|
||
|
-- Parse a single digit
|
||
|
digit :: Char -> Maybe Int
|
||
|
digit c
|
||
|
| isDigit c = Just (read [c])
|
||
|
| otherwise = Nothing
|
||
|
|
||
|
-- Parse an integer
|
||
|
-- Parse an integer
|
||
|
parseInt :: String -> Maybe Int
|
||
|
parseInt str = case reads str of
|
||
|
[(num, "")] -> Just num
|
||
|
_ -> Nothing
|
||
|
|
||
|
-- Parse color
|
||
|
parseColor :: String -> Maybe Color
|
||
|
parseColor "red" = Just Red
|
||
|
parseColor "green" = Just Green
|
||
|
parseColor "blue" = Just Blue
|
||
|
parseColor _ = Nothing
|
||
|
|
||
|
-- Parse the entire input string
|
||
|
parseInput :: String -> Maybe Bool
|
||
|
parseInput input = do
|
||
|
let (numStr, rest) = span (\c -> isDigit c ) input
|
||
|
num <- parseInt numStr
|
||
|
let colorStr = dropWhile isSpace rest
|
||
|
color <- parseColor colorStr
|
||
|
case color of
|
||
|
Red -> pure (num < 12)
|
||
|
Green -> pure (num < 13)
|
||
|
Blue -> pure (num < 14)
|
||
|
|
||
|
main :: IO ()
|
||
|
main = do
|
||
|
putStrLn "Enter input (e.g., '10 red'):"
|
||
|
input <- getLine
|
||
|
case parseInput input of
|
||
|
Just result -> putStrLn $ "Result: " ++ show result
|
||
|
Nothing -> putStrLn "Invalid input."
|