12_records.py 952 B

1234567891011121314151617181920212223242526272829
  1. #!/usr/bin/env python3
  2. import sys
  3. from functools import cache
  4. @cache
  5. def fit(size, record):
  6. remainders = []
  7. for start in range(1, len(record) - size):
  8. end = start + size
  9. if record[start - 1] != '#' and record[end] != '#' and \
  10. all(record[i] != '.' for i in range(start, end)):
  11. remainders.append('.' + record[end + 1:])
  12. if record[start] == '#':
  13. break
  14. return tuple(remainders)
  15. @cache
  16. def repair(record, sizes):
  17. if not sizes:
  18. return int('#' not in record)
  19. return sum(repair(r, sizes[1:]) for r in fit(sizes[0], record))
  20. def normalize(record):
  21. return '.' + '.'.join(record.replace('.', ' ').split()) + '.'
  22. records = [(record, tuple(map(int, numbers.split(','))))
  23. for record, numbers in map(str.split, sys.stdin)]
  24. print(sum(repair(normalize(r), d) for r, d in records))
  25. print(sum(repair(normalize('?'.join([r] * 5)), d * 5) for r, d in records))