summaryrefslogtreecommitdiff
path: root/2015/day12.hs
diff options
context:
space:
mode:
Diffstat (limited to '2015/day12.hs')
-rw-r--r--2015/day12.hs46
1 files changed, 46 insertions, 0 deletions
diff --git a/2015/day12.hs b/2015/day12.hs
new file mode 100644
index 0000000..6dbf8a0
--- /dev/null
+++ b/2015/day12.hs
@@ -0,0 +1,46 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+import Data.Char
+import Data.Maybe
+import Data.Word
+import Data.Scientific
+import qualified Data.Aeson as JSON
+import qualified Data.Vector as Vector
+import qualified Data.HashMap.Strict as HM
+import qualified Data.ByteString.Lazy as BS
+import qualified Data.ByteString.Internal as BS (c2w,w2c)
+
+contains :: (Eq a) => [a] -> a -> Bool
+contains [] _ = False
+contains (x:xs) v = if x == v then True else contains xs v
+
+isDigitOrMinus :: Char -> Bool
+isDigitOrMinus c = isDigit c || c == '-'
+
+extractNumbers :: String -> [Int]
+extractNumbers s@(x:xs)
+ | isDigitOrMinus x = read (takeWhile isDigitOrMinus s) : extractNumbers (dropWhile isDigitOrMinus xs)
+ | otherwise = extractNumbers xs
+extractNumbers [] = []
+
+sumnumsnored :: JSON.Value -> Int
+sumnumsnored (JSON.Object o) = if any (== JSON.String "red") $ HM.elems o then 0 else HM.foldl' (\a v -> a + sumnumsnored v) 0 o
+sumnumsnored (JSON.Array a) = Vector.sum $ Vector.map sumnumsnored a
+sumnumsnored (JSON.String _) = 0
+sumnumsnored (JSON.Number n) = floor n
+sumnumsnored (JSON.Bool _) = 0
+
+day12 :: IO ()
+day12 = do
+ input <- readFile "day12.txt"
+ print $ sum $ extractNumbers input
+
+dopart2 :: String -> Int
+dopart2 s = sumnumsnored $ fromJust $ JSON.decode $ BS.pack $ map BS.c2w s
+
+day12_2 :: IO ()
+day12_2 = do
+ input <- readFile "day12.txt"
+ print $ dopart2 input
+
+main = day12_2