Powered by AppSignal & Oban Pro

Day 01

2025/day01.livemd

Day 01

Mix.install([:kino_aoc])

Setup

{:ok, puzzle_input} =
  KinoAOC.download_puzzle("2025", "1", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
instructions =
  puzzle_input
  |> String.split("\n", trim: true)
  |> Enum.map(fn <> <> rest ->
    num = String.to_integer(rest)

    if dir == ?R do
      {div(num, 100), rem(num, 100)}
    else
      {div(num, 100), -rem(num, 100)}
    end
  end)

Part 1

Enum.scan(instructions, 50, fn {_rot, val}, curr ->
  Integer.mod(curr + val, 100)
end)
|> Enum.count(&amp; &amp;1 == 0)

Part 2

<<0x434C49434B::40>>
Enum.reduce(instructions, {50, 0}, fn {rot, val}, {curr, sum} ->
  next = curr + val

  pass =
    cond do
      curr == 0 and next < 0 -> 0
      next not in 0..99 -> 1
      rem(next, 100) == 0 -> 1
      true -> 0
    end

  {Integer.mod(next, 100), sum + pass + rot}
end)
|> elem(1)