56 lines
1.3 KiB
Python
56 lines
1.3 KiB
Python
VERBOSE = False
|
|
|
|
def get_input(sample = False, part = 1):
|
|
global n_bits
|
|
with open(f'sample_p{part}' if sample else 'input', 'r') as f:
|
|
tmp = f.readlines()
|
|
n_bits = len(tmp[0]) - 1
|
|
return [int(line.strip(), 2) for line in tmp]
|
|
|
|
def verbose(s):
|
|
if VERBOSE:
|
|
print(s)
|
|
|
|
|
|
def filter_by(most, inp):
|
|
global n_bits
|
|
for i in range(n_bits - 1, -1, -1):
|
|
dic = {0: [], 1: []}
|
|
for n in inp:
|
|
dic[(n >> i) & 1].append(n)
|
|
|
|
verbose(dic)
|
|
if len(dic[1]) >= len(dic[0]):
|
|
inp = dic[1 if most else 0][:]
|
|
else:
|
|
inp = dic[0 if most else 1][:]
|
|
|
|
if len(inp) == 1:
|
|
return inp[0]
|
|
|
|
def result(inp, part = 1):
|
|
global n_bits
|
|
if part == 1:
|
|
# print(n_bits)
|
|
tot = len(inp)
|
|
gamma = eps = 0
|
|
for i in range(n_bits):
|
|
ones = 0
|
|
for n in inp:
|
|
ones += (n >> i) & 1
|
|
|
|
a = 1 if ones > tot/2 else 0
|
|
gamma |= a << i
|
|
|
|
eps = (2**n_bits - 1) ^ gamma
|
|
return eps * gamma
|
|
else:
|
|
ox = filter_by(True, inp)
|
|
co = filter_by(False, inp)
|
|
verbose(f"{ox = }, {co = }")
|
|
return ox * co
|
|
|
|
|
|
if __name__ == "__main__":
|
|
print(result(get_input(), part = 2))
|