| @@ -3,15 +3,43 @@ import sys | |||
| def recurse(rule): | |||
| return re.sub(r'(\d+)', lambda m: f'({recurse(rules[m.group(1)])})', rule) | |||
| def replacer(m): | |||
| return f'({recurse(rules[m.group(1)])})' | |||
| return re.sub(r'(\d+)', replacer, rule).replace('"', '').replace(' ', '') | |||
| text = sys.stdin.read() | |||
| rules, stuff = text.split('\n\n') | |||
| rules = dict([ln.split(': ') for ln in rules.splitlines()]) | |||
| ans = 0 | |||
| rex = re.compile(recurse(rules['0']).replace('"', '').replace(' ', '') + '$') | |||
| for line in text.splitlines(): | |||
| ans += bool(rex.match(line)) | |||
| print(ans) | |||
| rule0 = re.compile(recurse(rules['0'])).fullmatch | |||
| print(sum(bool(rule0(line)) for line in stuff.splitlines())) | |||
| def rule8(line): | |||
| # 8 = 42 | 42 8 | |||
| for i in range(1, len(line) + 1): | |||
| a, b = line[:i], line[i:] | |||
| if rule42(a): | |||
| if not b or rule8(b): | |||
| return True | |||
| def rule11(line): | |||
| # 11 = 42 31 | 42 11 31 | |||
| for i in range(1, len(line) + 1): | |||
| for j in range(i, len(line)): | |||
| a, b, c = line[:i], line[i:j], line[j:] | |||
| if rule42(a) and rule31(c): | |||
| if not b or rule11(b): | |||
| return True | |||
| rule42 = re.compile(recurse(rules['42'])).fullmatch | |||
| rule31 = re.compile(recurse(rules['31'])).fullmatch | |||
| # 0 = 8 11 | |||
| ans2 = 0 | |||
| for ln in stuff.splitlines(): | |||
| valid = any(rule8(ln[:i]) and rule11(ln[i:]) for i in range(1, len(ln))) | |||
| ans2 += bool(valid) | |||
| print(ans2) | |||