Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

4 роки тому
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import re
  2. import sys
  3. def display(state):
  4. ele, floors = state
  5. for i, floor in list(enumerate(floors))[::-1]:
  6. _ = ['E' if ele == i else ' ']
  7. _ += [d if d in floor else '..' for d in sorted(devices)]
  8. print(' '.join(_))
  9. print()
  10. def checks(elevator, floors):
  11. for fl in floors:
  12. vulnerable = {d for d in fl if d == d.lower() and d.upper() not in fl}
  13. dangerous = {d for d in fl if d == d.upper()}
  14. if vulnerable and dangerous:
  15. yield False
  16. def moves(ith, floors):
  17. for jth in {ith - 1, ith + 1} - {-1, 4}:
  18. for stuff in [{a, b} for a in floors[ith] for b in floors[ith]]:
  19. new = (jth, tuple(
  20. (floor | stuff) if ith == jth else (floor - stuff)
  21. for ith, floor in enumerate(floors)
  22. ))
  23. if all(checks(*new)):
  24. yield new
  25. text = sys.stdin.read()
  26. start = [
  27. frozenset(
  28. word[:2].upper() if not word.endswith('-') else word[:2]
  29. for word in re.findall(r'\w+ium-?', ln)
  30. )
  31. for ln in text.splitlines()
  32. ]
  33. start[2] -= {'PR', 'RU', 'pr', 'ru'}
  34. # start[0] |= {'EE', 'ee', 'DD', 'dd'}
  35. devices = frozenset({device for floor in start for device in floor})
  36. edge = {(0, tuple(start))}
  37. goal = (3, tuple([frozenset(), frozenset(), frozenset(), devices]))
  38. seen = {}
  39. while goal not in seen:
  40. edge = {new: old for old in edge for new in moves(*old) if new not in seen}
  41. if not edge:
  42. raise RuntimeError('empty')
  43. seen = {**edge, **seen}
  44. print(len(edge))
  45. seq = []
  46. while goal != (0, tuple(start)):
  47. seq.append(goal)
  48. goal = seen[goal]
  49. seq.append(goal)
  50. seq.reverse()
  51. for i, state in enumerate(seq):
  52. print(i)
  53. display(state)