-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday19.py
73 lines (59 loc) · 1.82 KB
/
day19.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
import re
RULE_PATTERNS = r'([0-9]+): (?:([0-9]+ [0-9]+(?:\s*\|*\s*[0-9]+ [0-9]+)*)|(?:\"([a-z]+)\"))'
def construct_possible_matches(rules):
"""
{
0: [[4, 1]],
1: [[2, 3], [3, 2]],
2: [[4, 4], [5, 5]],
3: [[4, 5], [5, 4]],
4: 'a',
5: 'b'
}
"""
matches = {}
return matches
if __name__ == '__main__':
with open('test.txt') as f:
rules = {}
# Parse rules
while True:
rule = f.readline().strip()
if rule == '':
break
"""
regex match groups ->
('0', '4 1', None)
('1', '2 3 | 3 2', None)
('2', '4 4 | 5 5', None)
('3', '4 5 | 5 4', None)
('4', None, 'a')
('5', None, 'b')
converted to a dictionary -> {
0: [[4, 1]],
1: [[2, 3], [3, 2]],
2: [[4, 4], [5, 5]],
3: [[4, 5], [5, 4]],
4: 'a',
5: 'b'
}
"""
match = re.match(RULE_PATTERNS, rule)
if match.groups()[1]:
rules[int(match.groups()[0])] = [
list(map(int, x.strip().split(' '))) for x in
match.groups()[1].split('|')
]
else:
rules[int(match.groups()[0])] = match.groups()[2]
# Parse messages
messages = set([line.strip() for line in f.readlines()])
#
# Part 1
#
possible_matches = construct_possible_matches(rules)
matches = messages.intersection(possible_matches)
print(f'Part 1: {len(matches)}')
#
# Part 2
#