|
@@ -0,0 +1,30 @@
|
|
|
|
|
+#!/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))
|