| 1234567891011121314151617181920212223242526272829 |
- #!/usr/bin/env python3
- import sys
- from functools import cache
- @cache
- def fit(size, record):
- remainders = []
- for start in range(1, len(record) - size):
- end = start + size
- if record[start - 1] != '#' and record[end] != '#' and \
- all(record[i] != '.' for i in range(start, end)):
- remainders.append('.' + record[end + 1:])
- if record[start] == '#':
- break
- return tuple(remainders)
- @cache
- def repair(record, sizes):
- if not sizes:
- return int('#' not in record)
- return sum(repair(r, sizes[1:]) for r in fit(sizes[0], record))
- def normalize(record):
- return '.' + '.'.join(record.replace('.', ' ').split()) + '.'
- records = [(record, tuple(map(int, numbers.split(','))))
- for record, numbers in map(str.split, sys.stdin)]
- print(sum(repair(normalize(r), d) for r, d in records))
- print(sum(repair(normalize('?'.join([r] * 5)), d * 5) for r, d in records))
|