|
|
@@ -0,0 +1,35 @@ |
|
|
|
import sys |
|
|
|
|
|
|
|
import toolkit |
|
|
|
|
|
|
|
|
|
|
|
def parse_info(info): |
|
|
|
out = {} |
|
|
|
for line in info.splitlines(): |
|
|
|
key, vals = line.split(':') |
|
|
|
out[key] = set() |
|
|
|
for a, b in zip(*[iter(toolkit.integers(vals))] * 2): |
|
|
|
out[key] |= set(range(a, b + 1)) |
|
|
|
return out |
|
|
|
|
|
|
|
|
|
|
|
text = sys.stdin.read() |
|
|
|
info, mine, rest = text.split('\n\n') |
|
|
|
info = parse_info(info).items() |
|
|
|
mine = toolkit.integers(mine) |
|
|
|
|
|
|
|
rest = [toolkit.integers(ln) for ln in rest.splitlines()][1:] |
|
|
|
valid = {v for _, vs in info for v in vs} |
|
|
|
error_rate = sum(n for row in rest for n in row if n not in valid) |
|
|
|
print(error_rate) |
|
|
|
|
|
|
|
rows = [row for row in rest if valid.issuperset(row)] |
|
|
|
options = [{k for k, vs in info if vs.issuperset(col)} for col in zip(*rows)] |
|
|
|
ans2 = 1 |
|
|
|
found = set() |
|
|
|
for k, vs in sorted(enumerate(options), key=lambda pair: len(pair[1])): |
|
|
|
v, = vs - found |
|
|
|
found.add(v) |
|
|
|
if v.startswith('departure'): |
|
|
|
ans2 *= mine[k] |
|
|
|
print(ans2) |