Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

p17.py 1.8KB

5 år sedan
5 år sedan
5 år sedan
5 år sedan
5 år sedan
5 år sedan
5 år sedan
5 år sedan
5 år sedan
5 år sedan
5 år sedan
5 år sedan
5 år sedan
5 år sedan
5 år sedan
5 år sedan
5 år sedan
5 år sedan
5 år sedan
5 år sedan
5 år sedan
5 år sedan
5 år sedan
5 år sedan
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import collections
  2. import re
  3. import sys
  4. def read_in():
  5. grid = collections.defaultdict(lambda: ' ')
  6. for _ in sys.stdin.read().splitlines():
  7. _ = _.replace(',', ';')
  8. _ = re.sub(r'(\d+)\.\.(\d+)', r'range(\1, \2 + 1)', _)
  9. _ = re.sub(r'=(\d+)', r'=[\1]', _)
  10. exec(_, globals())
  11. grid.update({(X, Y): '#' for X in x for Y in y}) # noqa
  12. return grid
  13. def write_out(grid, path):
  14. xmin, *_, xmax = sorted(x for x, y in grid)
  15. ymin, *_, ymax = sorted(y for x, y in grid)
  16. text = '\n'.join(
  17. ''.join(grid[x, y] for x in range(xmin - 5, xmax + 5))
  18. for y in range(ymin, ymax + 1)
  19. )
  20. with open('p17out.dat', 'w') as fp:
  21. fp.write(text)
  22. def flow(grid, start, ymax):
  23. stack = [start]
  24. while stack:
  25. x, y = stack.pop()
  26. grid[x, y] = '~'
  27. if y >= ymax:
  28. break
  29. for dx, dy in [(1, 0), (-1, 0), (0, 1)]:
  30. new = x + dx, y + dy
  31. if dy == 1 and grid[new] == '|':
  32. stack.clear()
  33. break
  34. if grid[new] == ' ':
  35. stack.append(new)
  36. drain(grid, (x, y), ymax)
  37. def drain(grid, end, ymax):
  38. stack = [end]
  39. while stack:
  40. x, y = stack.pop()
  41. grid[x, y] = '|'
  42. left, right, below = grid[x - 1, y], grid[x + 1, y], grid[x, y + 1]
  43. if all([right == ' ', left == '|', below != '|']):
  44. flow(grid, (x + 1, y), ymax)
  45. for dx, dy in [(-1, 0), (1, 0), (0, -1)]:
  46. new = x + dx, y + dy
  47. if grid[new] == '~':
  48. stack.append(new)
  49. grid = read_in()
  50. ymin, *_, ymax = sorted(y for x, y in grid if grid[x, y] == '#')
  51. flow(grid, (500, ymin), ymax)
  52. counter = collections.Counter(grid.values())
  53. print(counter['~'] + counter['|'])
  54. print(counter['~'])
  55. write_out(grid, 'y2018/p17out.dat')