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)






















