Powered by AppSignal & Oban Pro

--- Day 7: The Treachery of Whales ---

2021/elixir/day-07/day-07.livemd

— Day 7: The Treachery of Whales —

Mix.install([{:kino, "~> 0.9.4"}])

Part1

https://adventofcode.com/2021/day/7

input = Kino.Input.textarea("test input")
input =
  Kino.Input.read(input)
  |> String.split(",", trim: true)
  |> Enum.map(&String.to_integer/1)
input2 = Kino.Input.textarea("real input")
input2 =
  Kino.Input.read(input2)
  |> String.split(",", trim: true)
  |> Enum.map(&String.to_integer/1)
{min, max} = {Enum.min(input2), Enum.max(input2)}

min..max
|> Enum.reduce({nil, nil}, fn crd, acc ->
  # IO.inspect(crd)
  # IO.inspect(acc)
  cost =
    input2
    |> Enum.map(&abs(&1 - crd))
    # |> Enum.map(fn x -> 
    #   abs(x - crd) 
    # end)
    # |> IO.inspect()
    |> Enum.sum()

  # |> IO.inspect()

  # potential bug
  if elem(acc, 1) > cost,
    do: {crd, cost},
    else: acc
end)
{min, max} = {Enum.min(input), Enum.max(input)}

defmodule Crabs do
  # hello, factorial!
  # 1 -> 1
  # 2 -> 1 + 2 = 3
  # 3 -> 1 + 2 + 3 = 6
  # 4 -> 3! + 4 = 10
  def calc_fuel_cost(steps \\ 0, sum \\ 0)
  def calc_fuel_cost(0, sum), do: sum
  def calc_fuel_cost(steps, sum), do: calc_fuel_cost(steps - 1, sum + steps)
end

min..max
|> Enum.reduce({nil, nil}, fn crd, acc ->
  cost =
    input
    |> Enum.map(&(abs(&1 - crd) |> Crabs.calc_fuel_cost()))
    |> Enum.sum()

  if elem(acc, 1) > cost,
    do: {crd, cost},
    else: acc
end)