Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def p1(file):
- total = 0
- for line in file:
- digits = line.split("|")[-1][1:-1].split(" ")
- total += len([d for d in digits if len(d) in [2, 3, 4, 7]])
- return total
- CERO = [0,1,2,4,5,6]
- UNO = [2,5]
- DOS = [0,2,3,4,6]
- TRES = [0,2,3,5,6]
- CUATRO = [1,2,3,5]
- CINCO = [0,1,3,5,6]
- SEIS = [0,1,3,4,5,6]
- SIETE = [0,2,5]
- OCHO = [0,1,2,3,4,5,6]
- NUEVE = [0,1,2,3,5,6]
- def get_int_from_segments(digit, segments_map):
- sorted_segments = sorted([segments_map[s] for s in digit])
- if sorted_segments == CERO: return 0
- if sorted_segments == UNO: return 1
- if sorted_segments == DOS: return 2
- if sorted_segments == TRES: return 3
- if sorted_segments == CUATRO: return 4
- if sorted_segments == CINCO: return 5
- if sorted_segments == SEIS: return 6
- if sorted_segments == SIETE: return 7
- if sorted_segments == OCHO: return 8
- if sorted_segments == NUEVE: return 9
- assert False
- def get_integer(digits, segments_map):
- return sum([get_int_from_segments(d, segments_map) * 10**(len(digits)-1-i) for i,d in enumerate(digits)])
- def segments_map_inference(digits):
- known_number_1 = set(list(filter(lambda x: len(x) == 2, digits))[0])
- known_number_4 = set(list(filter(lambda x: len(x) == 4, digits))[0])
- known_number_7 = set(list(filter(lambda x: len(x) == 3, digits))[0])
- known_number_8 = set(list(filter(lambda x: len(x) == 7, digits))[0])
- unknown_numbers_5 = [set(d) for d in digits if len(d) == 5]
- unknown_numbers_6 = [set(d) for d in digits if len(d) == 6]
- intersection_unknown_5 = unknown_numbers_5[0].intersection(unknown_numbers_5[1].intersection(unknown_numbers_5[2]))
- intersection_unknown_6 = unknown_numbers_6[0].intersection(unknown_numbers_6[1].intersection(unknown_numbers_6[2]))
- sl_0 = known_number_7 - known_number_1
- sl_6 = intersection_unknown_5 - known_number_4 - known_number_7
- sl_3 = intersection_unknown_5 - sl_6 - known_number_7
- sl_1 = known_number_4 - known_number_1 - sl_3
- sl_5 = intersection_unknown_6.intersection(known_number_1)
- sl_2 = known_number_1 - sl_5
- sl_4 = known_number_8 - sl_0 - sl_1 - sl_2 - sl_3 - sl_5 - sl_6
- return {
- list(sl_0)[0]: 0, list(sl_1)[0]: 1, list(sl_2)[0]: 2, list(sl_3)[0]: 3, list(sl_4)[0]: 4,
- list(sl_5)[0]: 5, list(sl_6)[0]: 6,
- }
- def p2(file):
- total = 0
- for line in file:
- patterns, digits = list(map(lambda x: x.strip().split(" "), line[:-1].split("|")))
- total += get_integer(digits, segments_map_inference(patterns))
- return total
- with open("day8.in") as file:
- print(p2(file))
Advertisement
Add Comment
Please, Sign In to add comment