我正在尝试在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"
我也欢迎新的建议。
答案 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.first
,arr.last
和arr.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?