|
- import re
- import sys
-
-
- def freeze(state):
- return tuple(frozenset(fl) for fl in state)
-
-
- def thaw(state):
- return [set(fl) for fl in state]
-
-
- def checks(state):
- for fl in state:
- dangerous = {d[:-1] for d in fl if d.endswith('+')}
- vulnerable = {d[:-1] for d in fl if d.endswith('-')} - dangerous
- if dangerous and vulnerable:
- yield False
-
-
- def advance(pair):
- f0, state = pair
- for devices in {frozenset({a, b}) for a in state[f0] for b in state[f0]}:
- for f1 in {f0 + 1, f0 - 1} - {-1, 4}:
- if len(devices) == 1 or f1 > f0:
- new = thaw(state)
- new[f0] -= devices
- new[f1] |= devices
- if all(checks(new)):
- yield f1, freeze(new)
-
-
- text = sys.stdin.read()
- state = [
- {a + (b or '+') for a, b in re.findall(r'(\w{2})\w+ium(-)?', ln)}
- for ln in text.splitlines()
- ]
-
- goal = (3, freeze([{}, {}, {}, {d for fl in state for d in fl}]))
- edge = {(0, freeze(state))}
- seen = set()
- ans1 = 0
- while goal not in seen:
- edge = {new for old in edge for new in advance(old)} - seen
- seen |= edge
- ans1 += 1
- print(ans1)
- print(ans1 + 12 * 2)
|