- from itertools import *;from random import *;R=range;L=len;O=choice;G='O' 
- def A(a,b):a.append(b) 
- def D(y,z): 
-  a=[];b=[];c=[] 
-  for i in R(L(y)): 
-   A(c,[]) 
-   for j in R(L(y[0])): 
-    k=[(i,j),y[i][j]==G,z[i][j]==G,[],0];A(c[i],k) 
-    for l,m in [(0,1),(1,0)]: 
-     try: 
-      n=c[i-l][j-m] 
-      if k[2]&n[1]:A(n[3],k) 
-      if k[1]&n[2]:A(k[3],n) 
-     except:pass 
-    if k[1]&~k[2]:A(a,k) 
-    elif k[2]&~k[1]:A(b,k) 
-  d={} 
-  for i in a: 
-   j=[[i]] 
-   while j: 
-    k=j.pop();l=[e[0] for e in k] 
-    while True: 
-     m=k[-1];n=[o for o in m[3] if o[0] not in l] 
-     if not n: 
-      if m in b:A(d.setdefault(i[0],[]),k) 
-      break 
-     for o in n[1:]:p=k[:];A(p,o);A(j,p) 
-     A(k,n[0]);A(l,n[0][0]) 
-  e={} 
-  for i in a:e[i[0]]=O(d[i[0]]) 
-  def E():return sum(any(k in j for k in i) for i,j in combinations(e.values(),2)) 
-  f=E() 
-  for i in count(): 
-   t=3**-i/L(a);j=O(a);k=e[j[0]];e[j[0]]=O(d[j[0]]);l=E() 
-   if not l:break 
-   else: 
-    if l>f and random()>t:e[j[0]]=k 
-    else:f=l 
-  for i in e.values(): 
-   for j in R(L(i)-1):i[j][4]=i[j+1] 
-  for i in c: 
-   for j in R(L(i)): 
-    k=i[j] 
-    if 1&~k[1]:i[j]='.' 
-    elif not k[4]:i[j]=G 
-    else:l,m=k[0];n,o=k[4][0];i[j]='v>^<'[abs((l-n+1)+2*(m-o))] 
-  return c 
-   
- # Tester Code 
- import time 
- import datetime 
-   
- def input_transformer(inp): 
-     return inp.strip().splitlines() 
-   
- before = """ 
- .............................. 
- .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.. 
- ..............................""" 
- after = """ 
- .............................. 
- .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..""" 
-   
- b = input_transformer(before) 
- a = input_transformer(after) 
-   
- print(before) 
- print() 
- print(after) 
-   
- start_time = time.clock() 
- print() 
-   
- output = D(b, a) 
-   
- print() 
- diff = time.clock() - start_time 
- delta = datetime.timedelta(seconds=diff) 
-   
- print('\n'.join([''.join(i) for i in output])) 
- print('Done.  Took', delta)