Powered by AppSignal & Oban Pro

Day 1

2022/elixir/day1.livemd

Day 1

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

Section

input = Kino.Input.textarea("input")
top = Kino.Input.number("top")
input
|> Kino.Input.read()
|> String.split("\n")
|> Enum.chunk_by(&(&1 == ""))
|> Enum.reject(&(&1 == [""]))
|> Enum.map(fn list -> list |> Enum.map(&String.to_integer/1) |> Enum.sum() end)
|> Enum.sort(&>=/2)
|> Enum.take(top |> Kino.Input.read())
|> Enum.sum()
# Top 1
input
|> Kino.Input.read()
|> String.split("\n")
|> Enum.reduce(%{max: 0}, fn
  "", %{max: max, latest: latest} when latest > max -> %{max: latest, latest: 0}
  "", result -> %{result | latest: 0}
  number, result -> Map.update(result, :latest, 0, &(&1 + String.to_integer(number)))
end)
|> Map.get(:max)
# Top 3
input
|> Kino.Input.read()
|> String.split("\n")
|> Enum.reduce(%{total: 0, acc: []}, fn
  "", %{total: total, acc: acc} -> %{total: 0, acc: [total | acc]}
  number, result -> Map.update(result, :total, 0, &(&1 + String.to_integer(number)))
end)
|> Map.get(:acc)
|> Enum.sort(&>=/2)
|> Enum.take(3)
|> Enum.sum()