Advent of Code 2025 - Day 1

Part 2 was PITA, but managed:

instructions =
  puzzle_input
  |> String.split("\n", trim: true)
  |> Enum.map(fn
    <<dir>> <> 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.reduce(instructions, {50, 0}, fn {_rot, val}, {curr, sum} ->
  next = Integer.mod(curr + val, 100)

  {next, sum + if(next == 0, do: 1, else: 0)}
end)
|> elem(1)

## Part 2

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)