| 123456789101112131415161718192021222324252627282930 |
- #!/usr/bin/env python3
- from functools import reduce
- from hashlib import md5
- from heapq import heappop, heappush
- def doors_open(path):
- a, b = md5(path.encode('ascii')).digest()[:2]
- quads = a >> 4, a & 0xf, b >> 4, b & 0xf
- return tuple(i for i, quad in enumerate(quads) if quad > 0xa)
- def walk(passcode):
- dx = 0, 0, -1, 1
- dy = -1, 1, -0, 0
- work = [(len(passcode), 6, 0, 0, passcode)]
- while work:
- pathlen, dist, x, y, path = heappop(work)
- if dist == 0:
- yield path[len(passcode):]
- else:
- for door in doors_open(path):
- newx = x + dx[door]
- newy = y + dy[door]
- if 0 <= newx < 4 and 0 <= newy < 4:
- newdist = dist - dx[door] - dy[door]
- newpath = path + 'UDLR'[door]
- heappush(work, (len(newpath), newdist, newx, newy, newpath))
- walker = walk('gdjjyniy')
- print(next(walker))
- print(len(reduce(lambda a, b: b, walker)))
|