перечислимых имеет очень удобный метод, называемый each_cons
который работает следующим образом:
[1,2,3,4].each_cons(2).to_a # => [ [1, 2], [2, 3], [3, 4] ]
То есть, она дает каждый последующий набор п элементов. В нашем случае п равно 2.
Конечно, как следует из названия, она возвращает Enumerator, поэтому мы можем приковать его с другими методами перечислимых как all?
:
def four_consecutive?(arr)
return false unless arr.size == 4
arr.each_cons(2).all? {|a, b| b == a + 1 }
end
four_consecutive?([2,3,4,5]) # => true
four_consecutive?([2,2,2,5]) # => false
four_consecutive?([1,2,3,4,5]) # => false
Этот метод имеет то преимущество, выше, потому что all?
замыкается, как только блок возвращает false, он будет проверять только числа, пока не найдет пару, которая не соответствует условию (b == a + 1
). Конечно, только с четырьмя элементами это действительно не имеет значения - если вы не вызываете этот метод тысячи раз в ситуации, когда имеет значение производительность.
вы хотите '[4,6, 5,7] 'пройти? – illusionist
Простейший возможный ?: 'm.count == 4 && (m.size-1). {| i | m [i + 1] == m [i] + 1} '. –
@illusionist, см. [This Wiki] (https://simple.wikipedia.org/wiki/Consecutive_integer) для определения последовательных целых чисел. Поэтому '[4,6,5,7]' должен возвращать 'false'. –