Powered by AppSignal & Oban Pro

Advent of Code 2021 - Day 1

2021/day01.livemd

Advent of Code 2021 - Day 1

Utils

defmodule Utils do
  def read_textarea(name) do
    Stream.iterate("", fn _ -> IO.gets(name) end)
    |> Stream.take_while(&(&1 != :eof))
    |> Enum.join("\r\n")
  end
end
{:module, Utils, <<70, 79, 82, 49, 0, 0, 7, ...>>, {:read_textarea, 1}}

Part 1

defmodule Day1 do
  def solve(input) do
    input
    # to list of strings
    |> String.split(~r{\s}, trim: true)
    # to list of ints
    |> Enum.map(&amp;String.to_integer/1)
    # [1, 2, 3] => [[1, 2], [2, 3]]
    |> Enum.chunk_every(2, 1, :discard)
    |> Enum.filter(fn [first, second] -> second > first end)
    |> Enum.count()
  end
end

IO.inspect(Day1.solve(Utils.read_textarea("example_input")))
IO.inspect(Day1.solve(Utils.read_textarea("my_input")))
7
1301
1301

Part 2

defmodule Day1.Part2 do
  def solve(input) do
    input
    # to list of strings
    |> String.split(~r{\s}, trim: true)
    # to list of ints
    |> Enum.map(&amp;String.to_integer/1)
    #  [1, 2, 3, 4, 5] => [[1, 2, 3], [2, 3, 4], [3, 4, 5]]
    |> Enum.chunk_every(3, 1, :discard)
    # [[1, 2, 3], [2, 3, 4], [3, 4, 5]] => [6, 9, 12]
    |> Enum.map(&amp;Enum.sum/1)
    # [1, 2, 3] => [[1, 2], [2, 3]]
    |> Enum.chunk_every(2, 1, :discard)
    |> Enum.filter(fn [first, second] -> second > first end)
    |> Enum.count()
  end
end

IO.inspect(Day1.Part2.solve(Utils.read_textarea("example_input")))
IO.inspect(Day1.Part2.solve(Utils.read_textarea("my_input")))
5
1346
1346