Powered by AppSignal & Oban Pro

Advent of code day 09

2023/livebooks/day-09.livemd

Advent of code day 09

Mix.install([
  {:kino, "~> 0.5.0"}
])

Setup input

example = Kino.Input.textarea("Please paste your input example:")
input = Kino.Input.textarea("Please paste your real input:")

Helpers

defmodule Recursion do
  def part1(list) do
    if(Enum.all?(list, fn x -> x == 0 end)) do
      0
    else
      diffs = get_diffs(list)
      List.last(list) + part1(diffs)
    end
  end

  def part2(list) do
    if(Enum.all?(list, fn x -> x == 0 end)) do
      0
    else
      diffs = get_diffs(list)
      List.first(list) - part2(diffs)
    end
  end

  defp get_diffs(list) do
    list
    |> Enum.chunk_every(2, 1, :discard)
    |> Enum.map(fn [a, b] -> b - a end)
  end
end
formated_input =
  input
  |> Kino.Input.read()
  |> String.split("\n")
  |> Enum.map(
    &(&1
      |> String.split(" ", trim: true)
      |> Enum.map(fn e -> String.to_integer(e) end))
  )

Part 01

formated_input
|> Enum.map(fn list -> Recursion.part1(list) end)
|> Enum.sum()

Part 02

formated_input
|> Enum.map(fn list -> Recursion.part2(list) end)
|> Enum.sum()