#!/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, encoding="utf-8") 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_num): print('identified numbers:') for i in range(10): print(f'{i} is {id_num[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 = {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 = {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}')