03_diagnostic.py 827 B

123456789101112131415161718192021222324252627282930
  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 gamma(diag, width):
  6. return sum(common(diag, i) << i for i in range(width))
  7. def epsilon(diag, width):
  8. return sum((1 - common(diag, i)) << i for i in range(width))
  9. def rating(diag, width, most_common):
  10. i = width - 1
  11. while len(diag) > 1:
  12. bit = common(diag, i) ^ most_common
  13. diag = [n for n in diag if n >> i & 1 == bit]
  14. i -= 1
  15. return diag[0]
  16. def oxygen(diag, width):
  17. return rating(diag, width, True)
  18. def co2_scrub(diag, width):
  19. return rating(diag, width, False)
  20. diag = [int(line, 2) for line in sys.stdin]
  21. width = max(n.bit_length() for n in diag)
  22. print(gamma(diag, width) * epsilon(diag, width))
  23. print(oxygen(diag, width) * co2_scrub(diag, width))