算术数列Ruby

Arithmetic sequence Ruby

这是一个代码,用于查找等差数列的缺失序列并找到公差,并检查它是递增序列还是递减序列。获取用户输入以进行进一步操作

例如:输入数组元素

2 4 6 10 12 14

缺少的数字是 8 而不是

输入数组元素

2

4

6

10

12

14

缺少的数字是 8

    puts "enter arithmetic sequence"
    o = Array.new
    x = gets.chomp
    item = x.split(" ")
    o.push(item)
    puts "#{o}"
    len = o.length
    sum = (len + 1) * (o[0] + o[len - 1]) / 2
    summ = 0
    o.each { |a| summ+=a }
    res = sum - summ
    if(o[1]>o[0])
      puts "its an increasing sequence"
    else
      puts "its a decreasing sequence"
    end
    common_difference = o[1] - o[0]
    puts "Common difference is #{common_difference}"
    puts "missing number is #{res}"

公差求和之类的操作有效,但要求是我们需要在单行中获取用户输入,而不是在多行中获取用户输入,将其拆分并存储在数组中。 为了求和,我使用了实际总和 - 目标总和方法。

Main issue is that it rise an error

`*': Array can't be coerced into Integer

如何使用to_i方法或Integer方法将字符串格式的数组元素转换为int

Expected Output


i/p 2 4 6 8 12 14


o/p


missing number 10

试试这个:

def missing_number(arr)
  ((arr.size + 1) * (arr.first + arr.last))/2 - arr.sum
end
missing_number [2, 4, 6, 10, 12, 14]      #=> 8
missing_number [11, 8, 5, 2, -4, -7]      #=> -1
missing_number [1.2, 2.0, 2.4, 2.8, 3.2]  #=> 1.6000000000000014

假设 arr 没有遗漏任何值。例如,

arr = [2, 4, 6, 8, 10, 12, 14]

然后:

arr.sum
  #=> 56

因为它是等差级数,我们也可以计算如下:

(arr.size * (arr.first + arr.last))/2
  #=> 56

事实上,

arr = [2, 4, 6, 10, 12, 14]

arr.sum
  #=> 48

正如我上面所解释的,我们可以在插入缺失值后计算 arr 的值之和,如下所示:

((arr.size + 1) * (arr.first + arr.last))/2
  #=> 56

因此缺失值等于 56 - 48 #=> 8


这是另一种查找缺失值的方法,效率稍低。

def missing_number(arr)
  arr.each_cons(2).max_by { |a,b| (b-a).abs }.sum/2
end
missing_number [2, 4, 6, 10, 12, 14]     #=> 8
missing_number [11, 8, 5, 2, -4, -7]     #=> -1
missing_number [1.2, 2.0, 2.4, 2.8, 3.2] #=> 1.6

假设

arr = [11, 8, 5, 2, -4, -7]

步骤如下

enum = arr.each_cons(2)
  #=> #<Enumerator: [11, 8, 5, 2, -4, -7]:each_cons(2)>

通过将枚举转换为数组,我们可以看到枚举器将生成​​并传递给 Enumerable#max_by 的 (5) 个值:

enum.to_a
  #=> [[11, 8], [8, 5], [5, 2], [2, -4], [-4, -7]]

接下来让我们看看max_by将比较的值:

enum.map { |a,b| (b-a).abs }
  #=> [3, 3, 3, 6, 3]

因此我们得到以下信息:

c = enum.max_by { |a,b| (b-a).abs }
  #=> [2, -4]

最后两步计算2和-4的平均值:

d = c.sum
  #=> -2
d/2
  #=> -1

requirement is that we need to take user input in a single line instead of taking in multiple line, split that and store in an array

gets.chomp returns 删除了尾随换行符的字符串,例如(第二行是用户输入)

x = gets.chomp
2 4 6 8 12 14

x #=> "2 4 6 8 12 14"

split 将该字符串转换为数组:

x.split
#=> ["2", "4", "6", "8", "12", "14"]

缺少的是整数转换。要转换数组的每个元素,有 map:

x.split.map { |s| s.to_i }
#=> => [2, 4, 6, 8, 12, 14]

或其简写形式:

x.split.map(&:to_i)
#=> => [2, 4, 6, 8, 12, 14]

应用于您的代码:

puts "enter arithmetic sequence"

x = gets.chomp
o = x.split.map(&:to_i)

puts "#{o}"
# ...

请注意,无需创建空数组。您可以将 map 的结果分配给 o.

您的其余代码似乎按预期工作。但是您应该查看 以获取更简洁的查找缺失元素的方法。