1
0
Fork 0
advent-of-code/2023/lib/2023/9.ex
2023-12-09 13:37:06 -05:00

43 lines
790 B
Elixir

import AOC
import AOCHelpers
aoc 2023, 9 do
def p1(input) do
input
|> lines_of_integers()
|> Enum.map(&next_in_sequence/1)
|> Enum.sum()
end
def p2(input) do
input
|> lines_of_integers()
|> Enum.map(&prev_in_sequence/1)
|> Enum.sum()
end
def next_in_sequence(xs) do
xs
|> differentiate()
|> Enum.map(&List.last/1)
|> Enum.sum()
end
def prev_in_sequence(xs) do
xs
|> differentiate()
|> Enum.map(&List.first/1)
|> Enum.reverse()
|> Enum.reduce(&(&1 - &2))
end
def differentiate(xs) do
xs
|> Stream.iterate(&deltas/1)
|> Enum.take_while(&(not all_zeros?(&1)))
end
def deltas(xs), do: Enum.zip_with(xs, Enum.drop(xs, 1), &(&2 - &1))
def all_zeros?(xs), do: Enum.all?(xs, is?(0))
end