My Advent of Code solutions in Python. kevinyap.ca/2019/12/going-fast-in-advent-of-code/
advent-of-code python
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add solution for 2016/14

+70
+69
2016/day14.py
··· 1 + import sys 2 + import fileinput 3 + from hashlib import md5 4 + from collections import defaultdict 5 + 6 + from utils import memoize 7 + 8 + 9 + @memoize 10 + def salty_md5(salt, i): 11 + return md5(salt + str(i)).hexdigest() 12 + 13 + 14 + @memoize 15 + def stretched_md5(salt, i): 16 + h = salty_md5(salt, i) 17 + for _ in range(2016): 18 + h = md5(h).hexdigest() 19 + 20 + return h 21 + 22 + 23 + def first_triple(s): 24 + for i in range(len(s) - 2): 25 + a, b, c = s[i:i+3] 26 + if a == b == c: 27 + return a 28 + 29 + 30 + def all_quintuplets(s): 31 + for i in range(len(s) - 4): 32 + a, b, c, d, e = s[i:i+5] 33 + if a == b == c == d == e: 34 + yield a 35 + 36 + 37 + def find_pad_key_64(salt, hash_fn): 38 + valid_keys = 0 39 + quintuplets = defaultdict(set) 40 + i = 0 41 + 42 + while True: 43 + digest = hash_fn(salt, i) 44 + 45 + for quint in all_quintuplets(digest): 46 + quintuplets[i].add(quint) 47 + 48 + if i >= 1000: 49 + n = i - 1000 50 + triple = first_triple(hash_fn(salt, n)) 51 + for j in range(n + 1, n + 1001): 52 + if triple in quintuplets[j]: 53 + valid_keys += 1 54 + sys.stdout.write('.') 55 + sys.stdout.flush() 56 + 57 + if valid_keys >= 64: 58 + return n 59 + 60 + break 61 + 62 + i += 1 63 + 64 + 65 + if __name__ == "__main__": 66 + SALT = fileinput.input()[0].strip() 67 + 68 + print "Index of 64th one-time pad key", find_pad_key_64(SALT, salty_md5) 69 + print "Index of key-stretched pad key", find_pad_key_64(SALT, stretched_md5)
+1
2016/input14.txt
··· 1 + ngcjuoqr