Нарезка массивов на основе отношений в данных (в Ruby)

У меня есть массивы в этой форме: [1, 2, 1, 4, 5, 4, 1, 7, 7, 6] и мне нужно нарезать их на что-то вроде [[1, 2, 1], [4, 5, 4], [1], [7, 7, 6]]где разрывы определяются абсолютной разницей между последовательными парами, превышающей 1.

Есть ли в Ruby какая-то магия, которую я могу использовать, или мне осталось написать простую итерацию?

2 ответа

Решение

Ты можешь использовать Enumerable#slice_when:

a = [1, 2, 1, 4, 5, 4, 1, 7, 7, 6]
a.slice_when { |i, j| (i - j).abs > 1 }.to_a
#=> [[1, 2, 1], [4, 5, 4], [1], [7, 7, 6]]

Следующее будет работать с Ruby v1.9+:

arr = [1, 2, 1, 4, 5, 4, 1, 7, 7, 6]

arr[1..-1].each_with_object([[arr.first]]) do |e,a|
  ((a.last.last-e).abs > 1) ? a << [e] : a[-1] << e
end
  #=> [[1, 2, 1], [4, 5, 4], [1], [7, 7, 6]] 

Если вам нужно поддерживать более ранние версии, вы можете использовать reduce скорее, чем each_with_object,

Другие вопросы по тегам