在1.9.2中,一个神秘的切片之前方法已添加到 Enumerable 中。您可以利用它:
def find_sequences_desc(a)
prev = a[0]
a.slice_before { |cur|
prev, prev2 = cur, prev # one step further
prev2 - 1 != prev # two ago != one ago ? --> new slice
}.to_a
end
# find_sequences_desc [9,8,7,4,4] #=> [[9, 8, 7], [4], [4]]
# find_sequences_desc [9,8,7,5,4] #=> [[9, 8, 7], [5, 4]]
def find_sequences_asc(a)
prev = a[0]
a.slice_before { |cur|
prev, prev2 = cur, prev # one step further
prev2 + 1 != prev # two ago != one ago ? --> new slice
}.to_a
end
# find_sequences_asc [1,2,4,5,7] #=> [[1, 2], [4,5], [7]]
# find_sequences_asc [1,2,3,5,6] #=> [[1, 2, 3], [5, 6]]
您可以获得所需的语义
def find_longest_sequence(a)
s = find_sequences_desc(a).max
s unless s.size <= 1
end
Update
Ruby 2.2 添加了切片时间方法,大大简化了代码:
def find_sequences_desc(a)
a.slice_when { |prev, cur|
cur != prev - 1
}.to_a
end
# find_sequences_desc [9,8,7,4,4] #=> [[9, 8, 7], [4], [4]]
# find_sequences_desc [9,8,7,5,4] #=> [[9, 8, 7], [5, 4]]