summaryrefslogtreecommitdiff
path: root/2023/day02/MySplit2.hs
diff options
context:
space:
mode:
Diffstat (limited to '2023/day02/MySplit2.hs')
-rw-r--r--2023/day02/MySplit2.hs50
1 files changed, 50 insertions, 0 deletions
diff --git a/2023/day02/MySplit2.hs b/2023/day02/MySplit2.hs
new file mode 100644
index 0000000..baee8ae
--- /dev/null
+++ b/2023/day02/MySplit2.hs
@@ -0,0 +1,50 @@
+import Data.List.Split (splitOn)
+
+game :: String -> [String]
+game = splitOn [';']
+
+reveal :: String -> [String]
+reveal x = concat ( map (splitOn [',']) (game x) )
+
+colors :: String -> [(Int, String)]
+colors x = map (\x -> color (splitOn [' '] x)) (reveal x)
+
+color :: [String] -> (Int, String)
+color [_, i, s] = (read i, s)
+
+validColor :: (Int, String) -> Bool
+validColor (i, s) = case s of
+ "red" -> i <= 12
+ "green" -> i <= 13
+ "blue" -> i <= 14
+ _ -> False
+
+getColors :: String -> String
+getColors s = tail (dropWhile (/= ':') s)
+
+isGameValid :: String -> Bool
+isGameValid s = all validColor (colors (getColors s))
+
+isValid :: [String] -> Bool
+isValid s = all isGameValid s
+
+getMyColor :: String -> [(Int, String)]
+getMyColor s = colors (getColors s)
+
+myFilter :: String -> [(Int, String)] -> Int
+myFilter color s = maximum (map (\(i,_) -> i) (filter (\(_,c) -> c == color) s))
+
+main :: IO ()
+main = do
+ inputLines <- lines <$> getContents
+
+ -- let arePossible = filter isPossible lines
+ -- myColors <- isValid inputLines
+ -- print (sum (map (\(_,n) -> n) (filter (\(b,_) -> b) (zip (map isGameValid inputLines) [1..]))))
+ let myColors = map (\x -> getMyColor x) inputLines
+ let myResult = map (\c -> myFilter "red" c * myFilter "green" c * myFilter "blue" c) myColors
+ print (sum myResult)
+
+ -- mapM_ putStrLn myColors
+ -- mapM_ putStrLn inputLines
+