Day 7
Input
Mix.install([{:kino, github: "livebook-dev/kino"}])
textarea = Kino.Input.textarea("Input:")
Common
defmodule Common do
def parse_input(raw_input) do
raw_input
|> String.split(",", trim: true)
|> Enum.map(&String.to_integer(String.trim(&1)))
|> Enum.sort()
end
def minimal_fuel_cost(input, cost_fun) do
position_min = List.first(input)
position_max = List.last(input)
Enum.map(position_min..position_max, fn destination ->
Enum.reduce(input, 0, fn position, sum ->
distance = abs(destination - position)
fuel_cost = cost_fun.(distance)
sum + fuel_cost
end)
end)
|> Enum.min()
end
end
raw_input = Kino.Input.read(textarea)
input = Common.parse_input(raw_input)
Part 1
defmodule Part1 do
def run(input) do
Common.minimal_fuel_cost(input, & &1)
end
end
Part1.run(input)
Part 2
defmodule Part2 do
def run(input) do
Common.minimal_fuel_cost(input, &div(&1 * (&1 + 1), 2))
end
end
Part2.run(input)