05_lines.py 839 B

12345678910111213141516171819202122232425262728
  1. #!/usr/bin/env python3
  2. import sys
  3. from collections import defaultdict
  4. from itertools import repeat
  5. def parse(line):
  6. (x1, y1), (x2, y2) = (part.split(',') for part in line.split(' -> '))
  7. return int(x1), int(y1), int(x2), int(y2)
  8. def coords(a, b, c, d, diagonal):
  9. if a == b:
  10. yield from repeat(a, abs(d - c) + 1)
  11. elif diagonal or c == d:
  12. delta = -1 if a > b else 1
  13. yield from range(a, b + delta, delta)
  14. def overlaps(lines, diagonal):
  15. grid = defaultdict(int)
  16. for x1, y1, x2, y2 in lines:
  17. allx = coords(x1, x2, y1, y2, diagonal)
  18. ally = coords(y1, y2, x1, x2, diagonal)
  19. for x, y in zip(allx, ally):
  20. grid[(x, y)] += 1
  21. return sum(n > 1 for n in grid.values())
  22. lines = list(map(parse, sys.stdin))
  23. print(overlaps(lines, False))
  24. print(overlaps(lines, True))