Advent of Code: Day 4


Part 1: Mine Adventcoins. Basically, find the lowest integer such that the string {prefix}{integer} has an md5 hash with at least 5 leading zeros. 123

def naturals(i = 0):
    while True:
        yield i
        i += 1

def mine(prefix, length):
    for i in naturals(1):
        coin = '{prefix}{suffix}'.format(prefix = prefix, suffix = i).encode('utf-8')
        hash = hashlib.md5(coin).hexdigest()
        if all(c == '0' for c in hash[0:length]):
            return (i, hash)

print(mine(sys.argv[1], 5))

naturals is code that I’ve used on a number of previous occasions and basically stole borrowed from Racket’s n-naturals . It allows you to iterate indefinitely over the natural numbers. Then, just hash and look for enough leading zeros.

Part 2: Do the same thing, only with six leading zeros.

Nothing changes; just change the length parameter and wait a bit longer. Moderns computers can still crunch through a whole heck of a lot of hashes (9958218 for my particular input) in next to no time at all.

  1. This is actually roughly exactly how Bitcoin mining works. [return]
  2. I should post about that sometime. [return]
  3. Oh hey, I did [return]