Ruby中的算术系列

时间:2014-07-21 01:28:33

标签: ruby series

我正在尝试在ruby中编写一个函数,当输入是一个算术系列数组时返回“算术”(数组中的数字和连续数字之间的差值在整个数组中是相同的)。这是我到目前为止所拥有的:

array = [1,3,5,7,9] #arithmetic series input example  
array.each_cons(2).map {|x,y| y - x == array[2] - array[1]} 

返回以下内容

[true,true,true,true,true]

我的目标是编写一个函数来识别数组是什么类型的系列,如果有的话。这就是我要构建的内容

def isarithemetic(array)
if array.each_cons(2).map {|x,y| y - x == array[2] - array[1]} == true
    return "arithmetic"

我也欢迎新的建议。

2 个答案:

答案 0 :(得分:0)

您应该可以使用all?

执行此操作
array.each_cons(2).map {|x,y| y - x == array[2] - array[1]}.all?

或者

array.each_cons(2).all? {|x,y| y - x == array[2] - array[1]}

答案 1 :(得分:0)

如果数组arr包含整数值,那些(有序)值最多包含一个算术表达式。如果平均间隔是整数值(即

  ((arr.last-arr.first) % (arr.size-1).zero?

是真的),arr.firstarr.lastarr.size的值给出了一个独特的进展,即:

  avg_interval = (arr.last-arr.first)/(arr.size-1)
  (arr.first..arr.last).step(avg_interval).to_a

如果平均间隔不是整数值,则它不能是算术级数,但我们不需要检查该条件。这是因为通过使用整数运算来计算avg_interval,如果平均间隔不是整数值,则得到的算术级数不能等于arr

因此,我们可以检查以上算术级数是否等于arr,而不是检查所有区间是否相等。

<强>代码

def arithmetic_progression?(arr)
  return true if arr.size < 2
  (arr.first..arr.last).step((arr.last-arr.first)/(arr.size-1)).to_a == arr
end

<强>实施例

arithmetic_progression?([1,3,5,7,9]) #=> true
arithmetic_progression?([1,3,5,7,8]) #=> false

在第一个例子中:

arr = [1,3,5,7,9]
avg_interval = (arr.last-arr.first)/(arr.size-1) #=> 2
(arr.first..arr.last).step(avg_interval).to_a    #=> [1, 3, 5, 7, 9]

在第二个:

arr = [1,3,5,7,8]
avg_interval = (arr.last-arr.first)/(arr.size-1) #=> 1
(arr.first..arr.last).step(avg_interval).to_a    #=> [1, 2, 3, 4, 5, 6, 7, 8]

然后你可以写,例如:

arithmetic_progression?([1,3,5,7,9]) ? "Arithmetic progression" :
  "Not arithmetic progression" #=> "Arithmetic progression"

<强>变体

通过在方法的第一行之后插入以下行,可能会使方法更有效:

return false unless ((arr.last-arr.first) % (arr.size-1)).zero?