usesbiggerwords

AoC 2021 Day 8

Dec 8th, 2021
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.63 KB | None | 0 0
  1. import os
  2. from collections import Counter
  3. import timeit
  4.  
  5.  
  6. def read_and_init(fn):
  7.     with open(fn, 'r') as f:
  8.         lines = f.read().splitlines()
  9.     entries = {}
  10.     i = 0
  11.     for line in lines:
  12.         patterns, digits = line.split(' | ')
  13.         entries[i] = {'patterns': patterns.split(), 'digits': digits.split()}
  14.         i += 1
  15.     return entries
  16.  
  17.  
  18. def part1(entries: list) -> int:
  19.     segments = {0: 6, 1: 2, 2: 5, 3: 5, 4: 4, 5: 5, 6: 6, 7: 3, 8: 7, 9: 6}
  20.     counter = Counter(segments.values())
  21.     uniques = [key for key in counter if counter[key] == 1]
  22.     total_uniques = 0
  23.     for entry in entries:
  24.         digit_lengths = [len(d) for d in entries[entry]['digits']]
  25.         entry_uniques = [dl for dl in digit_lengths if dl in uniques]
  26.         total_uniques += len(entry_uniques)
  27.     return total_uniques
  28.  
  29.  
  30. def part2(entries):
  31.     readouts = []
  32.     numerals = {i: '' for i in range(10)}
  33.     for entry in entries:
  34.         patterns = entries[entry]['patterns']
  35.         digits = [''.join(sorted(digit)) for digit in entries[entry]['digits']]
  36.         patterns.sort()
  37.         # start with uniques
  38.         numerals[1] = [pattern for pattern in patterns if len(pattern) == 2][0]
  39.         numerals[4] = [pattern for pattern in patterns if len(pattern) == 4][0]
  40.         numerals[7] = [pattern for pattern in patterns if len(pattern) == 3][0]
  41.         numerals[8] = [pattern for pattern in patterns if len(pattern) == 7][0]
  42.         fives = [pattern for pattern in patterns if len(pattern) == 5]
  43.         sixes = [pattern for pattern in patterns if len(pattern) == 6]
  44.         numerals[6] = [pattern for pattern in sixes if len(
  45.             set(numerals[1]) - (set(pattern) & set(numerals[1]))) == 1][0]
  46.         sixes.remove(numerals[6])
  47.         numerals[5] = [pattern for pattern in fives if len(set(numerals[6]) - set(pattern)) == 1][0]
  48.         fives.remove(numerals[5])
  49.         numerals[2] = [pattern for pattern in fives if len(set(pattern) - set(numerals[1])) == 4][0]
  50.         fives.remove(numerals[2])
  51.         numerals[3] = fives.pop()
  52.         numerals[0] = [pattern for pattern in sixes if len(set(pattern) - set(numerals[4])) == 3][0]
  53.         sixes.remove(numerals[0])
  54.         numerals[9] = sixes.pop()
  55.         swapped_numerals = {''.join(sorted(v)): k for k, v in numerals.items()}
  56.         decoded_digits = [swapped_numerals[digit] for digit in digits]
  57.         readout = int(''.join(map(str, decoded_digits)))
  58.         readouts.append(readout)
  59.     return sum(readouts)
  60.  
  61.  
  62. es = read_and_init(os.path.dirname(__file__) + '\\in.txt')
  63. result = part1(es)
  64. print('Part 1:', result)
  65. result = part2(es)
  66. print('Part 2:', result)
Advertisement
Add Comment
Please, Sign In to add comment