import std/strutils import std/sequtils proc direction_score(grid: seq[seq[int]], icx: int, icy: int, width: int, height: int, dx: int, dy: int): int = let v = grid[icy][icx] var cx = icx var cy = icy var c = 0 while true: cx += dx cy += dy if cx < 0 or cy < 0 or cx >= width or cy >= height: return c c += 1 if grid[cy][cx] >= v: return c proc scenic_score(grid: seq[seq[int]], cx: int, cy: int, width: int, height: int): int = let x_pos = direction_score(grid, cx, cy, width, height, +1, 00) let x_neg = direction_score(grid, cx, cy, width, height, -1, 00) let y_pos = direction_score(grid, cx, cy, width, height, 00, +1) let y_neg = direction_score(grid, cx, cy, width, height, 00, -1) return x_pos * x_neg * y_pos * y_neg proc run08_2(): string = const input = staticRead"../input/day08.txt" let grid = splitLines(input) .filterIt(it != "") .mapIt(it.toSeq().map(proc(p:char):int = parseInt(p.repeat(1)))) # echo grid let width = grid[0].len() let height = grid.len() # echo width, "x", height var max_score = 0 for y in 0 ..< height: for x in 0 ..< width: let ss = scenic_score(grid, x, y, width, height) # echo "[", x, ",", y, "]: ", ss if ss > max_score: max_score = ss return intToStr(max_score) when not defined(js): echo run08_2() else: proc js_run08_2(): cstring {.exportc.} = return cstring(run08_2())