Advent of Code 2023 Day 9 Part 2
Mix.install([
{:kino_aoc, "~> 0.1.5"}
])
Get Inputs
{:ok, puzzle_input} =
KinoAOC.download_puzzle("2023", "9", System.fetch_env!("LB_SESSION"))
My answer
defmodule Resolver do
def parse(input) do
input
|> String.split("\n")
|> Enum.map(fn line ->
line
|> String.split(" ")
|> Enum.map(&String.to_integer(&1))
end)
end
def resolve(array_list) do
array_list
|> Enum.map(fn array ->
diff_array_list =
0..(Enum.count(array) - 1)
|> Enum.reduce_while([array], fn _index, acc ->
last_array = Enum.at(acc, -1)
diff_array = diff(last_array)
if Enum.all?(diff_array, &(&1 == 0)) do
{:halt, acc ++ [diff_array]}
else
{:cont, acc ++ [diff_array]}
end
end)
even_sum =
diff_array_list
|> Enum.take_every(2)
|> Enum.map(&hd(&1))
|> Enum.sum()
odd_sum =
diff_array_list
|> tl()
|> Enum.take_every(2)
|> Enum.map(&hd(&1))
|> Enum.sum()
even_sum - odd_sum
end)
|> Enum.sum()
end
defp diff(array) do
{_, a_array} = List.pop_at(array, 0)
{_, b_array} = List.pop_at(array, -1)
Enum.zip(a_array, b_array)
|> Enum.map(fn {a, b} ->
a - b
end)
end
end
array_list =
"""
0 3 6 9 12 15
1 3 6 10 15 21
10 13 16 21 30 45
"""
|> String.slice(0..-2)
|> Resolver.parse()
Resolver.resolve(array_list)
array_list = Resolver.parse(puzzle_input)
Resolver.resolve(array_list)