fn main [ var lines := list_break_to_lines(read_lazy(h[0])); const x := len(lines[0]) + 2; const y := len(lines) + 2; var a := array_fill(byte, '.', [x, y]); var sx := uninitialized(int); var sy := uninitialized(int); for j := 1 to y - 1 do [ var line := lines[j - 1]; for i := 1 to x - 1 do [ a[i, j] := line[i - 1]; if a[i, j] = 'S' then sx, sy := i, j; ] ] fn is_connected(i j di dj : int) : bool [ var c := array_fill(int8, 0, [3, 3]); var ch := a[i, j]; if ch = '|', di = 0 and dj = -1 or di = 0 and dj = 1 then return true; if ch = '-', di = -1 and dj = 0 or di = 1 and dj = 0 then return true; if ch = 'L', di = 0 and dj = -1 or di = 1 and dj = 0 then return true; if ch = 'J', di = 0 and dj = -1 or di = -1 and dj = 0 then return true; if ch = '7', di = 0 and dj = 1 or di = -1 and dj = 0 then return true; if ch = 'F', di = 0 and dj = 1 or di = 1 and dj = 0 then return true; return false; ] var dx := uninitialized(int); var dy := uninitialized(int); for di := -1 to 2 do [ for dj := -1 to 2 do [ if is_connected(sx + di, sy + dj, -di, -dj) then [ dx := di; dy := dj; goto found1; ] ] ] abort; found1: var px, py := sx, sy; var count := 0; while true do [ px += dx; py += dy; count += 1; if px = sx, py = sy then break; for di := -1 to 2 do [ for dj := -1 to 2 do [ if di = -dx, dj = -dy then continue; if is_connected(px, py, di, dj) then [ dx := di; dy := dj; goto found2; ] ] ] abort; found2: ] count := count div 2; write(h[1], ntos(count) + nl); ]