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." |