Fixup day18 and add second part
[advent-of-code-2020.git] / day19 / monstermessages.py
1 #!/usr/bin/python3
2
3 import sys
4 import re
5
6 filename="p1_2.txt"
7 if len(sys.argv) > 1:
8     filename=sys.argv[1]
9
10 in_rules=True
11 rules={}
12 data=[]
13
14 for line in open(filename, "r"):
15     line = line.rstrip()
16     if line == "":
17         in_rules=False
18         continue
19
20     if in_rules:
21         (rule_number,rule) = line.split(":")
22         rule_number=int(rule_number)
23         rule=rule.strip()
24         rules[rule_number] = [s.strip() for s in rule.split("|")]
25     else:
26         data.append(line)
27
28 def get_rule_regex(rulenumber):
29     regex=""
30     first=False
31     for rule in rules[rulenumber]:
32         if rule[0] != '"':
33             # not a character, so we're going to go down the wishing well
34             for number in rule.split(" "):
35                 number=int(number)
36                 regex+=get_rule_regex(number)
37             regex+="|"
38         else:
39             regex+=rule[1:-1]
40     if regex[-1] == "|":
41         regex=regex[0:-1]
42     regex="("+regex+")"
43
44     return regex
45
46 # ok - so all the rules are in, lets build a huge regex that gets all the rules
47 for rule_number in rules:
48     print(str(rule_number) + ": " + "| ".join(rules[rule_number]))
49
50 pattern="^"+get_rule_regex(0)+"$"
51
52 match_count=0
53
54 for line in data:
55     if re.search(pattern, line):
56         print("Line: {} matches".format(line))
57         match_count+=1
58
59 print("There were {} matches in total".format(match_count))