Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

36 lines
957B

  1. import functools
  2. import re
  3. @functools.lru_cache(maxsize=None)
  4. def get_combos(pattern, ns):
  5. out = 0
  6. if not ns:
  7. new = '_' * len(pattern)
  8. if re.fullmatch(pattern, new):
  9. out += 1
  10. else:
  11. n, *ns = ns
  12. i_max = len(pattern) - sum(ns) - len(ns) - n + 1
  13. for i in range(i_max):
  14. new = '_' * i + '#' * n + '_' * (len(pattern) > i + n)
  15. if re.fullmatch(pattern[:len(new)], new):
  16. out += get_combos(pattern[len(new):], tuple(ns))
  17. return out
  18. def combos(line, N=1):
  19. pattern, ns = line.split()
  20. # expand
  21. pattern = '?'.join([pattern] * N)
  22. ns = ','.join([ns] * N)
  23. # parse
  24. pattern = pattern.replace('.', '_').replace('?', '.')
  25. ns = [int(n) for n in ns.split(',')]
  26. return get_combos(pattern, tuple(ns))
  27. text = open(0).read()
  28. print(sum(combos(line) for line in text.splitlines()))
  29. print(sum(combos(line, 5) for line in text.splitlines()))