fork download
  1. import random as U
  2. E=enumerate
  3. def T(b,x,y):
  4. D={}
  5. for i in b:D[i[x]]=D.get(i[x],[])+[i[y]]
  6. return D
  7. def B(b):
  8. P=[(x,y)for x,r in E(b)for y,k in E(r)if' '!=k];p=[*P]
  9. while p:
  10. q=[(r:=p.pop(0),[r])]
  11. while q:
  12. (x,y),r=q.pop(0)
  13. for j,k in(x+1,y),(x-1,y),(x,y-1),(x,y+1):
  14. V=(j,k)
  15. if(len(b)>j>-1<k<len(b[0]))*(len(r)<2or V!=r[-2]):
  16. if j==x and'-'==b[j][k]or k==y and'|'==b[j][k]or b[x][y]!=b[j][k]:
  17. if V in r:yield r;p=[*({*p}-{*r})];q=[]
  18. elif V in P:q+=(V,[*r,V]),
  19. def f(b):
  20. K=[]
  21. for i in B(b):Q,W=T(i,0,1),T(i,1,0);K+=[(x,y)for x,r in E(b)for y,k in E(r)if' '==k and x in Q and min(Q[x])<=y<=max(Q[x])and y in W and min(W[y])<=x<=max(W[y])]
  22. x,y=U.choice(K);b[x][y]='*'
  23. return b
  24.  
  25. s="""
  26. ---
  27. | |
  28. ---
  29. """
  30. s1="""
  31. ----
  32. | |- ---
  33. | | | |
  34. ----- ---
  35. """
  36. s2="""
  37. ---
  38. | |
  39. -- --
  40. | |
  41. -----
  42. """
  43. s3="""
  44. -------
  45. | --- |
  46. | | | |
  47. | --- |
  48. -------
  49. """
  50.  
  51. def to_art(t):
  52. return [[*i] for i in filter(None, t.split('\n'))]
  53.  
  54.  
  55. for i in f(to_art(s)):
  56. print(''.join(i))
  57.  
  58. for i in f(to_art(s1)):
  59. print(''.join(i))
  60.  
  61. for i in f(to_art(s2)):
  62. print(''.join(i))
  63.  
  64.  
  65. for i in f(to_art(s3)):
  66. print(''.join(i))
Success #stdin #stdout 0.1s 14240KB
stdin
Standard input is empty
stdout
---
|*|
---
----       
|  |-   ---
|   |   |*|
-----   ---
 --- 
 | | 
-- --
|  *|
-----
-------
| --- |
| |*| |
| --- |
-------