diff options
Diffstat (limited to '2020/aoc2020-d19.py')
| -rw-r--r-- | 2020/aoc2020-d19.py | 58 |
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); |
