59 lines
1.5 KiB
Nim
59 lines
1.5 KiB
Nim
|
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())
|