fork download
  1. f=\
  2. lambda b:M(set(),b,0,2,[],(0,0))
  3. Z=max
  4. W=min
  5. L={0:Z,2:W}
  6. K={0:W,2:Z}
  7. T={0:L,1:K,2:K,3:L}
  8. Q={0:(0,1),1:(1,0),2:(0,-1),3:(-1,0)}
  9. I={0:lambda s,v,*a:[*a,[v]+s],1:lambda s,v,*a:[*a,s[1:]],2:lambda s,v,*a:[*a,[sum(s[:2])]+s[2:]],3:lambda s,v,*a:[*a,[s[1]-s[0]]+s[2:]],4:lambda s,v,*a:[*a,[s[0]*s[1]]+s[2:]],5:lambda s,v,*a:[*a,[s[1]/s[0]]+s[2:]],6:lambda s,v,u,q:[[u,q,s],[s[0]+u&3,q,s[1:]]][[]<s],7:lambda s,v,u,q:[u,s[0]%2*2,s[1:]]}
  10. def V(b,x,y):
  11. try:return b[x][y]!=9and x>-1<y
  12. except:return 0
  13. def C(b,v,s):
  14. q,S,D,d=[s],[s],{s[0]:[s[1]]},{s[1]:[s[0]]}
  15. while q:
  16. x,y=q.pop(0)
  17. for n,m in Q.values():
  18. try:
  19. if(X:=x+n)>-1<(Y:=y+m)and~-((X,Y)in S)and b[X][Y]==v:q+=(X,Y),;S+=(X,Y),;D[X]=D.get(X,[])+[Y];d[Y]=d.get(Y,[])+[X]
  20. except:1
  21. return S,D,d
  22. def M(H,b,u,q,s,c,P=0,E=[]):
  23. if(_:=str([u,q,s,c,P,E,b[c[0]][c[1]]]))in H:return s
  24. H.add(_);x,*y=C(b,S:=b[c[0]][c[1]],c)
  25. if P==8:return s
  26. if S-8:
  27. if u in[0,2]:Y=[Z,W][u>0](y[1]);X=T[u][q](y[1][Y])
  28. else:X=[Z,W][u==3](y[0]);Y=T[u][q](y[0][X])
  29. else:X,Y=c
  30. return M(H,b,*(I[b[A][B]](s,len(x),u,q)if b[A][B]in I and(s or b[A][B]<2)else[u,q,s]),(A,B),0,[])if V(b,A:=X+Q[u][0],B:=Y+Q[u][1])else S-8and M(H,b,[u,-~u%4][P%2],[2*(q<1),q][P%2],s,(X,Y),P+1,[])or M(H,b,-~u%4,2*(q<1),s,(X,Y),0,E+[(X,Y)])
  31.  
  32. prog ="""
  33. 111090908004
  34. 911088808944
  35. 911069912399
  36. """
  37. prog1="""
  38. 1199999999999999
  39. 9890888898889889
  40. 8880888000888808
  41. 8880889888988898
  42. """
  43. prog2="""
  44. 21234567000880
  45. 99999900000999
  46. 40330000000088
  47. 44988888888889
  48. """
  49. def to_board(p):
  50. return [[*map(int,i)]for i in filter(None, p.split('\n'))]
  51.  
  52. print(f(to_board(prog)))
  53. print(f(to_board(prog1)))
  54. print(f(to_board(prog2)))
Success #stdin #stdout 0.07s 14080KB
stdin
Standard input is empty
stdout
[6]
[3, 9, 7, 9, 7]
[-22]