#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);