12_records.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. #!/usr/bin/env python3
  2. import sys
  3. from functools import cache
  4. def place_iter(size, record):
  5. groupend = record.find('.', 1) + 1
  6. if groupend != len(record):
  7. group = record[:groupend]
  8. for rem in place(size, group):
  9. yield rem + record[groupend:]
  10. if '#' not in group:
  11. yield from place(size, record[groupend - 1:])
  12. else:
  13. for start in range(1, len(record) - size):
  14. end = start + size
  15. if record[start - 1] != '#' and record[end] != '#' and \
  16. all(record[i] != '.' for i in range(start, end)):
  17. yield '.' + record[min(end + 1, len(record) - 1):]
  18. if record[start] == '#':
  19. break
  20. @cache
  21. def place(size, record):
  22. return tuple(place_iter(size, record))
  23. @cache
  24. def arrangements(record, sizes):
  25. if not sizes:
  26. return int('#' not in record)
  27. return sum(arrangements(r, sizes[1:]) for r in place(sizes[0], record))
  28. def normalize(record):
  29. return '.' + '.'.join(record.replace('.', ' ').split()) + '.'
  30. records = [(record, tuple(map(int, numbers.split(','))))
  31. for record, numbers in map(str.split, sys.stdin)]
  32. print(sum(arrangements(normalize(r), d) for r, d in records))
  33. print(sum(arrangements(normalize('?'.join([r] * 5)), d * 5) for r, d in records))