Powered by AppSignal & Oban Pro

aoc 2019 day 1

2019/elixir/day-1.livemd

aoc 2019 day 1

Setup

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

Part 1

input
|> Kino.Input.read()
|> String.split("\n", trim: true)
|> Enum.map(&String.to_integer/1)
|> Enum.map(&(div(&1, 3) - 2))
|> Enum.sum()

Part 2

input
|> Kino.Input.read()
|> String.split("\n", trim: true)
|> Enum.map(&String.to_integer/1)
|> Enum.map(fn mass ->
  Stream.iterate(1, & &1)
  |> Enum.reduce_while({mass, 0}, fn
    _, {remain, fuel} when remain <= 6 ->
      {:halt, fuel}

    _, {remain, fuel} ->
      remain = div(remain, 3) - 2
      {:cont, {remain, fuel + remain}}
  end)
end)
|> Enum.sum()