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) | |
AoC 2023
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."  | 
