17_vault.py 993 B

123456789101112131415161718192021222324252627282930
  1. #!/usr/bin/env python3
  2. from functools import reduce
  3. from hashlib import md5
  4. from heapq import heappop, heappush
  5. def doors_open(path):
  6. a, b = md5(path.encode('ascii')).digest()[:2]
  7. quads = a >> 4, a & 0xf, b >> 4, b & 0xf
  8. return tuple(i for i, quad in enumerate(quads) if quad > 0xa)
  9. def walk(passcode):
  10. dx = 0, 0, -1, 1
  11. dy = -1, 1, -0, 0
  12. work = [(len(passcode), 6, 0, 0, passcode)]
  13. while work:
  14. pathlen, dist, x, y, path = heappop(work)
  15. if dist == 0:
  16. yield path[len(passcode):]
  17. else:
  18. for door in doors_open(path):
  19. newx = x + dx[door]
  20. newy = y + dy[door]
  21. if 0 <= newx < 4 and 0 <= newy < 4:
  22. newdist = dist - dx[door] - dy[door]
  23. newpath = path + 'UDLR'[door]
  24. heappush(work, (len(newpath), newdist, newx, newy, newpath))
  25. walker = walk('gdjjyniy')
  26. print(next(walker))
  27. print(len(reduce(lambda a, b: b, walker)))