-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathday_19.py
70 lines (50 loc) · 1.85 KB
/
day_19.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
#!/usr/bin/env python3
"""Advent of Code 2020 Day 19 - Monster Messages."""
import re
def convert_to_regex(rules_dict: dict, rule_num: int, depth: int=0) -> str:
"""Convert rule to its regex equivalent and return it.
Args:
rules_dict: Dictionary of rule_num: rule.
rule_num: Key for rules_dict corresponding to rule to be converted.
depth: Number of recursive calls to the function. Defaults to 0 and
used to set a limit on processing of loops.
Returns:
The regex string equivalent of the rule at key rule_num in rules_dict
(to a capped depth).
"""
if depth > 15:
return ''
if rules_dict[rule_num] in ('a', 'b'):
return rules_dict[rule_num]
rules = []
for branches in rules_dict[rule_num].split('|'):
branch_answer = ''
for branch_num in branches.split():
branch_re = convert_to_regex(rules_dict, branch_num, depth + 1)
branch_answer += branch_re
rules.append(branch_answer)
return '(' + '|'.join(rules) + ')'
rules, messages = open('inputs/day_19.txt').read().split('\n\n')
rules_dict = {}
for line in rules.split("\n"):
rule_num, rule = [x.strip() for x in line.split(':')]
if rule[0] == '"':
rule = rule.strip('"')
rules_dict[rule_num] = rule
regex = re.compile(convert_to_regex(rules_dict, '0'))
matches = 0
for message in messages.split():
if regex.fullmatch(message):
matches += 1
# Answer One
print("Number of messages that completely match rule 0:", matches)
rules_dict["8"] = "42 | 42 8"
rules_dict["11"] = "42 31 | 42 11 31"
regex = re.compile(convert_to_regex(rules_dict, '0'))
matches = 0
for message in messages.split():
if regex.fullmatch(message):
matches += 1
# Answer Two
print("Number of messages that completely match rule 0 after update:",
matches)