Powered by AppSignal & Oban Pro

aoc2021 day 7

2021/elixir/day-7.livemd

aoc2021 day 7

Setup

Mix.install([{:kino, "~> 0.4.1"}])
input = Kino.Input.textarea("")

Part 1

numbers =
  input
  |> Kino.Input.read()
  |> String.split(",", trim: true)
  |> Enum.map(&String.to_integer/1)
  |> Enum.sort()

{min, max} = Enum.min_max(numbers)

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

간단 풀이: 중위값 (median) 이 답임

Part2

numbers =
  input
  |> Kino.Input.read()
  |> String.split(",", trim: true)
  |> Enum.map(&String.to_integer/1)
  |> Enum.sort()

min = Enum.min(numbers)
max = Enum.max(numbers)

ssum = fn n ->
  div(n * (n + 1), 2)
end

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

간단 풀이: 평균값 (mean)이 답임

???

Kino.animate(300, true, fn
  true ->
    spaces = String.duplicate(" ", Enum.random(0..8))

    {:cont,
     Kino.Markdown.new(~s"""
     ```
     #{spaces}(||) (^,,,,°) (\\/)
     ```
     """), false}

  false ->
    spaces = String.duplicate(" ", Enum.random(0..8))

    {:cont,
     Kino.Markdown.new(~s"""
     ```
     #{spaces}(\\/) (°,,,,^) (||)
     ```
     """), true}
end)