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)