93 lines
No EOL
2 KiB
Python
93 lines
No EOL
2 KiB
Python
#!/usr/bin/python3
|
|
|
|
import sys, re
|
|
|
|
def is_integer(n):
|
|
try:
|
|
float(n)
|
|
except ValueError:
|
|
return False
|
|
else:
|
|
return float(n).is_integer()
|
|
|
|
def process_rules(rules, id):
|
|
rule = rules[id]
|
|
check = rule.split(" ")
|
|
r = "("
|
|
p = ""
|
|
q = ""
|
|
for c in check:
|
|
if is_integer(c):
|
|
r += process_rules(rules, c)
|
|
elif c == '"a"':
|
|
r += "a"
|
|
elif c == '"b"':
|
|
r += "b"
|
|
elif c == '|':
|
|
r += "|"
|
|
r += p
|
|
r += ")"
|
|
r += q
|
|
|
|
return r
|
|
|
|
def process_rules2(rules, id):
|
|
rule = rules[id]
|
|
check = rule.split(" ")
|
|
r = "("
|
|
p = ""
|
|
q = ""
|
|
for c in check:
|
|
if is_integer(c):
|
|
if id == "8":
|
|
return "(" + process_rules2(rules, "42" ) + ")+"
|
|
elif id == "11":
|
|
x = []
|
|
for t in range(1,15):
|
|
x.append("(" + process_rules2(rules, "42" )+"{" + str(t) + "}" + process_rules(rules, "31" ) + "{" + str(t) + "}"+ ")")
|
|
|
|
return "(" + "|".join(x) + ")"
|
|
else:
|
|
r += process_rules2(rules, c)
|
|
elif c == '"a"':
|
|
r += "a"
|
|
elif c == '"b"':
|
|
r += "b"
|
|
elif c == '|':
|
|
r += "|"
|
|
r += p
|
|
r += ")"
|
|
r += q
|
|
|
|
return r
|
|
|
|
|
|
rules = {}
|
|
r = r2 = ""
|
|
count = count2 = 0
|
|
for line in sys.stdin:
|
|
line = line.rstrip()
|
|
|
|
m = re.match(r'^(\d+): (.*?)$', line)
|
|
if m is not None:
|
|
id = m.group(1)
|
|
rule = m.group(2)
|
|
rules[id] = rule
|
|
continue
|
|
|
|
if line == "":
|
|
r = "^" + process_rules(rules, "0") + "$"
|
|
r2 = "^" + process_rules2(rules, "0") + "$"
|
|
|
|
m = re.match(r'^([ab]+)$', line)
|
|
if m is not None:
|
|
check = re.match(r, m.group(1))
|
|
if check is not None:
|
|
count += 1
|
|
|
|
check2 = re.match(r2, m.group(1))
|
|
if check2 is not None:
|
|
count2 += 1
|
|
|
|
print(1, count)
|
|
print(2, count2) |