Powered by AppSignal & Oban Pro

🎄 Year 2020 🔔 Day 03

elixir/notebooks/2020/day03.livemd

🎄 Year 2020 🔔 Day 03

Parse input

filename = "#{__DIR__}/../../../inputs/2020/day03.txt"

parsed_input_stream =
  File.stream!(filename)
  |> Stream.map(&String.trim(&1))

Shared code

defmodule Helper do
  def count_trees(lines, right, down) do
    width = lines |> Enum.take(1) |> List.first() |> String.graphemes() |> Enum.count()

    lines
    |> Stream.take_every(down)
    |> Stream.zip(Stream.iterate(0, fn acc -> rem(acc + right, width) end))
    |> Stream.map(fn {line, n} -> line |> String.graphemes() |> Enum.at(n) end)
    |> Enum.filter(fn char -> char == "#" end)
    |> Enum.count()
  end
end

Part One

parsed_input_stream
|> Helper.count_trees(3, 1)

Part two

[{1, 1}, {3, 1}, {5, 1}, {7, 1}, {1, 2}]
|> Enum.map(fn {right, down} -> Helper.count_trees(parsed_input_stream, right, down) end)
|> Enum.product()