Powered by AppSignal & Oban Pro

🎄 Year 2023 🔔 Day 09

elixir/notebooks/2023/day09.livemd

🎄 Year 2023 🔔 Day 09

Setup

sequences =
  File.read!("#{__DIR__}/../../../inputs/2023/day09.txt")
  |> String.split("\n", trim: true)
  |> Enum.map(fn line ->
    line
    |> String.split(" ")
    |> Enum.map(&String.to_integer/1)
  end)

Part 1

sequences
|> Enum.map(fn sequence ->
  Stream.iterate(sequence, fn step ->
    step
    |> Enum.chunk_every(2, 1, :discard)
    |> Enum.map(fn [a, b] -> b - a end)
  end)
  |> Enum.take_while(&Enum.any?(&1, fn e -> e !== 0 end))
  |> Enum.map(&List.last/1)
  |> Enum.sum()
end)
|> Enum.sum()

Part 2

sequences
|> Enum.map(fn sequence ->
  Stream.iterate(sequence, fn step ->
    step
    |> Enum.chunk_every(2, 1, :discard)
    |> Enum.map(fn [a, b] -> b - a end)
  end)
  |> Enum.take_while(&Enum.any?(&1, fn e -> e !== 0 end))
  |> Enum.map(&List.first/1)
  |> Enum.reverse()
  |> Enum.reduce(0, fn e, acc -> e - acc end)
end)
|> Enum.sum()