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