2015 Day 04 in Haskell

This commit is contained in:
germax26 2024-12-03 00:24:29 +11:00
parent dbc69a8a6d
commit 055c95b9e3
Signed by: germax26
SSH Key Fingerprint: SHA256:N3w+8798IMWBt7SYH8G1C0iJlIa2HIIcRCXwILT5FvM
2 changed files with 26 additions and 3 deletions

23
2015/day04/day04.hs Normal file
View File

@ -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

6
aoc.hs
View File

@ -4,9 +4,9 @@ aocMain :: Show p => ([String] -> p) -> (p -> Int) -> (p -> Int) -> IO ()
aocMain parseFile part1 part2 = do aocMain parseFile part1 part2 = do
contents <- readFile "input.txt" contents <- readFile "input.txt"
let input = parseFile $ lines contents let input = parseFile $ lines contents
-- print $ "Input: " ++ show input -- putStrLn $ "Input: " ++ show input
print $ "Part 1: " ++ show (part1 input) putStrLn $ "Part 1: " ++ show (part1 input)
print $ "Part 2: " ++ show (part2 input) putStrLn $ "Part 2: " ++ show (part2 input)
enumerate :: [a] -> [(Int, a)] enumerate :: [a] -> [(Int, a)]
enumerate xs = zip [0..length xs] xs enumerate xs = zip [0..length xs] xs