Enumerable có một phương pháp thực sự tiện dụng gọi each_cons
mà làm việc như thế này:
[1,2,3,4].each_cons(2).to_a # => [ [1, 2], [2, 3], [3, 4] ]
Nghĩa là, nó mang lại mỗi bộ liên tiếp n yếu tố. Trong trường hợp của chúng tôi n là 2.
Tất nhiên, như tên của nó, nó sẽ trả về một Enumerator, vì vậy chúng tôi có thể chuỗi nó với các phương pháp khác như Enumerable 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
Phương pháp này có ưu điểm phía trên những người khác, bởi vì all?
ngắn mạch ngay sau khi khối trả về sai, nó sẽ chỉ kiểm tra số cho đến khi nó tìm thấy một cặp không đáp ứng các điều kiện (b == a + 1
). Tất nhiên, chỉ với bốn yếu tố, điều này không thực sự tạo ra sự khác biệt - trừ khi bạn đang gọi phương thức này hàng nghìn lần trong tình huống hiệu suất.
Nguồn
2015-10-06 15:37:07
nào bạn muốn '[4,6, 5,7] để vượt qua? – illusionist
Đơn giản nhất có thể ?: 'm.count == 4 && (m.size-1) .times.all? {| i | m [i + 1] == m [i] + 1} '. –
@illusionist, xem [Wiki này] (https://simple.wikipedia.org/wiki/Consecutive_integer) để biết định nghĩa các số nguyên liên tiếp. Vì vậy, '[4,6,5,7]' sẽ trả về 'false'. –