#!/usr/bin/python3 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() with open('input.txt') as fp: input = fp.readlines() part_1(input) part_2(input)