Day 19 (slightly evil!)
[advent-of-code-2020.git] / day19 / monstermessages.py
diff --git a/day19/monstermessages.py b/day19/monstermessages.py
new file mode 100755 (executable)
index 0000000..0dc8d16
--- /dev/null
@@ -0,0 +1,59 @@
+#!/usr/bin/python3
+
+import sys
+import re
+
+filename="p1_2.txt"
+if len(sys.argv) > 1:
+    filename=sys.argv[1]
+
+in_rules=True
+rules={}
+data=[]
+
+for line in open(filename, "r"):
+    line = line.rstrip()
+    if line == "":
+        in_rules=False
+        continue
+
+    if in_rules:
+        (rule_number,rule) = line.split(":")
+        rule_number=int(rule_number)
+        rule=rule.strip()
+        rules[rule_number] = [s.strip() for s in rule.split("|")]
+    else:
+        data.append(line)
+
+def get_rule_regex(rulenumber):
+    regex=""
+    first=False
+    for rule in rules[rulenumber]:
+        if rule[0] != '"':
+            # not a character, so we're going to go down the wishing well
+            for number in rule.split(" "):
+                number=int(number)
+                regex+=get_rule_regex(number)
+            regex+="|"
+        else:
+            regex+=rule[1:-1]
+    if regex[-1] == "|":
+        regex=regex[0:-1]
+    regex="("+regex+")"
+
+    return regex
+
+# ok - so all the rules are in, lets build a huge regex that gets all the rules
+for rule_number in rules:
+    print(str(rule_number) + ": " + "| ".join(rules[rule_number]))
+
+pattern="^"+get_rule_regex(0)+"$"
+
+match_count=0
+
+for line in data:
+    if re.search(pattern, line):
+        print("Line: {} matches".format(line))
+        match_count+=1
+
+print("There were {} matches in total".format(match_count))