summaryrefslogtreecommitdiff
path: root/2023/day02/Test.hs
blob: 6d21d4854ecc9a9052af15acd65bcf80b1bfefc9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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."