20_firewall.py 821 B

123456789101112131415161718192021222324
  1. #!/usr/bin/env python3
  2. import sys
  3. def scan(block_ranges, maxval):
  4. starts, ends = (sorted(l, reverse=True) for l in zip(*block_ranges))
  5. open_start = blocked = 0
  6. while starts:
  7. if starts[-1] <= ends[-1]:
  8. start = starts.pop()
  9. if blocked == 0 and start > 0 and open_start >= start - 1:
  10. yield open_start, start - 1
  11. blocked += 1
  12. else:
  13. end = ends.pop()
  14. blocked -= 1
  15. if blocked == 0 and end + 1 != starts[-1]:
  16. open_start = end + 1
  17. if ends[0] < maxval:
  18. yield ends[0] + 1, maxval
  19. block_ranges = [tuple(map(int, line.split('-'))) for line in sys.stdin]
  20. open_ranges = list(scan(block_ranges, 4294967295))
  21. print(open_ranges[0][0])
  22. print(sum(end - start + 1 for start, end in open_ranges))