All checks were successful
continuous-integration/drone/push Build is passing
69 lines
1.8 KiB
Python
69 lines
1.8 KiB
Python
#!/usr/bin/env python3
|
|
from pathlib import Path
|
|
|
|
|
|
def part_1(input):
|
|
result = 0
|
|
gamma = 0
|
|
epsilon = 0
|
|
num_bits = len(input[0]) - 1
|
|
counts = [0] * num_bits
|
|
for line in input:
|
|
line = int(line, 2)
|
|
for i in range(num_bits):
|
|
shift = (num_bits - i - 1)
|
|
mask = 1 << shift
|
|
if mask & line:
|
|
counts[i] += 1
|
|
for count in counts:
|
|
gamma <<= 1
|
|
epsilon <<= 1
|
|
if len(input)/2 < count:
|
|
gamma |= 1
|
|
else:
|
|
epsilon |= 1
|
|
result = gamma * epsilon
|
|
print("Part 1 result:", result)
|
|
|
|
|
|
def part_2(input):
|
|
result = 0
|
|
num_bits = len(input[0]) - 1
|
|
oxy_list = input.copy()
|
|
co2_list = input.copy()
|
|
for i in range(num_bits):
|
|
shift = (num_bits - i - 1)
|
|
mask = 1 << shift
|
|
count = 0
|
|
for element in list(oxy_list):
|
|
if int(element, 2) & mask:
|
|
count += 1
|
|
digit = 0
|
|
if (len(oxy_list)/2) <= count:
|
|
digit = 1
|
|
for element in list(oxy_list):
|
|
if (int(element, 2) & mask) >> shift != digit:
|
|
if 1 < len(oxy_list):
|
|
oxy_list.remove(element)
|
|
count = 0
|
|
for element in list(co2_list):
|
|
if int(element, 2) & mask:
|
|
count += 1
|
|
digit = 1
|
|
if (len(co2_list)/2) <= count:
|
|
digit = 0
|
|
for element in list(co2_list):
|
|
if (int(element, 2) & mask) >> shift != digit:
|
|
if 1 < len(co2_list):
|
|
co2_list.remove(element)
|
|
result = int(oxy_list[0], 2) * int(co2_list[0], 2)
|
|
print("Part 2 result:", result)
|
|
|
|
|
|
input = list()
|
|
p = Path(__file__).with_name('input.txt')
|
|
with open(p) as f:
|
|
input = f.readlines()
|
|
part_1(input)
|
|
part_2(input)
|