Ruby 如何在数组中查找总和为10的元素

Ruby 如何在数组中查找总和为10的元素,ruby,Ruby,我试图打印数组中的元素,这些元素的总和为10,但出现以下错误: 8 : 25 : 55 : 5TypeError: nil can't be coerced into Fixnum 这是我的代码: array = [6, 2, 7, 1, 10, 9, 0, 8, 2, 10, 10, 3, 5, 7, 2, 5, 5, 5] def print(array) array.each_with_index.inject(0) do |m,(roll,i)| if array[i

我试图打印数组中的元素,这些元素的总和为10,但出现以下错误:

 8 : 25 : 55 : 5TypeError: nil can't be coerced into Fixnum 
这是我的代码:

array =  [6, 2, 7, 1, 10, 9, 0, 8, 2, 10, 10, 3, 5, 7, 2, 5, 5, 5]
def print(array)
  array.each_with_index.inject(0) do |m,(roll,i)|
    if array[i] + array[i+1] == 10 
      print "#{array[i]} : #{array[i+1]}"
    end
  end
end
我期望的输出是:

8:2,5:5
我怎样才能解决这个问题

array =  [6, 2, 7, 1, 10, 9, 0, 8, 2, 10, 10, 3, 5, 7, 2, 5, 5, 5]

array.flat_map { |n| n == 10 ? [10, 0] : n }.
      each_slice(2).
      select { |ball1,ball2| ball1 != 10 && ball1+ball2.to_i == 10 }
  #=> [[8, 2], [5, 5]] 
步骤如下。首先,在保龄球中,使用在每10后插入一个零,一次击球:

这使我们可以使用将数组分成几对:

e = a.each_slice(2)
  #=> #<Enumerator: [6, 2, 7, 1, 10, 0, 9, 0, 8, 2, 10, 0, 10, 0, 3, 5, 7, 2, 5, 5, 5]
  #   :each_slice(2)> 
请注意末尾的数组大小为1[5]。继续

e.select { |ball1,ball2| ball1 != 10 && ball1+ball2.to_i == 10 }
  #=> [[8, 2], [5, 5]] 
生成e[5]的最后一个元素时,select的块变量计算如下:

ball1, ball2 = [5]
  #=> [5] 
ball1
  #=> 5 
ball2
  #=> nil 
如果上面的块包含&&ball1+ball2==10,则会引发异常,除非包含数组的最后一个元素是示例公式中的错误。这本可以用if Ball 2.nil来处理的。。。语句,但我选择将ball2转换为整数。如果已经是整数,则返回该值;它等于,等于。请参阅。

为此使用inject是一种奇怪的方法。按照您编写它的方式,一个nil作为聚合器返回,这就是为什么您没有得到期望的结果。将其移除,逻辑更清晰:

array =  [6, 2, 7, 1, 10, 9, 0, 8, 2, 10, 10, 3, 5, 7, 2, 5, 5, 5]
def print(array)
  pairs = []
  array.each_with_index do |val, idx|
    next if idx == 0
    prev_val = array[idx - 1]
    curr_total = val + prev_val
    if curr_total == 10
      pairs << [prev_val, val]
    end
  end

  pairs.map { |pair| pair.join(':') }.join(',')
end

解决这个问题的第一步是问一个至少有一个人能理解的问题……我把两个改成了十个。这样更好吗,@AndreyDeineko?是的,ruby在数组中的最后一个数字之后还需要另一个数字,因此出现了nil错误。为什么在完全忽略m的情况下使用inject?所需的输出与问题中的问题描述不符。我希望输出是0:1:2:2:3,0:1:2:5,0:1:2:7,0:1:3:6,0:1:9,0:2:2:6,0:2:3:5,0:2:8,0:3:7,0:5:5,0:10,1:2:2:3,1:2:7,1:2:6,1:10,2:2:6,2:8,3:7,5,我已经意识到了我所说的错误。我不应该在我又累又饿的时候写它。非常感谢。如果将数组中的9更改为0,printarray=>10:0,8:2,5:5,5:5,但OP在评论中明确指出,它是需要识别的保龄球备用项。也就是说,10:0不应该打印出来。这在我提交答案时的问题中并不清楚。事实上,这在评论中几乎不清楚。保龄球的话题隐藏在一条评论中。我不得不去挖。我的解决方案回答了前面提到的问题。如果OP用保龄球的特定要求更新了问题,我会更新答案,并解释边缘情况,其中包括0:10,因为一个排水沟球在同一帧中接着一击实际上是多余的。
ball1, ball2 = [5]
  #=> [5] 
ball1
  #=> 5 
ball2
  #=> nil 
array =  [6, 2, 7, 1, 10, 9, 0, 8, 2, 10, 10, 3, 5, 7, 2, 5, 5, 5]
def print(array)
  pairs = []
  array.each_with_index do |val, idx|
    next if idx == 0
    prev_val = array[idx - 1]
    curr_total = val + prev_val
    if curr_total == 10
      pairs << [prev_val, val]
    end
  end

  pairs.map { |pair| pair.join(':') }.join(',')
end