fork download
  1. E=enumerate
  2. def f(n,k,h):
  3. m,o,c,r,I=[[],[]],[[],[]],0,[-1,-1],[[],[]]
  4. while(-1 in r)*h:
  5. C=c%2;H=h.pop(0);V=[i for i,a in E(H)if a==H[k]and(i in I[C])<(m[C]==[]or i in m[C])];I[C]+=[i for i in m[C]if~-(i in V)];m[C]=V;d={};P=1-C;F=1;A=-r[C]==len(m[C])==1
  6. for i,a in E(H):d[a]=d.get(a,[])+[i]
  7. if-1==r[P]:o[P]=[*d.values()]
  8. if A:r[C]=c+1
  9. while F:
  10. F=0
  11. if A:
  12. for i in o[1-P]:
  13. if len(i)==1==len(K:=[J for j in o[P]if(J:=[u for u in j if u-i[0]and u in m[P]])and len(J)==1]):m[P]=K[0]
  14. if len(K:=[J for j in o[P]if len(J:=[u for u in j if u in m[P]])==1])==1:m[P]=K[0]
  15. else:
  16. for i in o[P]:
  17. if len(i)==1:
  18. m[P]=[j for j in m[P]if j-i[0]];I[P]+=i
  19. if(N:=[J for j in o[1-P]if(J:=[u for u in j if u-i[0]])])!=o[1-P]:o[(P:=1-P)]=N;F=1
  20. for i,a in E(m):
  21. if-r[i]==len(a)==1:r[i]=c+1;F=A=1;P=1>i
  22. c+=1
  23. return r
  24.  
  25. print(f(5,0,[[1, 1, 2, 2, 2], [1, 2, 1, 1, 1], [0, 0, 0, 0, 0]])) #[2, 2]
  26. print(f(2,1,[[0, 1], [1, 1], [0, 0], [1, 0]])) #[1, 4]
  27. print(f(3,1,[[0, 1, 1], [0, 1, 1], [1, 2, 2]])) #[-1, -1]
  28. print(f(5,2,[[1, 1, 2, 2, 2], [1, 1, 1, 2, 2], [1, 1, 3, 1, 2]])) #[3, 3]
  29. print(f(4,2,[[0, 1, 2, 3], [0, 0, 0, 0], [0, 0, 0, 0]])) #[1, -1]
  30. print(f(6,5,[[0, 1, 1, 1, 1, 1], [1, 0, 1, 1, 1, 1], [1, 1, 0, 1, 1, 1], [1, 1, 1, 0, 1, 1], [1, 1, 1, 1, 0, 1]])) #[5, -1]
  31. print(f(5,2,[[1, 1, 2, 2, 2], [1, 2, 2, 3, 3]])) #[2, 2]
Success #stdin #stdout 0.09s 14132KB
stdin
Standard input is empty
stdout
[2, 2]
[1, 4]
[-1, -1]
[3, 3]
[1, -1]
[5, -1]
[2, 2]