diff options
Diffstat (limited to '2015/day08.hs')
-rw-r--r-- | 2015/day08.hs | 39 |
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 |