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