You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
1.8 KiB
Python
65 lines
1.8 KiB
Python
#!/usr/bin/env python3
|
|
|
|
def is_bit_set(integer, bit_index):
|
|
return bool(integer & (1 << bit_index))
|
|
|
|
def get_mcv(_input):
|
|
input_length = len(_input)
|
|
popcounts = [0 for bit in range(len(_input[0].strip()))]
|
|
#print(popcounts)
|
|
for line in _input:
|
|
popcounts = list(map(int.__add__, popcounts, [int(bit) for bit in line.strip()]))
|
|
mcv = []
|
|
for val in popcounts:
|
|
if val >= (input_length/2):
|
|
mcv.append(1)
|
|
else:
|
|
mcv.append(0)
|
|
return mcv
|
|
|
|
def main():
|
|
content = open('input', 'r').readlines()
|
|
#mcv = get_mcv(content)
|
|
# mask = (1 << len(popcounts)) - 1
|
|
# gamma_rate = int(gamma_rate, 2)
|
|
# epsilon_rate = gamma_rate ^ mask
|
|
|
|
# print(f'gamma: {bin(gamma_rate)}')
|
|
# print(f'epsil: {bin(epsilon_rate)}')
|
|
#print(f'mcv: {mcv}')
|
|
bit_length = len(content[0].strip())
|
|
oxy_input = content
|
|
while len(oxy_input) > 1:
|
|
offset = 0
|
|
while offset < bit_length:
|
|
mcv = get_mcv(oxy_input)
|
|
print(mcv)
|
|
print(f'length {len(oxy_input)} offset {offset} mcv {mcv[offset]} ')
|
|
oxy_input = [x for x in oxy_input if int(x[offset]) == mcv[offset]]
|
|
if len(oxy_input) == 1:
|
|
break
|
|
offset += 1
|
|
oxygen_value = int(oxy_input[0].strip(), 2)
|
|
|
|
co_input = content
|
|
while len(co_input) > 1:
|
|
offset = 0
|
|
while offset < bit_length:
|
|
print(f'length {len(co_input)} offset {offset} mcv {mcv[offset]} ')
|
|
mcv = get_mcv(co_input)
|
|
print(mcv)
|
|
co_input = [x for x in co_input if int(x[offset]) != mcv[offset]]
|
|
if len(co_input) == 1:
|
|
break
|
|
offset += 1
|
|
co_value = int(co_input[0].strip(), 2)
|
|
print(co_value * oxygen_value)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|