54 lines
1.1 KiB
Elixir
54 lines
1.1 KiB
Elixir
|
defmodule AOC.Day8 do
|
||
|
use AOC.Day, day: 8, debug: true
|
||
|
|
||
|
def parse_input(lines) do
|
||
|
Enum.map(lines, fn line ->
|
||
|
line
|
||
|
|> String.split("", trim: true)
|
||
|
|> Enum.map(&String.to_integer/1)
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
def part1(rows) do
|
||
|
rows = with_index(rows)
|
||
|
|
||
|
cols = Enum.zip(rows) |> Enum.map(&Tuple.to_list/1)
|
||
|
rrows = Enum.map(rows, &Enum.reverse/1)
|
||
|
rcols = Enum.map(cols, &Enum.reverse/1)
|
||
|
|
||
|
[rows, cols, rrows, rcols]
|
||
|
|> Enum.map(&count_visible/1)
|
||
|
|> Enum.reduce(&MapSet.union/2)
|
||
|
|> Enum.count()
|
||
|
end
|
||
|
|
||
|
def part2(rows) do
|
||
|
rows
|
||
|
end
|
||
|
|
||
|
def with_index(rows) do
|
||
|
Enum.with_index(rows, fn row, y ->
|
||
|
Enum.with_index(row, fn el, x ->
|
||
|
%{height: el, x: x, y: y}
|
||
|
end)
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
def count_visible(rows) do
|
||
|
rows
|
||
|
|> Enum.map(&count_visible_row/1)
|
||
|
|> Enum.map(&elem(&1, 0))
|
||
|
|> Enum.reduce(&MapSet.union/2)
|
||
|
end
|
||
|
|
||
|
def count_visible_row(row) do
|
||
|
Enum.reduce(row, {MapSet.new(), -1}, fn
|
||
|
%{height: h, x: x, y: y}, {trees, highest} when h > highest ->
|
||
|
{MapSet.put(trees, {x, y}), h}
|
||
|
|
||
|
_, acc ->
|
||
|
acc
|
||
|
end)
|
||
|
end
|
||
|
end
|