| 123456789101112131415161718192021222324252627282930 |
- #!/usr/bin/env python3
- import sys
- def common(diag, i):
- return int(sum(n >> i & 1 for n in diag) / len(diag) + .5)
- def gamma(diag, width):
- return sum(common(diag, i) << i for i in range(width))
- def epsilon(diag, width):
- return sum((1 - common(diag, i)) << i for i in range(width))
- def rating(diag, width, most_common):
- i = width - 1
- while len(diag) > 1:
- bit = common(diag, i) ^ most_common
- diag = [n for n in diag if n >> i & 1 == bit]
- i -= 1
- return diag[0]
- def oxygen(diag, width):
- return rating(diag, width, True)
- def co2_scrub(diag, width):
- return rating(diag, width, False)
- diag = [int(line, 2) for line in sys.stdin]
- width = max(n.bit_length() for n in diag)
- print(gamma(diag, width) * epsilon(diag, width))
- print(oxygen(diag, width) * co2_scrub(diag, width))
|