42 lines
1.1 KiB
Elixir
42 lines
1.1 KiB
Elixir
defmodule AdventOfCode.Year2025.Dial do
|
|
# Initial conditions
|
|
def rotate(operations), do: rotate(50, operations, 0)
|
|
|
|
# When no operations remain, return the number of zeroes
|
|
def rotate(index, [], zeroes), do: {index, zeroes}
|
|
|
|
# Compute the new dial position
|
|
def rotate(index, [head | tail], zeroes) do
|
|
{new_index, _crosses} =
|
|
case head do
|
|
"R" <> number -> rotate_right(index, String.to_integer(number))
|
|
"L" <> number -> rotate_left(index, String.to_integer(number))
|
|
end
|
|
|
|
case new_index do
|
|
0 -> rotate(new_index, tail, zeroes + 1)
|
|
_ -> rotate(new_index, tail, zeroes)
|
|
end
|
|
end
|
|
|
|
defp rotate_right(index, number) do
|
|
crosses = div(number, 100)
|
|
diff = index + rem(number, 100)
|
|
|
|
case diff do
|
|
diff when diff <= 99 -> {diff, crosses}
|
|
diff when diff > 99 -> {diff - 100, crosses + 1}
|
|
end
|
|
end
|
|
|
|
defp rotate_left(index, number) do
|
|
crosses = div(number, 100)
|
|
diff = index - rem(number, 100)
|
|
|
|
case diff do
|
|
diff when diff >= 0 -> {diff, crosses}
|
|
diff when diff < 0 -> {diff + 100, crosses + 1}
|
|
end
|
|
end
|
|
end
|