(def fields [".....
...O.
.....
...^.
....." "...
>O.
..." ">O.
..." "v....
O...." "...........
...........
O.........<
..........." "......
......
.^..O." "......
.....>
O.....
......
......" ".O.
...
.v." ".....<.
..O...." "<....O
......"])

(defn z[f](let[v(sort(keep-indexed(fn[i v](if(some #{v}[\v\>\<\^\O])[(if(= v\O)\& v)i]))f))l(+(.indexOf f"\n")1)d((nth v 1)0)q((nth v 1)1)p((nth v 0)1)r(=(quot p l)(quot q l))i(> q p)](cond(= d\^)(and i(=(mod(- q p)l)0))(= d\v)(and(not i)(=(mod(- p q)l)0))(= d\>)(and(not i)r):else(and i r))))

(println (map z fields))