减少数字数组(序列)

时间:2013-06-04 07:08:03

标签: ruby arrays range sequence

想象一下,将一组数字定义为:a = [18, 20, 21, 22, 23]。我想修改它,使它看起来像这样:a = [18, (20..23)]。那个最优雅的解决方案是什么?

2 个答案:

答案 0 :(得分:1)

以下是从doc: Enumerable#slice_before最低限度修改的代码。

i = a[0]
a.slice_before do |e|
  i, j = e, i
  j + 1 != e
end
.flat_map{|es| es.length < 3 ? es : es.first..es.last}
# => [18, 20..23]

答案 1 :(得分:1)

a = [18, 20, 21, 22, 23,13,14].sort!
prev = a[0]
p a.slice_before { |e|
  prev, prev2 = e, prev
  prev2 + 1 != e
}.flat_map{|i| next Range.new(i.first,i.last) if i.size !=1 ; i}
#=> [13..14, 18, 20..23]