-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathday8.py
48 lines (32 loc) · 1.44 KB
/
day8.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from collections import Counter, defaultdict
entries = [[[pattern for pattern in part.split(' ')] for part in line.strip().split(' | ')] for line in open('2021//input//day8.txt').readlines()]
number_of = {'ABCEFG': '0', 'CF': '1', 'ACDEG': '2', 'ACDFG': '3', 'BCDF': '4', 'ABDFG': '5', 'ABDEFG': '6', 'ACF': '7', 'ABCDEFG': '8', 'ABCDFG': '9'}
def get_segment_map(patterns) -> dict:
"""
Translate the segments based on the frequency of the segments
"""
map = {}
freq_chars = {6: 'B', 4: 'E', 9: 'F'}
frequencies = Counter(''.join(patterns))
one = [pattern for pattern in patterns if len(pattern) == 2][0]
four = [pattern for pattern in patterns if len(pattern) == 4][0]
for char, frequency in frequencies.items():
if frequency == 8:
map[char] = 'C' if char in one else 'A'
elif frequency == 7:
map[char] = 'D' if char in four else 'G'
else:
map[char] = freq_chars[frequency]
return map
def decode(entry):
patterns, output = entry
segment_map = get_segment_map(patterns)
result = ''
for number in output:
decoded = ''.join(sorted(segment_map[char] for char in number))
result += number_of[decoded]
return int(result)
def part1():
return sum(sum(1 for pattern in entry[1] if len(pattern) <= 4 or len(pattern) == 7) for entry in entries)
print("part 1:", part1())
print("part 2:", sum(decode(entry) for entry in entries))