This commit is contained in:
Caleb Webber 2023-12-09 01:46:16 -05:00
parent 2c22dc9300
commit d798c72cc3
3 changed files with 51 additions and 33 deletions

View file

@ -1,8 +1,13 @@
{_, puzzle_input} = File.read("./input/2023_8.txt")
puzzle_input_for_day = fn (year, day) ->
{_, puzzle_input} = File.read("./input/#{year}_#{day}.txt")
puzzle_input
end
Benchee.run(
%{
"day8_part2" => fn -> Mix.Tasks.Day8.solve(puzzle_input, :part2) end
"day8_part2" => {fn input -> Mix.Tasks.Day8.solve(input, :part2) end, before_scenario: fn _ -> puzzle_input_for_day.(2023, 8) end},
"day9_part1" => {fn input -> Mix.Tasks.Day9.solve(input, :part1) end, before_scenario: fn _ -> puzzle_input_for_day.(2023, 9) end},
"day9_part2" => {fn input -> Mix.Tasks.Day9.solve(input, :part2) end, before_scenario: fn _ -> puzzle_input_for_day.(2023, 9) end},
}
)

View file

@ -3,55 +3,53 @@ defmodule Mix.Tasks.Day9 do
def run(_) do
{_, content} = File.read("./input/2023_9.txt")
solve(content)|> inspect() |> IO.puts()
solve(content, :part2) |> inspect() |> IO.puts()
end
def solve(content) do
def reverse_if_part_two(list, part) do
if part == :part2 do
Enum.reverse(list)
else
list
end
end
def solve(content, part) do
content
|> String.split("\n")
|> Stream.reject(&(&1 === ""))
|> Stream.map(fn line ->
line
|> String.split(" ")
|> Stream.map(&String.to_integer/1)
|> Enum.to_list()
end)
|> Stream.map(fn list ->
IO.puts(inspect(list))
extrapolate(list)
|> String.split("\n")
|> Stream.reject(&(&1 === ""))
|> Stream.map(fn line ->
line
|> String.split(" ")
|> Stream.map(&String.to_integer/1)
|> Enum.to_list()
|> then(&reverse_if_part_two(&1, part))
end)
|> Enum.reduce([],
fn l, acc ->
[l |> Enum.sum()
| acc]
end) |> Enum.sum()
|> Stream.map(&extrapolate/1)
|> Enum.reduce(0, &(&1 + &2))
end
def extrapolate(list) do
extrapolate(list, [])
extrapolate(list, 0)
end
def to_difference_list(nums) do
IO.puts("differencing #{inspect(nums)}")
list = nums
list =
nums
|> Stream.chunk_every(2, 1, :discard)
|> Enum.reduce([], fn [a,b], acc -> [ b - a | acc] end)
IO.puts("differenc was #{inspect(list)}")
|> Enum.reduce([], fn [a, b], acc -> [b - a | acc] end)
|> Enum.reverse()
list
end
def extrapolate([0], acc) do
[0 | acc]
acc
end
def extrapolate(list, acc) do
IO.puts("extrapolating #{inspect(list)}")
extrapolate(
list |> to_difference_list() |> Enum.reverse(),
[list |> List.last() | acc]
to_difference_list(list),
List.last(list) + acc
)
end
end
end

15
test/2023_day9_test.exs Normal file
View file

@ -0,0 +1,15 @@
defmodule Day9Tests do
use ExUnit.Case
@puzzle_input ~s"0 3 6 9 12 15
1 3 6 10 15 21
10 13 16 21 30 45"
assert "gets part 2 example input correct" do
assert Mix.Tasks.Day9.solve(@puzzle_input, :part2) === 2
end
assert "gets part 1 example input correct" do
assert Mix.Tasks.Day9.solve(@puzzle_input, :part1) === 114
end
end