X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=adventofcode16%2Fapp%2Fadvent14.hs;fp=adventofcode16%2Fapp%2Fadvent14.hs;h=c6c092eead4f8a22eae0d4e05d7a21b7404fd9a6;hb=7267c0fa74db510564dc59587dd076372640114f;hp=0000000000000000000000000000000000000000;hpb=b66f0f79e01057fcb153ac16ce13ff50943a6d02;p=advent-of-code-16.git diff --git a/adventofcode16/app/advent14.hs b/adventofcode16/app/advent14.hs new file mode 100644 index 0000000..c6c092e --- /dev/null +++ b/adventofcode16/app/advent14.hs @@ -0,0 +1,43 @@ +module Main(main) where + +import Data.List (nub, tails, null) +import Data.Hash.MD5 (md5s, Str(..)) + +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 + +md5sequence :: [String] +md5sequence = [makeMd5 i | i <- [0..]] + where makeMd5 i = md5s (Str (salt ++ show i)) + +md5sequenceS :: [String] +md5sequenceS = [makeMd5 i | i <- [0..]] + where makeMd5 i = stretch $ md5s (Str (salt ++ show i)) + stretch h0 = foldr (\_ h -> md5s (Str 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