{-# OPTIONS_GHC -Wno-x-partial #-} 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