Files
advent_of_code/lib/year_2025/dial.ex
2025-12-13 15:42:22 -05:00

39 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