Roderic Day 4 роки тому
джерело
коміт
2fccfc94c1
2 змінених файлів з 39 додано та 0 видалено
  1. +4
    -0
      toolkit.py
  2. +35
    -0
      y2020/p16.py

+ 4
- 0
toolkit.py Переглянути файл

@@ -10,6 +10,10 @@ from pathlib import Path
import requests


def integers(line):
return [int(n) for n in re.findall(r'\d+', line)]


def lcm(a, b):
return abs(a * b) // math.gcd(a, b)


+ 35
- 0
y2020/p16.py Переглянути файл

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

Завантаження…
Відмінити
Зберегти