advent_of_code/8/8_2.py

82 lines
2.7 KiB
Python
Raw Normal View History

2021-12-09 00:02:38 +01:00
#!/usr/bin/env python
# 2021 - Advent Of Code - 8 part 2
# acedgfb cdfbe gcdfa fbcad dab cefabd cdfgeb eafb cagedb ab | cdfeb fcadb cdfeb cdbaf
def parse_file(file):
numbers_list = []
outputs = []
with open(file) as f:
for line in f.readlines():
numbers, output = line.strip().split(' | ')
numbers_list.append(numbers)
outputs.append(output)
return numbers_list, outputs
def print_numbers(id):
print('identified numbers:')
for i in range(10):
print(f'{i} is {id[i]}')
# entries, displays = parse_file('input_example1.txt')
entries, displays = parse_file('input.txt')
output_sum = 0
for entry, display in zip(entries, displays):
identified_numbers = [-1] * 10
words = entry.split(' ')
# size of pattern for 1, 4, 7 and 8 is unique
identified_numbers[1] = set([x for x in words if len(x) == 2][0])
identified_numbers[7] = set([x for x in words if len(x) == 3][0])
identified_numbers[4] = set([x for x in words if len(x) == 4][0])
identified_numbers[8] = set([x for x in words if len(x) == 7][0])
# size 6 pattern that doesn't include 4, nor 1 -> 6
# size 6 pattern that includes 4 and 1 -> 9
# the remaining size 6 pattern -> 0
size_six = set([x for x in words if len(x) == 6])
for s in size_six:
if identified_numbers[1].issubset(s) and identified_numbers[4].issubset(s):
identified_numbers[9] = s
if not identified_numbers[1].issubset(s) and not identified_numbers[4].issubset(s):
identified_numbers[6] = s
size_six.remove(identified_numbers[9])
identified_numbers[9] = set(identified_numbers[9])
size_six.remove(identified_numbers[6])
identified_numbers[6] = set(identified_numbers[6])
identified_numbers[0] = set(next(iter(size_six)))
# size 5 pattern that includes 7 -> 3
# size 5 pattern that only missed one element to be a 9 pattern -> 5
# the remaining size 5 pattern -> 2
size_five = set([x for x in words if len(x) == 5])
for s in size_five:
if identified_numbers[7].issubset(s):
identified_numbers[3] = s
size_five.remove(identified_numbers[3])
identified_numbers[3] = set(identified_numbers[3])
for s in size_five:
if len(identified_numbers[9] - set(s)) == 1:
identified_numbers[5] = s
break
size_five.remove(identified_numbers[5])
identified_numbers[5] = set(identified_numbers[5])
identified_numbers[2] = set(next(iter(size_five)))
# print_numbers(identified_numbers)
words = display.split(' ')
str_num = ""
for d in words:
n = identified_numbers.index(set(d))
str_num += str(n)
output_sum += int(str_num)
print(f'output_sum: {output_sum}')