diff --git a/2021/3/main2.py b/2021/3/main2.py new file mode 100644 index 0000000..b5c3449 --- /dev/null +++ b/2021/3/main2.py @@ -0,0 +1,133 @@ +bits = [] + +gamma = 0 +epsilon = 0 + +gamma_str = '' +epsilon_str = '' + +lines = [] +oxy = [] +co2 = [] + +def NarrowDown(oxy, co2, index): + # # DEBUG(dev): + # print len(oxy), ", ", len(co2) + # print "" + + if(len(oxy) > 1): # if we already found it, just move along + # Look at `index` in each remaining value; count how many have a ZERO vs. a ONE: + num_ones = 0 + num_zeros = 0 + new_oxy = [] + for i,o in enumerate(oxy): + if(o[index] == '1'): + num_ones = num_ones + 1 + else: + num_zeros = num_zeros + 1 + + # Oxy needs the majority, keeping the ONEs if there's a tie: + if(num_ones < num_zeros): + for o in oxy: + if(o[index] == '0'): + new_oxy.append(o) + else: + for o in oxy: + if(o[index] == '1'): + new_oxy.append(o) + oxy = list(new_oxy) + + if(len(co2) > 1): # if we already found it, just move along + # Look at `index` in each remaining value; count how many have a ZERO vs. a ONE: + num_ones = 0 + num_zeros = 0 + new_co2 = [] + for i,o in enumerate(co2): + if(o[index] == '1'): + num_ones = num_ones + 1 + else: + num_zeros = num_zeros + 1 + + # Co2 needs the minority, keeping the ZEROs if there's a tie: + if(num_ones < num_zeros): + for c in co2: + if(c[index] == '1'): + new_co2.append(c) + else: + for c in co2: + if(c[index] == '0'): + new_co2.append(c) + co2 = list(new_co2) + + # if we're down to one number in BOTH LISTS, we're done + if(len(oxy) == 1 and len(co2) == 1): + return oxy[0],co2[0] + + # otherwise, pass both remaining lists on, move over one index, and continue narrowing down: + return NarrowDown(oxy, co2, (index + 1)) + + + +#### MAIN EXECUTION #### +with open('data', 'r') as fp: + for line in fp: + lines.append(line.strip()) + +# NOTE(dev): We assume all lines are the same length +for i in range(0, len(lines[0])): + bits.append(0) + +# # DEBUG(dev): +# test = fp.readline() +# for i in range(0, len(test)): +# print test[i] + +for line in lines: + for i in range(0, len(line.strip())): + if(line[i] == '1'): + bits[i] = bits[i] + 1 + else: + bits[i] = bits[i] - 1 + +for i in range(0, len(bits)): + ch = '1' + if(bits[i] < 0): + ch = '0' + gamma_str = gamma_str + ch + +# # DEBUG(dev): +# for i in range(1, len(gamma_str)+1): +# print gamma_str[-i] + +# NOTE(dev): Have to do (i+1) because we're going backwards, which starts at -1 +for i in range(0, len(gamma_str)): + if(gamma_str[-(i+1)] == '1'): + gamma = gamma + pow(2,i) + else: + epsilon = epsilon + pow(2,i) + +# print " bits: ", bits +print " gamma: ", gamma +print "epsilon: ", epsilon +print " POWER: ", gamma * epsilon + +oxy = list(lines) +co2 = list(lines) + +oxy_str,co2_str = NarrowDown(oxy, co2, 0) +oxy_value = 0 +co2_value = 0 + +# convert binary string representation to decimal +for i in range(0, len(oxy_str)): + if(oxy_str[-(i+1)] == '1'): + oxy_value = oxy_value + pow(2,i) + +# convert binary string representation to decimal +for i in range(0, len(co2_str)): + if(co2_str[-(i+1)] == '1'): + co2_value = co2_value + pow(2,i) + +print "oxy: ", oxy_value +print "co2: ", co2_value +print " : ", oxy_value * co2_value