diff options
author | Orangerot <purple@orangerot.dev> | 2024-05-17 15:41:55 +0200 |
---|---|---|
committer | Orangerot <purple@orangerot.dev> | 2024-05-17 15:41:55 +0200 |
commit | c6075f736e67e47b940abb9c1a0c54753d4b55b8 (patch) | |
tree | 69d827646e615e00f91ef54361cc1701e4f0eff7 /2023/day02/Test.hs | |
parent | a1895fe157e06ee4d119576163ea76390b3d402c (diff) |
Diffstat (limited to '2023/day02/Test.hs')
-rw-r--r-- | 2023/day02/Test.hs | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/2023/day02/Test.hs b/2023/day02/Test.hs new file mode 100644 index 0000000..6d21d48 --- /dev/null +++ b/2023/day02/Test.hs @@ -0,0 +1,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." |