68 lines
1.8 KiB
Python
68 lines
1.8 KiB
Python
|
def calculate_gamma(inp):
|
||
|
gamma_rate = [0] * len(inp[0])
|
||
|
for line in inp:
|
||
|
for index, char in enumerate(line):
|
||
|
gamma_rate[index] += int(char)
|
||
|
gamma_rate = [0 if x < len(inp) // 2 else 1 for x in gamma_rate]
|
||
|
return gamma_rate
|
||
|
|
||
|
|
||
|
def part1(inp):
|
||
|
gamma = calculate_gamma(inp)
|
||
|
epsilon = [0 if x == 1 else 1 for x in gamma]
|
||
|
# power consumption = dec(gamma_rate) * dec(epsilon_rate)
|
||
|
power = int("".join(str(x) for x in gamma), 2) * int("".join(str(x) for x in epsilon), 2)
|
||
|
print("Part 1, power consumption : ", power)
|
||
|
|
||
|
|
||
|
def calculate_most_common(inp, pos):
|
||
|
sum = 0
|
||
|
for line in inp:
|
||
|
sum += int(line[pos])
|
||
|
return 0 if sum < len(inp) // 2 else 1
|
||
|
|
||
|
|
||
|
def filter_oxygen(inp, pos, most_common):
|
||
|
result = []
|
||
|
for line in inp:
|
||
|
if int(line[pos]) == most_common:
|
||
|
result.append(line)
|
||
|
return result
|
||
|
|
||
|
|
||
|
def oxygen_rating(inp):
|
||
|
result = inp[:]
|
||
|
for pos in range(len(inp[0])):
|
||
|
most_common = calculate_most_common(result, pos)
|
||
|
result = filter_oxygen(result, pos, most_common)
|
||
|
if len(result) == 1:
|
||
|
return result
|
||
|
|
||
|
|
||
|
def co2_rating(inp):
|
||
|
result = inp[:]
|
||
|
for pos in range(len(inp[0])):
|
||
|
least_common = 1 - calculate_most_common(result, pos)
|
||
|
result = filter_oxygen(result, pos, least_common)
|
||
|
if len(result) == 1:
|
||
|
return result
|
||
|
|
||
|
|
||
|
def part2(inp):
|
||
|
oxygen = oxygen_rating(inp)
|
||
|
co2 = co2_rating(inp)
|
||
|
res = int("".join(str(x) for x in oxygen), 2) * int("".join(str(x) for x in co2), 2)
|
||
|
print(f"Part 2 : {res}")
|
||
|
|
||
|
|
||
|
|
||
|
def main(input_file):
|
||
|
with open(input_file) as f:
|
||
|
entries = [x.rstrip() for x in f.readlines()]
|
||
|
part1(entries)
|
||
|
part2(entries)
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
main("input.txt")
|