Powered by AppSignal & Oban Pro

Advent of code day 01

2025/livebooks/day-01.livemd

Advent of code day 01

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

Setup input

example = Kino.Input.textarea("Please paste your input example:")
input = Kino.Input.textarea("Please paste your real input:")

Part 01

data =
  example
  |> Kino.Input.read()
  |> String.split()
  |> Enum.map(fn
    "L" <> number -> String.to_integer(number) * -1
    "R" <> number -> String.to_integer(number)
  end)

Enum.reduce(data, {50, 0}, fn el, {sum, resp} = _acc ->
  case rem(el + sum, 100) do
    0 -> {el + sum, resp + 1}
    _ -> {el + sum, resp}
  end
end)
|> then(fn {_, resp} -> resp end)

Part 02

Enum.reduce(data, {50, 0}, fn el, {pos, resp} ->
  new_pos = Integer.mod(el + pos, 100)

  crosses =
    if el > 0 do
      for s <- 1..el, rem(pos + s, 100) == 0, do: :hit
    else
      for s <- 1..-el, rem(pos - s, 100) == 0, do: :hit
    end
    |> length()

  {new_pos, resp + crosses}
end)
|> then(fn {_, resp} -> resp end)