From 055c95b9e3de6d0a35bda079eaad65f0fc2338d1 Mon Sep 17 00:00:00 2001 From: germax26 Date: Tue, 3 Dec 2024 00:24:29 +1100 Subject: [PATCH] 2015 Day 04 in Haskell --- 2015/day04/day04.hs | 23 +++++++++++++++++++++++ aoc.hs | 6 +++--- 2 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 2015/day04/day04.hs diff --git a/2015/day04/day04.hs b/2015/day04/day04.hs new file mode 100644 index 0000000..43a74fa --- /dev/null +++ b/2015/day04/day04.hs @@ -0,0 +1,23 @@ +import Aoc +import Crypto.Hash.MD5 ( hash ) +import Data.ByteString.Char8 ( pack ) +import Data.ByteString.Builder ( byteStringHex, toLazyByteString ) +import Data.ByteString.Lazy.Char8 ( pack, isPrefixOf ) + +parseFile :: [String] -> [Char] +parseFile = single + +mine :: Int -> [Char] -> Int +mine n key = head $ filter matches [1..] + where + zeros = Data.ByteString.Lazy.Char8.pack $ replicate n '0' + matches = isPrefixOf zeros . toLazyByteString . byteStringHex . hash . Data.ByteString.Char8.pack . (key++) . show + +part1 :: [Char] -> Int +part1 = mine 5 + +part2 :: [Char] -> Int +part2 = mine 6 + +main :: IO () +main = aocMain parseFile part1 part2 \ No newline at end of file diff --git a/aoc.hs b/aoc.hs index 5f4d248..d88ed29 100644 --- a/aoc.hs +++ b/aoc.hs @@ -4,9 +4,9 @@ aocMain :: Show p => ([String] -> p) -> (p -> Int) -> (p -> Int) -> IO () aocMain parseFile part1 part2 = do contents <- readFile "input.txt" let input = parseFile $ lines contents - -- print $ "Input: " ++ show input - print $ "Part 1: " ++ show (part1 input) - print $ "Part 2: " ++ show (part2 input) + -- putStrLn $ "Input: " ++ show input + putStrLn $ "Part 1: " ++ show (part1 input) + putStrLn $ "Part 2: " ++ show (part2 input) enumerate :: [a] -> [(Int, a)] enumerate xs = zip [0..length xs] xs