def read_file(): with open("input.txt","r") as f: rules, messages = f.read().split('\n\n') messages = messages.split('\n') rules = rules.split('\n') rules = { int(r.split(':')[0]): [[int(x) for x in sr.split()] for sr in r.split(':')[1].split('|')] if '"' not in r else r[-2] # a or b for r in rules } return rules, messages def consume(message, rule, rules): if type(rules[rule]) == str: if message and message[0] == rules[rule]: return [message[1:]] else: to_be_consumed = [] for group in rules[rule]: message_list = [message] for rule in group: message_list2 = [] for submessage in message_list: message_list2 += consume(submessage, rule, rules) message_list = message_list2 if not message_list: break if message_list: to_be_consumed += message_list return to_be_consumed return [] """ import re def part1(rules,messages): rule = rules["0"] groups = re.findall(r'(\d)', rule) groups = [rules[key] for key in groups] while True: for i in range(len(groups)): m = re.findall(r'(\d)', groups[i]) for g in m: groups[i] = groups[i].replace(g, rules[g]) print(groups) test = re.findall(r'(\d)',groups[1]) if not test: break def part2(rules,messages): pass """ def main(): rules, messages = read_file() print(sum('' in consume(m, 0, rules) for m in messages)) rules[8] = [[42], [42, 8]] rules[11] = [[42, 31], [42, 11, 31]] print(sum('' in consume(m, 0, rules) for m in messages)) #print(part1(rules,messages), part2(rules,messages)) if __name__ == "__main__": main()