Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Day 08

2022/day08.livemd

Day 08

lines =
  File.stream!("./2022/day08input.txt")
  |> Stream.map(&String.trim/1)

grid =
  for {line, row} <- Enum.with_index(lines),
      {height, col} <- Enum.with_index(to_charlist(line)),
      into: %{} do
    {{row, col}, height - ?0}
  end

Part 1

square_size = Enum.count(lines)
square_max_idx = square_size - 1

Enum.count(grid, fn
  {{row, col}, _height} when row in [0, square_max_idx] or col in [0, square_max_idx] ->
    true

  {{row, col}, height} ->
    Enum.all?(0..(row - 1), &amp;(grid[{&amp;1, col}] < height)) or
      Enum.all?((row + 1)..square_max_idx, &amp;(grid[{&amp;1, col}] < height)) or
      Enum.all?(0..(col - 1), &amp;(grid[{row, &amp;1}] < height)) or
      Enum.all?((col + 1)..square_max_idx, &amp;(grid[{row, &amp;1}] < height))
end)

Part 2

square_size = Enum.count(lines)
square_max_idx = square_size - 1

maybe_count_until = fn
  _enum, 0 -> 0
  enum, limit -> Enum.count_until(enum, limit)
end

grid
|> Enum.map(fn
  {{row, col}, _height} when row in [0, square_max_idx] or col in [0, square_max_idx] ->
    0

  {{row, col}, height} ->
    top =
      (row - 1)..0
      |> Enum.take_while(&amp;(grid[{&amp;1, col}] < height))
      |> maybe_count_until.(row - 1)
      |> Kernel.+(1)

    right =
      (col + 1)..square_max_idx
      |> Enum.take_while(&amp;(grid[{row, &amp;1}] < height))
      |> maybe_count_until.(square_max_idx - col - 1)
      |> Kernel.+(1)

    bottom =
      (row + 1)..square_max_idx
      |> Enum.take_while(&amp;(grid[{&amp;1, col}] < height))
      |> maybe_count_until.(square_max_idx - row - 1)
      |> Kernel.+(1)

    left =
      (col - 1)..0
      |> Enum.take_while(&amp;(grid[{row, &amp;1}] < height))
      |> maybe_count_until.(col - 1)
      |> Kernel.+(1)

    top * right * bottom * left
end)
|> Enum.max()