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(a : array(byte, [x, y]), 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); var dx2 := uninitialized(int); var dy2 := uninitialized(int); for di := -1 to 2 do [ for dj := -1 to 2 do [ if is_connected(a, sx + di, sy + dj, -di, -dj) then [ if is_uninitialized(dx) then [ dx := di; dy := dj; ] else if is_uninitialized(dx2) then [ dx2 := di; dy2 := dj; ] else [ abort; ] ] ] ] for i in "|-LJ7F" do [ a[sx, sy] := i; if is_connected(a, sx, sy, dx, dy), is_connected(a, sx, sy, dx2, dy2) then goto found1; ] abort; found1: var used := array_fill(false, [x, y]); var px, py := sx, sy; while true do [ px += dx; py += dy; used[px, py] := true; 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(a, px, py, di, dj) then [ dx := di; dy := dj; goto found2; ] ] ] abort; found2: ] var total_in := 0; for j := 0 to y do [ var is_in := false; for i := 0 to x do [ if not used[i, j] then [ total_in += select(is_in, 0, 1); continue; ] var ch := a[i, j]; if ch = '|' then [ is_in := not is_in; continue; ] if ch = 'F' or ch = 'L' then [ i += 1; while a[i, j] = '-' do i += 1; var ch2 := a[i, j]; if ch = 'F' and ch2 = 'J' or ch = 'L' and ch2 = '7' then is_in := not is_in; continue; ] abort; ] if is_in then abort; ] write(h[1], ntos(total_in) + nl); ]