Функциональный подход с использованием Enumerable # chunk :
ranges = [1, 2, 4, 5, 6, 7, 9, 13]
.enum_for(:chunk) # .chunk for Ruby >= 2.4
.with_index { |x, idx| x - idx }
.map { |_diff, group| [group.first, group.last] }
#=> [[1, 2], [4, 7], [9, 9], [13, 13]]
Как это работает: после индексации последовательные элементы в массиве имеют одинаковое x - idx
, поэтому мы используем это значение длячанк (группировка последовательных элементов) входного массива.Наконец, нам просто нужно взять первый и последний элементы каждой группы для построения пар.