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

Day 7

live/day7.livemd

Day 7

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

Input

input = Kino.Input.textarea("Where da' crabs at: ")
list =
  Kino.Input.read(input)
  |> String.trim()
  |> String.split(",", trim: true)
  |> Enum.map(&String.to_integer/1)

Part 1

defmodule Crab do
  def shift(list, dest) do
    Enum.map(list, fn x ->
      abs(x - dest)
    end)
  end

  def find_optimum(list, dest) do
    prev = shift(list, dest - 1) |> Enum.sum()
    cur = shift(list, dest) |> Enum.sum()
    next = shift(list, dest + 1) |> Enum.sum()

    if cur <= prev and cur <= next do
      {dest, cur}
    else
      if(next < prev, do: find_optimum(list, dest + 1), else: find_optimum(list, dest - 1))
    end
  end
end
Crab.find_optimum(list, Integer.floor_div(Enum.sum(list), length(list)))

Part 2

defmodule Crab do
  def shift(list, dest) do
    Enum.map(list, fn x ->
      d = abs(x - dest)
      Integer.floor_div(d * (d + 1), 2)
    end)
  end

  def find_optimum(list, dest) do
    prev = shift(list, dest - 1) |> Enum.sum()
    cur = shift(list, dest) |> Enum.sum()
    next = shift(list, dest + 1) |> Enum.sum()

    if cur <= prev and cur <= next do
      {dest, cur}
    else
      if(next < prev, do: find_optimum(list, dest + 1), else: find_optimum(list, dest - 1))
    end
  end
end
Crab.find_optimum(list, Integer.floor_div(Enum.sum(list), length(list)))