-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday08.py
109 lines (83 loc) · 2.54 KB
/
day08.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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import argparse
import os
MAPPING = {"a": "X", "b": "X", "c": "X", "d": "X", "e": "X", "f": "X", "g": "X"}
def read_input(filepath: str) -> (int, int):
with open(filepath, "r") as f:
for line in f.readlines():
segments, digits = line.split("|")
s = ["".join(sorted(x)) for x in segments.split()]
d = ["".join(sorted(x)) for x in digits.split()]
yield s, d
def init_parser() -> str:
parser = argparse.ArgumentParser(description="Advent of Code day 8 solution.")
parser.add_argument(
"input", metavar="FILE", type=str, nargs=1, help="Path to input data."
)
args = parser.parse_args()
return os.path.realpath(args.input[0])
def easy_digits(segment: str) -> str:
match len(segment):
case 2:
return "1"
case 3:
return "7"
case 4:
return "4"
case 7:
return "8"
case _:
return "X"
def hard_digits(segment: str, one: set[str], four: set[str]) -> str:
set_ = set(segment)
one_inter = len(one.intersection(set_))
four_inter = len(four.intersection(set_))
seg_count = len(set_)
# 2, 3, 5
if seg_count == 5:
if one_inter == 2:
return "3"
if four_inter == 2:
return "2"
if four_inter == 3:
return "5"
# 6, 9, 0
if seg_count == 6:
if one_inter == 1:
return "6"
if four_inter == 4:
return "9"
if four_inter == 3:
return "0"
return "X"
def decode_segments(segments: list[str]) -> dict[str, str]:
key = dict()
for seg in segments:
key[seg] = "X"
four = set()
one = set()
for segment, digit in key.items():
d = easy_digits(segment)
if d == "1":
one = set(segment)
if d == "4":
four = set(segment)
key[segment] = d
for segment, digit in key.items():
if digit in ("1", "4", "7", "8"):
continue
key[segment] = hard_digits(segment, one, four)
return key
def decode_digits(digits: list[str], key: dict[str, str]) -> list[str]:
return [key[d] for d in digits]
if __name__ == "__main__":
path = init_parser()
input_ = read_input(path)
total = 0
for segments, digits in input_:
key = decode_segments(segments)
number = "".join(decode_digits(digits, key))
print(f"Decoded number: {number}")
total += int(number)
print(f"Total: {total}")
def main(_):
raise NotImplementedError