parent
5fe6870069
commit
4a0846a625
@ -0,0 +1,136 @@ |
|||||||
|
import "aoc" for AoC |
||||||
|
|
||||||
|
class Forest { |
||||||
|
construct new(w, h) { |
||||||
|
_w = w |
||||||
|
_h = h |
||||||
|
_trees = List.filled(w*h, 0) |
||||||
|
} |
||||||
|
|
||||||
|
w { _w } |
||||||
|
h { _h } |
||||||
|
|
||||||
|
get(x, y) { _trees[x+_w*y] } |
||||||
|
set(x, y, t) { _trees[x+_w*y] = t } |
||||||
|
|
||||||
|
visible_cardinal(x, y) { |
||||||
|
if(x == 0 || y == 0 || x == w-1 || y == h-1) { |
||||||
|
return true |
||||||
|
} |
||||||
|
|
||||||
|
var t = get(x, y) |
||||||
|
|
||||||
|
var vis = true |
||||||
|
for(xi in 0...x) { |
||||||
|
if(get(xi, y) >= t) { |
||||||
|
vis = false |
||||||
|
break |
||||||
|
} |
||||||
|
} |
||||||
|
if(vis) return true |
||||||
|
|
||||||
|
vis = true |
||||||
|
for(yi in 0...y) { |
||||||
|
if(get(x, yi) >= t) { |
||||||
|
vis = false |
||||||
|
break |
||||||
|
} |
||||||
|
} |
||||||
|
if(vis) return true |
||||||
|
|
||||||
|
vis = true |
||||||
|
for(xi in (x+1)...w) { |
||||||
|
if(get(xi, y) >= t) { |
||||||
|
vis = false |
||||||
|
break |
||||||
|
} |
||||||
|
} |
||||||
|
if(vis) return true |
||||||
|
|
||||||
|
vis = true |
||||||
|
for(yi in (y+1)...h) { |
||||||
|
if(get(x, yi) >= t) { |
||||||
|
vis = false |
||||||
|
break |
||||||
|
} |
||||||
|
} |
||||||
|
if(vis) return true |
||||||
|
|
||||||
|
return false |
||||||
|
} |
||||||
|
|
||||||
|
score(x, y) { |
||||||
|
if(x == 0 || y == 0 || x == w-1 || y == h-1) { |
||||||
|
return 0 |
||||||
|
} |
||||||
|
|
||||||
|
var t = get(x, y) |
||||||
|
|
||||||
|
var score_left = 0 |
||||||
|
for(xi in (x-1)..0) { |
||||||
|
score_left = score_left + 1 |
||||||
|
if(get(xi, y) >= t) { |
||||||
|
break |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
var score_up = 0 |
||||||
|
for(yi in (y-1)..0) { |
||||||
|
score_up = score_up + 1 |
||||||
|
if(get(x, yi) >= t) { |
||||||
|
break |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
var score_right = 0 |
||||||
|
for(xi in (x+1)...(_w)) { |
||||||
|
score_right = score_right + 1 |
||||||
|
if(get(xi, y) >= t) { |
||||||
|
break |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
var score_down = 0 |
||||||
|
for(yi in (y+1)...(_h)) { |
||||||
|
score_down = score_down + 1 |
||||||
|
if(get(x, yi) >= t) { |
||||||
|
break |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return score_left * score_up * score_right * score_down |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
var input = AoC.input |
||||||
|
var row_count = input.where {|x| x == "\n"}.count |
||||||
|
var lines = input.split("\n").where {|x| x != ""} |
||||||
|
|
||||||
|
var forest = null |
||||||
|
var x = 0 |
||||||
|
for(line in lines) { |
||||||
|
if(!forest) forest = Forest.new(line.count, row_count) |
||||||
|
var y = 0 |
||||||
|
for(tree in line) { |
||||||
|
forest.set(x, y, Num.fromString(tree)) |
||||||
|
y = y + 1 |
||||||
|
} |
||||||
|
x = x + 1 |
||||||
|
} |
||||||
|
|
||||||
|
var total_visible = 0 |
||||||
|
var best_score = 0 |
||||||
|
for(x in 0...forest.w) { |
||||||
|
for(y in 0...forest.h) { |
||||||
|
if(forest.visible_cardinal(x, y)) { |
||||||
|
total_visible = total_visible + 1 |
||||||
|
} |
||||||
|
var score = forest.score(x, y) |
||||||
|
if(score > best_score) { |
||||||
|
best_score = score |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
System.print(total_visible) |
||||||
|
System.print(best_score) |
Loading…
Reference in new issue