summaryrefslogtreecommitdiff
path: root/2015/day12.hs
diff options
context:
space:
mode:
authortomsmeding <tom.smeding@gmail.com>2016-12-14 20:19:02 +0100
committertomsmeding <tom.smeding@gmail.com>2016-12-14 20:19:02 +0100
commit2d02f553aa4cc4ded630628eccdf34f55937cee5 (patch)
treed5377ebdff68788725b5820d5331ce7b6c9d4a84 /2015/day12.hs
parent97b4c5d86cc12447ac6845e25a863e26a88aec35 (diff)
Add 2015 sources
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