fork download
  1. from itertools import*
  2. W=sorted
  3. L=len
  4. def f(e,d):
  5. s=[];R=1
  6. for S in e:
  7. a,b=map(set,zip(*S[0]));I=L(b)!=1if L(a)-L(b)else'-'==d[S[0][0]];D={}
  8. for i in S[1]:D[i[I]]=D.get(i[I],[])+[i[1-I]]
  9. F=lambda x:abs(x-[*[b,a][I]][0]);U=[F(max(D[i],key=F))for i in W(D)];s+=(L(S[0]),*[L([*b])for a,b in groupby(U)if a==max(U)]),
  10. (_,u),*l=W(s)[::-1]
  11. for a,b in l:R*=a<=u;u=min(a,b)
  12. return R
  13.  
  14. E=enumerate
  15. M={(1,0):'|',(-1,0):'|',(0,-1):'-',(0,1):'-'}
  16. def O(m):
  17. d={(x,y):v for x,r in E(m)for y,v in E(r)}
  18. q,s=[i for i in d if'#'==d[i]],[]
  19. while q:
  20. Q,S=[q[0]],[[],[q[0]]];q={*q}-{q[0]}
  21. for x,y in Q:
  22. for X,Y in M:
  23. if(V:=(x+X,y+Y))in q or(d.get(V)in M.values()and V not in S[0]):S[V in q]+=[V];Q+=[V];q=[*{*q}-{V}]
  24. for x,y in S[0]:
  25. for X,Y in M:
  26. if M[(X,Y)]==d[(x,y)]and(V:=(x+X,y+Y))not in S[0]and d.get(V)==d[(x,y)]:S[0]+=[V]
  27. s+=[S]
  28. return s,d
  29.  
  30. s1= """
  31. ####
  32. ## #
  33. ## ##
  34. #### # ##
  35. # ## ## ### ## #
  36. # # ## ### ## # #
  37. ---- ------ -- - --
  38. """
  39. s2 = """
  40. ##
  41. ##
  42. ##
  43. ####
  44. # # #
  45. ---- -
  46. """
  47. s3 = """
  48. # #
  49. ### #
  50. # # #
  51. --- -
  52. """
  53. s4 = """
  54. ###
  55. ###
  56. ### ## #
  57. --- -- -
  58. """
  59. s5 = """
  60. #
  61. #### #
  62. # ## #
  63. ### # #
  64. ##### # ###### ###
  65. ----- - ------ ---
  66. """
  67. s6 = """
  68. #
  69. # # # # # # # #
  70. - - - - - - - -
  71. """
  72. s7 = """
  73. #
  74. # # ##
  75. --- --
  76. """
  77. s8 = """
  78. #
  79. # #
  80. ### ## # #
  81. ## # ## ### #####
  82. ---- -- --- -----
  83. """
  84. s9= """
  85. # #
  86. ## ### # #
  87. -- --- - -
  88. """
  89. s10= """
  90. #
  91. #### #
  92. ---- --
  93. """
  94. def to_board(s):
  95. return [[*i] for i in filter(None, s.split('\n'))]
  96. print(f(*O(to_board(s1))))
  97. print(f(*O(to_board(s2))))
  98. print(f(*O(to_board(s3))))
  99. print(f(*O(to_board(s4))))
  100. print(f(*O(to_board(s5))))
  101. print(f(*O(to_board(s6))))
  102. print(f(*O(to_board(s7))))
  103. print(f(*O(to_board(s8))))
  104. print(f(*O(to_board(s9))))
  105. print(f(*O(to_board(s10))))
Success #stdin #stdout 0.09s 14120KB
stdin
Standard input is empty
stdout
1
1
1
1
1
1
0
0
0
0