Guest User

Untitled

a guest
Dec 9th, 2021
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.60 KB | None | 0 0
  1. def p1(file):
  2.     total = 0
  3.     for line in file:
  4.         digits = line.split("|")[-1][1:-1].split(" ")
  5.         total += len([d for d in digits if len(d) in [2, 3, 4, 7]])
  6.     return total
  7.  
  8. CERO = [0,1,2,4,5,6]
  9. UNO = [2,5]
  10. DOS = [0,2,3,4,6]
  11. TRES = [0,2,3,5,6]
  12. CUATRO = [1,2,3,5]
  13. CINCO = [0,1,3,5,6]
  14. SEIS = [0,1,3,4,5,6]
  15. SIETE = [0,2,5]
  16. OCHO = [0,1,2,3,4,5,6]
  17. NUEVE = [0,1,2,3,5,6]
  18.  
  19. def get_int_from_segments(digit, segments_map):
  20.     sorted_segments = sorted([segments_map[s] for s in digit])
  21.     if sorted_segments == CERO: return 0
  22.     if sorted_segments == UNO: return 1
  23.     if sorted_segments == DOS: return 2
  24.     if sorted_segments == TRES: return 3
  25.     if sorted_segments == CUATRO: return 4
  26.     if sorted_segments == CINCO: return 5
  27.     if sorted_segments == SEIS: return 6
  28.     if sorted_segments == SIETE: return 7
  29.     if sorted_segments == OCHO: return 8
  30.     if sorted_segments == NUEVE: return 9
  31.     assert False
  32.  
  33. def get_integer(digits, segments_map):
  34.     return sum([get_int_from_segments(d, segments_map) * 10**(len(digits)-1-i) for i,d in enumerate(digits)])
  35.  
  36. def segments_map_inference(digits):
  37.     known_number_1 = set(list(filter(lambda x: len(x) == 2, digits))[0])
  38.     known_number_4 = set(list(filter(lambda x: len(x) == 4, digits))[0])
  39.     known_number_7 = set(list(filter(lambda x: len(x) == 3, digits))[0])
  40.     known_number_8 = set(list(filter(lambda x: len(x) == 7, digits))[0])
  41.     unknown_numbers_5 = [set(d) for d in digits if len(d) == 5]
  42.     unknown_numbers_6 = [set(d) for d in digits if len(d) == 6]
  43.  
  44.     intersection_unknown_5 = unknown_numbers_5[0].intersection(unknown_numbers_5[1].intersection(unknown_numbers_5[2]))
  45.     intersection_unknown_6 = unknown_numbers_6[0].intersection(unknown_numbers_6[1].intersection(unknown_numbers_6[2]))
  46.     sl_0 = known_number_7 - known_number_1
  47.     sl_6 = intersection_unknown_5 - known_number_4 - known_number_7
  48.     sl_3 = intersection_unknown_5 - sl_6 - known_number_7
  49.     sl_1 = known_number_4 - known_number_1 - sl_3
  50.     sl_5 = intersection_unknown_6.intersection(known_number_1)
  51.     sl_2 = known_number_1 - sl_5
  52.     sl_4 = known_number_8 - sl_0 - sl_1 - sl_2 - sl_3 - sl_5 - sl_6
  53.  
  54.     return {
  55.         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,
  56.         list(sl_5)[0]: 5, list(sl_6)[0]: 6,
  57.     }
  58.  
  59. def p2(file):
  60.     total = 0
  61.     for line in file:
  62.         patterns, digits = list(map(lambda x: x.strip().split(" "), line[:-1].split("|")))
  63.         total += get_integer(digits, segments_map_inference(patterns))
  64.     return total
  65.  
  66.  
  67. with open("day8.in") as file:
  68.     print(p2(file))
Advertisement
Add Comment
Please, Sign In to add comment