From 15e76f80b7c7d063bdca4c5fa76d4b80ad6e4ad5 Mon Sep 17 00:00:00 2001 From: Shanti Chellaram Date: Sat, 10 Dec 2022 23:14:12 +0900 Subject: [PATCH] Day 8-2 --- day8.erl | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/day8.erl b/day8.erl index 5b916df..5020781 100644 --- a/day8.erl +++ b/day8.erl @@ -2,11 +2,22 @@ -export([solve/1]). --compile(export_all). - solve(Input) -> Grid = parse_grid(Input), - {map_size(visible_trees(Grid)), none}. + {map_size(visible_trees(Grid)), scenery(Grid)}. + + +scenery({_, H, W} = Grid) -> + Visible0 = #{}, + %Left + Visible1 = range_fold(0, H-1, fun(Row, Acc) -> element(2, grid_traverse(fun scenery_score/3, {[], Acc}, Grid, {0, Row}, {1, 0})) end, Visible0), + %Right + Visible2 = range_fold(0, H-1, fun(Row, Acc) -> element(2, grid_traverse(fun scenery_score/3, {[], Acc}, Grid, {W-1, Row}, {-1, 0})) end, Visible1), + %Top + Visible3 = range_fold(0, W-1, fun(Col, Acc) -> element(2, grid_traverse(fun scenery_score/3, {[], Acc}, Grid, {Col, 0}, {0, 1})) end, Visible2), + %Bottom + Visible4 = range_fold(0, W-1, fun(Col, Acc) -> element(2, grid_traverse(fun scenery_score/3, {[], Acc}, Grid, {Col, H-1}, {0, -1})) end, Visible3), + lists:max(maps:values(Visible4)). visible_trees({_, H, W} = Grid) -> %top @@ -23,6 +34,16 @@ visible_trees({_, H, W} = Grid) -> visible_path(Tree, Position, {MaxHeight, Visible}) when Tree > MaxHeight -> {Tree, Visible#{Position => []}}; visible_path(_Tree, _Position, State) -> State. +% horrible name, calculate the view distance in one direction +tree_stack(_Tree, []) -> 0; +tree_stack(Tree, [Other|_Rest]) when Other >= Tree -> 1; +tree_stack(Tree, [_Other|Rest]) -> tree_stack(Tree, Rest) + 1. + +scenery_score(Tree, Position, {TreeStack, Trees}) -> + Distance = tree_stack(Tree, TreeStack), + NewTrees = Trees#{Position => Distance * maps:get(Position, Trees, 1)}, + {[Tree|TreeStack], NewTrees}. + grid_traverse(Fun, AccIn, Grid, {XPos, YPos}, {XVec, YVec}) -> case grid_at(Grid, XPos, YPos) of error -> AccIn;