fork download
  1. E=enumerate
  2. def f(g):
  3. q,s,S=[{(x,y):v for x,r in E(g)for y,v in E(r)}],[],0;Z='*'
  4. for d in q:
  5. D={}
  6. for i in d:
  7. if'/'<d[i]<':':
  8. u={Z:0,'?':0}
  9. for X,Y in(0,1),(1,0),(-1,0),(0,-1),(1,1),(-1,1),(1,-1),(-1,-1):
  10. if(N:=d.get((i[0]+X,i[1]+Y)))in u:u[N]+=1
  11. D[i]=u
  12. if all(D[i][Z]==int(d[i])for i in D):S+=1
  13. elif~-all(D[i][Z]>=int(d[i])<=D[i][Z]+D[i]['?']for i in D):
  14. for i in d:z=(('?'==d[i])>((U:={**d,i:Z})in s))*[U];q+=z;s+=z
  15. return S
  16.  
  17. def to_board(s):
  18. return [[*i] for i in filter(None, s.split('\n'))]
  19.  
  20. s = """
  21. 1121
  22. 1??*
  23. 12?*
  24. 0122
  25.  
  26. 1110
  27. 1???
  28. 1110
  29. 0000
  30.  
  31. 1110
  32. 3???
  33. ??20
  34. *310
  35.  
  36. ****
  37. ****
  38. ****
  39. ****
  40.  
  41. 0000
  42. 0000
  43. 0000
  44. 0000
  45.  
  46. 1100
  47. *100
  48. 2321
  49. ??*2
  50. 13*2
  51. 1221
  52. 1*10
  53. 1110
  54.  
  55. 1121
  56. 2*??
  57. 2*31
  58. 2220
  59. 1*10
  60. """
  61.  
  62. s1 = """
  63. 1110
  64. 2*31
  65. 3*??
  66. 2*4?
  67. 112?
  68.  
  69. 01??11*211
  70. 12??2323*1
  71. 1*33*2*210
  72. 12?2122321
  73. 13?3101**1
  74. 1***101221
  75.  
  76. 1***
  77. 3*52
  78. 2*31
  79. 12??
  80. 02??
  81. 01??
  82.  
  83. 00000111
  84. 000012*1
  85. 00001*21
  86. 22101110
  87. **100111
  88. ?31123*1
  89. ?311**31
  90. **113*20
  91. """
  92. for i in s.split('\n\n'):
  93. assert f(to_board(i)) == 1
  94.  
  95. for i in s1.split('\n\n'):
  96. assert f(to_board(i)) != 1
  97.  
  98. print('tests passed')
Success #stdin #stdout 0.13s 14032KB
stdin
Standard input is empty
stdout
tests passed