Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Day 7

2021/day_07.livemd

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)