03_diagnostic.py 675 B

123456789101112131415161718192021222324
  1. #!/usr/bin/env python3
  2. import sys
  3. def common(diag, i):
  4. return int(sum(n >> i & 1 for n in diag) / len(diag) + .5)
  5. def rating(diag, width, flip_common):
  6. i = width - 1
  7. while len(diag) > 1:
  8. expected = common(diag, i) ^ flip_common
  9. diag = [n for n in diag if n >> i & 1 == expected]
  10. i -= 1
  11. return diag[0]
  12. diag = [int(line, 2) for line in sys.stdin]
  13. width = max(n.bit_length() for n in diag)
  14. gamma = sum(common(diag, i) << i for i in range(width))
  15. epsilon = sum((1 - common(diag, i)) << i for i in range(width))
  16. print(gamma * epsilon)
  17. oxygen = rating(diag, width, True)
  18. co2_scrub = rating(diag, width, False)
  19. print(oxygen * co2_scrub)