summaryrefslogtreecommitdiff
path: root/2020/aoc2020-d19.py
diff options
context:
space:
mode:
authorblenovo <bk@gmail.com>2025-08-02 03:13:50 +0200
committerblenovo <bk@gmail.com>2025-08-02 03:13:50 +0200
commit12f551dbfef138880b29ba6abe4576714ae942cb (patch)
treeb7d3b20f01df625b8f2be552314133ebe6c0d1d1 /2020/aoc2020-d19.py
parent99a7d62c30069a5ffe2210a72c7cf81e76a1f241 (diff)
summer warmup sesh part 2
Diffstat (limited to '2020/aoc2020-d19.py')
-rw-r--r--2020/aoc2020-d19.py58
1 files changed, 58 insertions, 0 deletions
diff --git a/2020/aoc2020-d19.py b/2020/aoc2020-d19.py
new file mode 100644
index 0000000..fb4497d
--- /dev/null
+++ b/2020/aoc2020-d19.py
@@ -0,0 +1,58 @@
+#advent of code 2020
+#day 19
+import re
+
+def FindRule(r,d):
+ if d >20: return "";
+ elif type(rules[r]) == str:
+ return rules[r];
+ else:
+ suboptions = [];
+ for subset in rules[r]:
+ subopt = "(";
+ for sr in subset:
+ subopt += FindRule(sr,d+1);
+ subopt += ")";
+ suboptions.append(subopt);
+ return "(" + "|".join(suboptions) + ")";
+
+rules = dict();
+PuzzleInput = open("19.in","r").read().split("\n\n");
+rules_raw = PuzzleInput[0].split("\n");
+messages = PuzzleInput[1].split("\n");
+for rule in rules_raw:
+ rule_i, rule_vals = rule.split(": ");
+ rule_i = int(rule_i);
+ if rule_vals[0] == '"':
+ rules[rule_i] = rule_vals[1];
+ else:
+ rules[rule_i] = [[int(r) for r in subrule.split(" ")] for subrule in rule_vals.split(" | ")];
+
+TotalRule = "";
+TotalRule = FindRule(0,0);
+regsearch = re.compile(TotalRule);
+
+p1 = 0;
+for message in messages:
+ message = message.replace("\n","");
+ regfind = regsearch.fullmatch(message);
+ if regfind != None:
+ p1+=1;
+
+print("part 1 =",p1);
+#part 2: change of rules 8 and 11
+rules[8] = [[42], [42, 8]];
+rules[11] = [[42,31], [42,11,31]];
+TotalRule = "";
+TotalRule = FindRule(0,0);
+p2 = 0;
+for countdown,message in enumerate(messages):
+ #print(len(messages) - countdown, len(messages));
+ message = message.replace("\n","");
+ regfind = re.findall(TotalRule+"+",message);
+ if regfind:
+ for x in regfind:
+ if message in x:
+ p2+=1;
+ break;
+print("part 2 =",p2);