64 lines
1.4 KiB
Python
64 lines
1.4 KiB
Python
![]() |
#!/usr/bin/env python3
|
||
|
import sys, utils
|
||
|
|
||
|
def life_support_rating(l: list):
|
||
|
most, least = filter(l)
|
||
|
return int(most, 2) * int(least, 2)
|
||
|
|
||
|
def count(l: list):
|
||
|
counter = [0 for _ in range(len(l[0]))]
|
||
|
for line in l:
|
||
|
for i in range(len(line)):
|
||
|
if line[i] == '1':
|
||
|
counter[i] += 1
|
||
|
|
||
|
half_len = len(l) / 2
|
||
|
for i in range(len(counter)):
|
||
|
if counter[i] >= half_len:
|
||
|
counter[i] = ('1', '0')
|
||
|
else:
|
||
|
counter[i] = ('0', '1')
|
||
|
return counter
|
||
|
|
||
|
|
||
|
def filter(l):
|
||
|
pos = 0
|
||
|
most = l.copy()
|
||
|
least = l.copy()
|
||
|
while len(most) > 1:
|
||
|
counter = count(most)
|
||
|
i = 0
|
||
|
while i < len(most):
|
||
|
if len(most) == 1:
|
||
|
break
|
||
|
elif most[i][pos] != counter[pos][0]:
|
||
|
del most[i]
|
||
|
continue
|
||
|
i += 1
|
||
|
pos += 1
|
||
|
pos = 0
|
||
|
while len(least) > 1:
|
||
|
counter = count(least)
|
||
|
i = 0
|
||
|
while i < len(least):
|
||
|
if len(least) == 1:
|
||
|
break
|
||
|
elif least[i][pos] != counter[pos][1]:
|
||
|
del least[i]
|
||
|
continue
|
||
|
i += 1
|
||
|
pos += 1
|
||
|
return most[0], least[0]
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
if len(sys.argv) < 2:
|
||
|
print("please supply input file")
|
||
|
sys.exit()
|
||
|
|
||
|
f = utils.File(sys.argv[1])
|
||
|
|
||
|
print(life_support_rating(f.get_strings()))
|
||
|
|
||
|
|