У вас есть ошибка в previous = letters.index(letter) - 1
, посмотрите, сможете ли вы ее обнаружить:
arr = [:a, :b, :c, :a]
previous_indexes = arr.map { |n| arr.index(n) - 1 }
you_are_expecting = [-1, 0, 1, 2]
previous_indexes == you_are_expecting
# => false
arr.index(:a) # => 0
arr.index(:b) # => 1
arr.index(:c) # => 2
arr.index(:a) # => 0
Чтобы получить индексы с итерацией, используйте with_index
:
arr = %i[a b c a]
arr.map.with_index { |x, i| [x, i] }
# => [[:a, 0], [:b, 1], [:c, 2], [:a, 3]]
Если вы сделаете это исправление, ваш код сделает то, что вы планировали.
Тем не менее, совет: часто можно избежать работы с деталями индексов массивов. Посмотрите, как работает @ Mori answer , работая на более высоком уровне.