X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=adventofcode16%2Fapp%2Fadvent14c.hs;fp=adventofcode16%2Fapp%2Fadvent14c.hs;h=0000000000000000000000000000000000000000;hb=3a26b187d5dc23b05fb73daabe52a92976a7a3c7;hp=ea699ed114df2f1cd27785ceab559ec0b6196a4c;hpb=eb87b3a000ef3019d99828b71068c8cfcd9d3caa;p=advent-of-code-16.git diff --git a/adventofcode16/app/advent14c.hs b/adventofcode16/app/advent14c.hs deleted file mode 100644 index ea699ed..0000000 --- a/adventofcode16/app/advent14c.hs +++ /dev/null @@ -1,47 +0,0 @@ -module Main(main) where - -import Data.List (nub, tails) -import Data.ByteString.Char8 (pack) -import Crypto.Hash (hash, Digest, MD5) - -salt = "yjdafjpo" --- salt = "abc" - -main :: IO () -main = do - part1 - part2 - -part1 :: IO () -part1 = print $ head $ drop 63 $ filter (\i -> possibleKey sq i && confirmKey sq i) [0..] - where sq = md5sequence - -part2 :: IO () -part2 = print $ head $ drop 63 $ filter (\i -> possibleKey sq i && confirmKey sq i) [0..] - where sq = md5sequenceS - -getHash :: String -> String -getHash bs = show (hash $ pack bs :: Digest MD5) - -md5sequence :: [String] -md5sequence = [makeMd5 i | i <- [0..]] - where makeMd5 i = getHash (salt ++ show i) - -md5sequenceS :: [String] -md5sequenceS = [makeMd5 i | i <- [0..]] - where makeMd5 i = stretch $ getHash (salt ++ show i) - stretch h0 = foldr (\_ h -> getHash h) h0 [1..2016] - -possibleKey :: [String] -> Int-> Bool -possibleKey s = not . null . repeats 3 . ((!!) s) - -confirmKey :: [String] -> Int -> Bool -confirmKey s i = any (confirmation) $ take 1000 $ drop (i+1) s - where c = head $ repeats 3 $ s!!i - confirmation m = c `elem` (repeats 5 m) - -repeats :: Int -> String -> [String] -repeats n = filter (null . tail) . map (nub) . substrings n - -substrings :: Int -> [a] -> [[a]] -substrings l = filter (\s -> (length s) == l) . map (take l) . tails