fork download
  1. from itertools import *;from random import *;R=range;L=len;O=choice;G='O'
  2. def A(a,b):a.append(b)
  3. def D(y,z):
  4. a=[];b=[];c=[]
  5. for i in R(L(y)):
  6. A(c,[])
  7. for j in R(L(y[0])):
  8. k=[(i,j),y[i][j]==G,z[i][j]==G,[],0];A(c[i],k)
  9. for l,m in [(0,1),(1,0)]:
  10. try:
  11. n=c[i-l][j-m]
  12. if k[2]&n[1]:A(n[3],k)
  13. if k[1]&n[2]:A(k[3],n)
  14. except:pass
  15. if k[1]&~k[2]:A(a,k)
  16. elif k[2]&~k[1]:A(b,k)
  17. d={}
  18. for i in a:
  19. j=[[i]]
  20. while j:
  21. k=j.pop();l=[e[0] for e in k]
  22. while True:
  23. m=k[-1];n=[o for o in m[3] if o[0] not in l]
  24. if not n:
  25. if m in b:A(d.setdefault(i[0],[]),k)
  26. break
  27. for o in n[1:]:p=k[:];A(p,o);A(j,p)
  28. A(k,n[0]);A(l,n[0][0])
  29. e={}
  30. for i in a:e[i[0]]=O(d[i[0]])
  31. def E():return sum(any(k in j for k in i) for i,j in combinations(e.values(),2))
  32. f=E()
  33. for i in count():
  34. t=3**-i/L(a);j=O(a);k=e[j[0]];e[j[0]]=O(d[j[0]]);l=E()
  35. if not l:break
  36. else:
  37. if l>f and random()>t:e[j[0]]=k
  38. else:f=l
  39. for i in e.values():
  40. for j in R(L(i)-1):i[j][4]=i[j+1]
  41. for i in c:
  42. for j in R(L(i)):
  43. k=i[j]
  44. if 1&~k[1]:i[j]='.'
  45. elif not k[4]:i[j]=G
  46. else:l,m=k[0];n,o=k[4][0];i[j]='v>^<'[abs((l-n+1)+2*(m-o))]
  47. return c
  48.  
  49. # Tester Code
  50. import time
  51. import datetime
  52.  
  53. def input_transformer(inp):
  54. return inp.strip().splitlines()
  55.  
  56. before = """
  57. ..............................
  58. .OOO.O.O.....O.....O.O.O..O...
  59. ..OOO.O...O..OO..O..O.O.......
  60. .....O......O..O.....O....O...
  61. .O.OOOOO......O...O..O....O...
  62. .OO..O..OO.O..OO..O..O....O...
  63. ..O.O.O......OO.OO..O..OO.....
  64. ..O....O..O.OO...OOO.OOO...O..
  65. .....O..OO......O..O...OO.OO..
  66. ........O..O........OO.O.O....
  67. ..O.....OO.....OO.OO.......O..
  68. .O.....O.O..OO.OO....O......O.
  69. ..O..OOOO..O....OO..........O.
  70. .O..O...O.O....O..O....O...OO.
  71. ....O...OO..O.......O.O..OO...
  72. ........O.O....O.O....O.......
  73. .OO.......O.OO..O.......O..O..
  74. ....O....O.O.O...OOO..O.O.OO..
  75. .OO..OO...O.O.O.O.O...OO...O..
  76. .............................."""
  77. after = """
  78. ..............................
  79. .OOOOO.......OO.....O..O......
  80. ...OO..O...O...O....OO....O...
  81. ....O.O......O..OO...OO...O...
  82. .OO.OOOO......OO..O..O........
  83. O.O.OO..O..O..O..OO...O...OO..
  84. .OO.....O....OO.O..O.OO.O.....
  85. ......O.....O.....OOO.OO...O..
  86. ....O..OOOO..O..O..O.O.O.OO...
  87. ..O......O.O........O...O.O...
  88. .O.....OOO.....OO.OO...O...O..
  89. .......OOO..O.O.O...........O.
  90. .O...O.....O...OOOO..O.O....O.
  91. .O..O.O..O.....O......O....OO.
  92. ....O..O..O.O......O.....O....
  93. ........OOO....O......O..O....
  94. .OO......O..OO..OOO.....O..O..
  95. ..O.O....OO..O...OO...O...OO..
  96. .O..OO....O..O...O.O.O.OO.....
  97. ..............O............O.."""
  98.  
  99. b = input_transformer(before)
  100. a = input_transformer(after)
  101.  
  102. print(before)
  103. print()
  104. print(after)
  105.  
  106. start_time = time.clock()
  107. print()
  108.  
  109. output = D(b, a)
  110.  
  111. print()
  112. diff = time.clock() - start_time
  113. delta = datetime.timedelta(seconds=diff)
  114.  
  115. print('\n'.join([''.join(i) for i in output]))
  116. print('Done. Took', delta)
Success #stdin #stdout 1.67s 12704KB
stdin
Standard input is empty
stdout
..............................
.OOO.O.O.....O.....O.O.O..O...
..OOO.O...O..OO..O..O.O.......
.....O......O..O.....O....O...
.O.OOOOO......O...O..O....O...
.OO..O..OO.O..OO..O..O....O...
..O.O.O......OO.OO..O..OO.....
..O....O..O.OO...OOO.OOO...O..
.....O..OO......O..O...OO.OO..
........O..O........OO.O.O....
..O.....OO.....OO.OO.......O..
.O.....O.O..OO.OO....O......O.
..O..OOOO..O....OO..........O.
.O..O...O.O....O..O....O...OO.
....O...OO..O.......O.O..OO...
........O.O....O.O....O.......
.OO.......O.OO..O.......O..O..
....O....O.O.O...OOO..O.O.OO..
.OO..OO...O.O.O.O.O...OO...O..
..............................


..............................
.OOOOO.......OO.....O..O......
...OO..O...O...O....OO....O...
....O.O......O..OO...OO...O...
.OO.OOOO......OO..O..O........
O.O.OO..O..O..O..OO...O...OO..
.OO.....O....OO.O..O.OO.O.....
......O.....O.....OOO.OO...O..
....O..OOOO..O..O..O.O.O.OO...
..O......O.O........O...O.O...
.O.....OOO.....OO.OO...O...O..
.......OOO..O.O.O...........O.
.O...O.....O...OOOO..O.O....O.
.O..O.O..O.....O......O....OO.
....O..O..O.O......O.....O....
........OOO....O......O..O....
.OO......O..OO..OOO.....O..O..
..O.O....OO..O...OO...O...OO..
.O..OO....O..O...O.O.O.OO.....
..............O............O..


..............................
.OOO.O.v.....>.....>.v.O..v...
..>>^.v...>..^>..v..O.v.......
.....v......>..>.....O....O...
.O.<^<OO......O...O..O....v...
.<O..O..v<.O..O^..O..>....>...
..<.^.v......OO.O^..v..vO.....
..^....v..v.Ov...>>^.^^<...O..
.....<..OO......O..O...O>.v<..
........>..O........O^.v.<....
..^.....OO.....OO.OO.......O..
.^.....^.O..O>.>v....v......O.
..<..Ov^^..O....<O..........O.
.O..O...>.v....O..^....^...OO.
....O...<v..O.......<.^..v<...
........O.O....O.v....O.......
.OO.......<.OO..O.......O..O..
....O....O.<.O...O^<..O.v.OO..
.O^..<<...O.>.v.>.>...<O...v..
..............................
Done.  Took 0:00:01.641953