fork download
  1. F=lambda s,e,m:s+''.join(map(str,m))+e
  2. U=lambda x:eval(str(x))
  3. def C(w,m,o,c,e):
  4. if[]==c:yield w,m;return
  5. for x in o:
  6. for i,y in enumerate(c):
  7. if len(w[x][1])<w[x][0]:W=U(w);M=U(m);W[x][1]=([y if~-x else(y,)]+W[x][1]if x else W[x][1]+[y]);M+=F(W[e][2],W[x][2],[y]),;yield from C(W,M,o,c[:i]+c[i+1:],e)
  8. def V(w,m,t,c,B=0):
  9. if w[1][1][:len(j:=[i for i in w[1][1]if type(i)==tuple])]==j:
  10. for W,M in C(w,m,{0,2,3}-{c},[i for[i]in j],1):B=1;W,M=U(W),U(M);z=W[c][1];W[c][1]=[z[1:],z[:-1]][c<1];M+=F(W[c][2],'B',[t]),;W[1][1]=[t]+W[1][1][len(j):];yield W,M,1
  11. if B<1:
  12. w[c][1].remove(t)
  13. for W,M in C(w,m,{0,2,3}-{c},[t],c):yield W,M,0
  14. def f(t):
  15. w,m=[{0:3,1:[],2:'A'},{0:5,1:[*range(1,6)],2:'B'},{0:3,1:[6,7,8],2:'C'},{0:3,1:[],2:'D'}],[];z=w[1][1]
  16. if z==t:return m
  17. T=t[:(r:=max(e)+1if(e:=[i for i in range(5)if t[i]-z[i]])else 5)]or t;W=z[:r];w[1][1]=z[r:]
  18. if(M:=W[:3][::-1]):w[3][1]+=M;m+=F('B','D',M[::-1]),
  19. if(M:=W[3:]):w[0][1]+=M;m+=F('B','A',M[::-1]),
  20. q=[(U(w),U(m),T)]
  21. while q:
  22. W,M,T=q.pop(0)
  23. if[]==T:return M
  24. if(O:=[i for i in[0,2,3]if W[i][1]and W[i][1][-(i<1)]==T[-1]]):
  25. for W,M,I in V(W,M,T[-1],O[0]):q+=(W,M,[T[:-1],T][I<1]),
  26. else:
  27. if(O:=[i for i in[0,2,3]if T[-1]in W[i][1]]):
  28. [c]=O;Z=W[c][1];S=[Z[:1],Z[-1:]][c<1];W[c][1]=[Z[1:],Z[:-1]][c<1]
  29. for W,M in C(W,M,{0,1,2,3}-{c},S,c):q+=(W,M,T),
  30. return m
  31.  
  32. print(f([1,2,3,4,5]))
  33. print(f([2,1,3,4,5]))
  34. print(f([1,4,3,8,5]))
  35. print(f([4,3,5,2,1]))
  36. print(f([8,6,3,1,7]))
Success #stdin #stdout 0.39s 14092KB
stdin
Standard input is empty
stdout
[]
['B12D', 'D2A', 'D1B', 'A2B']
['B123D', 'B4A', 'C6A', 'C7A', 'C8B', 'D3B', 'A7B', 'A6B', 'B6C', 'B7C', 'A4B', 'D2A', 'D1B']
['B123D', 'B54A', 'D3B', 'D2B', 'D1A', 'B3D', 'B2D', 'A1B', 'D2B', 'A5B', 'D3B', 'A4B']
['B123D', 'B54A', 'C6A', 'C7B', 'D3B', 'D2B', 'B2C', 'B3C', 'D1B', 'C3B', 'A6B', 'C2A', 'C8B']