You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

46 lines
1.2KB

  1. import collections
  2. def render(grid, brush=None):
  3. if brush is None:
  4. brush = {v: v for v in grid.values()}
  5. if isinstance(brush, str):
  6. brush = {i: c for i, c in enumerate(brush)}
  7. xmin, *_, xmax = sorted(int(p.real) for p in grid)
  8. ymin, *_, ymax = sorted(int(p.imag) for p in grid)
  9. brush[None] = ' '
  10. rendered = ''
  11. for y in range(ymin, ymax + 1):
  12. for x in range(xmin, xmax + 1):
  13. rendered += brush[grid.get(complex(x, y))]
  14. rendered += '\n'
  15. return rendered
  16. def read_image(text):
  17. grid = collections.defaultdict(str)
  18. for y, line in enumerate(text.splitlines()):
  19. for x, cell in enumerate(line):
  20. grid[complex(x, y)] = cell
  21. return grid
  22. def shortest_path(start, end, move):
  23. seen = {}
  24. edge = {start: None}
  25. while end not in seen:
  26. seen.update(edge)
  27. edge = {
  28. adj: pos
  29. for pos in edge
  30. for adj in move(pos)
  31. if adj not in seen
  32. }
  33. if not edge:
  34. raise RuntimeError('Path not found', seen)
  35. path = []
  36. while end:
  37. path.append(end)
  38. end = seen[end]
  39. return path[::-1]