15_beacon.py 1.1 KB

12345678910111213141516171819202122232425262728293031323334
  1. #!/usr/bin/env python3
  2. import sys
  3. import re
  4. def intervals(sensors, y):
  5. for sx, sy, bx, by in sensors:
  6. dx = abs(sx - bx) + abs(sy - by) - abs(sy - y)
  7. if dx >= 0:
  8. yield sx - dx, sx + dx
  9. def coverage(sensors, y):
  10. l, r = zip(*intervals(sensors, y))
  11. beacons = len(set(bx for _, _, bx, by in sensors if by == y))
  12. return max(r) + 1 - min(l) - beacons
  13. def border(x, y, radius):
  14. for dx in range(radius + 2):
  15. dy = radius + 1 - dx
  16. yield x + dx, y + dy
  17. yield x + dx, y - dy
  18. yield x - dx, y + dy
  19. yield x - dx, y - dy
  20. def frequency(sensors, limit):
  21. rad = [(sx, sy, abs(sx - bx) + abs(sy - by)) for sx, sy, bx, by in sensors]
  22. for sensor in rad:
  23. for x, y in border(*sensor):
  24. if 0 <= x <= limit and 0 <= y <= limit and \
  25. all(abs(x - sx) + abs(y - sy) > r for sx, sy, r in rad):
  26. return x * 4000000 + y
  27. sensors = [tuple(map(int, re.findall(r'-?\d+', line))) for line in sys.stdin]
  28. print(coverage(sensors, 2000000))
  29. print(frequency(sensors, 4000000))