From 2d02f553aa4cc4ded630628eccdf34f55937cee5 Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Wed, 14 Dec 2016 20:19:02 +0100 Subject: Add 2015 sources --- 2015/day12.hs | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 2015/day12.hs (limited to '2015/day12.hs') 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 -- cgit v1.2.3-70-g09d2