2017-08-09 31 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倍倍。快乐编码:)

相关问题