Powered by AppSignal & Oban Pro

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

2021/day07.livemd

— Day 7: The Treachery of Whales —

Part1

Mix.install([{:nx, github: "elixir-nx/nx", sparse: "nx"}])
defmodule Setup do
  def get_input(prompt) do
    case IO.gets(prompt) do
      :eof -> ""
      line -> line <> get_input(prompt)
    end
  end
end

Part1

input =
  Setup.get_input("input")
  |> String.split(["\n", ","], trim: true)
  |> Enum.map(&String.to_integer/1)

min = Enum.min(input)
max = Enum.max(input)

tensor = Nx.tensor(input)

result =
  for x <- min..max do
    tensor
    |> Nx.subtract(x)
    |> Nx.abs()
    |> Nx.sum()
    |> Nx.to_number()
  end

Enum.min(result)

Part2

input =
  Setup.get_input("input")
  |> String.split(["\n", ","], trim: true)
  |> Enum.map(&String.to_integer/1)

defmodule Part2 do
  def go(input) do
    min = Enum.min(input)
    max = Enum.max(input)

    min..max
    |> Enum.map(fn x ->
      input
      |> Enum.map(&Enum.sum(0..abs(&1 - x)))
      |> Enum.sum()
    end)
    |> Enum.min()
  end
end

Part2.go(input)