From c6075f736e67e47b940abb9c1a0c54753d4b55b8 Mon Sep 17 00:00:00 2001 From: Orangerot Date: Fri, 17 May 2024 15:41:55 +0200 Subject: AoC 2023 --- 2023/day02/Test.hs | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 2023/day02/Test.hs (limited to '2023/day02/Test.hs') 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." -- cgit v1.2.3