2017-08-09 52 views
-2

我想返回true如果輸入(n)包含3行中的重複,否則返回false。如何檢查數組是否包含3個連續的重複項?

我的代碼:

def got_three?(n) 
    n.each_cons(3) { |a, b, c| a == b && b == c ? true : false } 
end 

此函數返回一個錯誤,我不能確定,爲什麼。任何幫助?

+0

_「這是返回一個錯誤」_ - 顯示它,請。 – Stefan

+0

「這是返回一個錯誤」不是一個足夠精確的錯誤描述,我們可以幫助你。 *什麼*不起作用? *如何*不起作用?你的代碼有什麼問題?你有錯誤信息嗎?什麼是錯誤信息?你得到的結果不是你期待的結果嗎?你期望得到什麼結果?爲什麼?你得到了什麼結果?兩者有什麼不同?你正在觀察的行爲不是所期望的行爲?什麼是期望的行爲,爲什麼,觀察到的行爲是什麼,以及它們以何種方式不同? –

+0

你能提供一個你想要發生什麼的*精確*規範,包括任何和所有規則,這些規則中的例外,角落案例,特殊情況,邊界案例和邊緣案例?您是否可以提供示例輸入和輸出,以顯示您在正常情況下以及所有例外情況,角落情況,特殊情況,邊界情況和邊緣情況下預期會發生的情況?例如:如果數組爲空,應該返回什麼?如果少於3個元素會怎麼樣?如果'n'不是一個數組而是一個無限流? –

回答

4

試試這個

n.each_cons(3).any? { |a, b, c| a == b && b == c } 
+1

[示範](https://repl.it/KCwp/1) – potashin

+0

謝謝,工作!我認爲.any?只是檢查是否有任何,然後如果不返回零? – LewMoore

+0

如果一個塊爲真,則結果爲真,否則爲假 – Ursus

0

無需鏈的方法,只要使用Enumerable#each_cons與塊:

array.each_cons(3) { |f, s, t| break true if f == t && s == t} 

返回true如果數組包含在一排3次的重複,否則nil(簡單如果您確切需要truefalse,請使用!!)。

基準:

require 'benchmark' 

array = (0..1000).to_a.push(*[3, 3, 3]) 

Benchmark.bmbm(20) do |x| 
    x.report(:chain) do 
    array.each_cons(3).any? { |a, b, c| a == b && b == c } 
    end 

    x.report(:one_block) do 
    array.each_cons(3) { |f, s, t| break true if f == t && s == t} 
    end 
end 

結果:

      user  system  total  real 
chain     0.000000 0.000000 0.000000 ( 0.000167) 
one_block    0.000000 0.000000 0.000000 ( 0.000101) 

正如你所看到的,這個解決方案是快了1.6倍倍。快樂編碼:)

相關問題