Finally finished the second half of day 3.
This commit is contained in:
		
							
								
								
									
										133
									
								
								2021/3/main2.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								2021/3/main2.py
									
									
									
									
									
										Normal file
									
								
							@@ -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
 | 
			
		||||
		Reference in New Issue
	
	Block a user