--- /dev/null
+#include <stdio.h>
+
+int main(void)
+{
+ int bits[100] = {0};
+ int i = 0, maxi = 0, c;
+ while ((c = getchar()) != EOF) {
+ if (c == '0')
+ bits[i++] -= 1;
+ else if (c == '1')
+ bits[i++] += 1;
+ else if (c == '\n')
+ i = 0;
+ maxi = i > maxi ? i : maxi;
+ }
+
+ int gamma = 0, epsilon = 0;
+ for (int j = 0; j<maxi; j++) {
+ gamma *= 2;
+ epsilon *= 2;
+ if (bits[j] > 0)
+ gamma++;
+ else
+ epsilon++;
+ }
+ printf("%d\n", gamma*epsilon);
+ return 0;
+}
--- /dev/null
+#include <stdio.h>
+#include <stdbool.h>
+
+#define bitread(value, bit) (((value) >> (bit)) & 0x01)
+
+int incremental_search(unsigned numbers[], int len, int bits, bool inv)
+{
+ //Copy for the initial search
+ int cur[len];
+ int curlen;
+ for (curlen = 0; curlen<len; curlen++)
+ cur[curlen] = numbers[curlen];
+
+ for (int bit = bits-1; bit >= 0 || curlen > 1; bit--) {
+ //Determine 0 1 distribution
+ int dist = 0;
+ for (int i = 0; i<curlen; i++)
+ dist += bitread(cur[i], bit) == 0 ? -1 : 1;
+
+ dist = dist >= 0;
+ dist = inv ? 1-dist : dist;
+
+ //Filter out numbers
+ int newcurlen = 0;
+ for (int i = 0; i<curlen; i++)
+ if (bitread(cur[i], bit) == dist)
+ cur[newcurlen++] = cur[i];
+ curlen = newcurlen;
+ }
+ return cur[0];
+}
+
+int main(void)
+{
+ unsigned numbers[2000] = {0};
+ int c = 0, y = 0, maxbits = 0, bits = 0;
+ while ((c = getchar()) != EOF) {
+ if (c == '0') {
+ numbers[y] = numbers[y]*2;
+ bits++;
+ } else if (c == '1') {
+ numbers[y] = numbers[y]*2+1;
+ bits++;
+ } else if (c == '\n') {
+ maxbits = bits > maxbits ? bits : maxbits;
+ bits = 0;
+ y++;
+ }
+ }
+
+ int oxygen = incremental_search(numbers, y, maxbits, false);
+ int co2 = incremental_search(numbers, y, maxbits, true);
+
+ printf("%d\n", oxygen*co2);
+ return 0;
+}