summaryrefslogtreecommitdiff
path: root/2015/day08.hs
diff options
context:
space:
mode:
Diffstat (limited to '2015/day08.hs')
-rw-r--r--2015/day08.hs39
1 files changed, 39 insertions, 0 deletions
diff --git a/2015/day08.hs b/2015/day08.hs
new file mode 100644
index 0000000..d48212b
--- /dev/null
+++ b/2015/day08.hs
@@ -0,0 +1,39 @@
+module Main where
+
+import Data.Char
+import Control.Monad
+
+parseHexSingle :: Char -> Int
+parseHexSingle x -- = -- subl syntax
+ | ord x >= ord '0' && ord x <= ord '9' = ord x - ord '0'
+ | ord x >= ord 'a' && ord x <= ord 'f' = 10 + ord x - ord 'a'
+ | ord x >= ord 'A' && ord x <= ord 'F' = 10 + ord x - ord 'A'
+ | otherwise = undefined
+
+parseHex :: String -> Int
+parseHex "" = 0
+parseHex (x:xs) = 16 * parseHexSingle x + parseHex xs
+
+parse :: String -> String
+parse s -- = -- subl syntax
+ | length s > 1 && head s == '"' && last s == '"' = parse' $ init $ tail s
+ | otherwise = undefined
+
+parse' :: String -> String
+parse' "" = ""
+parse' ('\\':'\\':xs) = '\\' : parse' xs
+parse' ('\\':'"':xs) = '"' : parse' xs
+parse' ('\\':'x':a:b:xs) = chr (parseHex $ [a,b]) : parse' xs
+parse' (x:xs) = x : parse' xs
+
+day8 :: IO ()
+day8 = do
+ input <- liftM lines $ readFile "day08.txt"
+ print $ sum [length s - length (parse s) | s <- input]
+
+day8_2 :: IO ()
+day8_2 = do
+ input <- liftM lines $ readFile "day08.txt"
+ print $ sum [length (show s) - length s | s <- input]
+
+main = day8