fn recurse(const x y : int, a : array(byte, [x, y]), px py : int) : int [ if px = x - 2, py = y - 1 then return 1; var req_dir := a[px, py]; a[px, py] := 'O'; var max_r := -1; for d in "^>v<" do [ var dx, dy := 0, 0; if d = '^' then dx, dy := 0, -1; if d = '>' then dx, dy := 1, 0; if d = 'v' then dx, dy := 0, 1; if d = '<' then dx, dy := -1, 0; if req_dir <> '.', req_dir <> d then continue; if a[px + dx, py + dy] = '#' or a[px + dx, py + dy] = 'O' then continue; var r := recurse(x, y, a, px + dx, py + dy); max_r := max(max_r, r); ] if max_r = -1 then return -1; return max_r + 1; ] fn main [ var lines := list_break_to_lines(read_lazy(h[0])); const x := len(lines[0]); const y := len(lines); var a := list_to_array([x, y], list_join(lines, "")); a[1, 0] := '#'; var result := recurse(x, y, a, 1, 1); write(h[1], ntos(result) + nl); ]