Ruby 如果数组是整数,则在数组中添加值

Ruby 如果数组是整数,则在数组中添加值,ruby,Ruby,如果一个元素等于十,我想获取数组中接下来的两个值,并将它们添加到十,而不删除nil值。预期产出为: array=[6, 2, 7, 1, 10, nil, 9, 0, 8, 2, 10, nil, 10, nil, 3, 5, 7, 2, 5, 5] 代码 [6, 2, 7, 1, 19, nil, 9, 0, 8, 2, 23, nil, 18, nil, 3, 5, 7, 2, 5, 5] def change_da_10s(arr) nil_indices = arr.each_i

如果一个元素等于十,我想获取数组中接下来的两个值,并将它们添加到十,而不删除nil值。预期产出为:

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

[6, 2, 7, 1, 19, nil, 9, 0, 8, 2, 23, nil, 18, nil, 3, 5, 7, 2, 5, 5]
def change_da_10s(arr)
  nil_indices = arr.each_index.reject { |i| arr[i] }
  arr.compact.concat([0, 0]).
      each_cons(3).
      map { |v| v.first == 10 ? v.sum : v.first }.
      tap { |aa| nil_indices.each { |i| aa.insert(i, nil) } }
end
示例

[6, 2, 7, 1, 19, nil, 9, 0, 8, 2, 23, nil, 18, nil, 3, 5, 7, 2, 5, 5]
def change_da_10s(arr)
  nil_indices = arr.each_index.reject { |i| arr[i] }
  arr.compact.concat([0, 0]).
      each_cons(3).
      map { |v| v.first == 10 ? v.sum : v.first }.
      tap { |aa| nil_indices.each { |i| aa.insert(i, nil) } }
end
解释

以下是三个主要步骤

保存
nil
s的索引

删除
nil
s,在末尾添加两个零,然后将每个三元组映射到正确的值

返回值中的间隙仅用于显示
nil
s的位置

此计算需要以下步骤

a = arr.compact.
        concat([0, 0]).
        each_cons(3).
        map { |v| v.first == 10 ? v.sum : v.first }
  #=> [6, 2, 7, 1, 19,      9, 0, 8, 2, 23,      18,      3, 5, 7, 2, 5, 5] 
最后,

e.entries
  #=> [[6, 2, 7], [2, 7,  1], [7,  1, 10], [ 1, 10, 9], [10, 9, 0], [9, 0, 8],
  #    [0, 8, 2], [8, 2, 10], [2, 10, 10], [10, 10, 3], [10, 3, 5], [3, 5, 7],
  #    [5, 7, 2], [7, 2,  5], [2,  5,  5], [ 5,  5, 0], [5, 0, 0]] 
在Ruby v2.4中首次亮相。对于早期版本,请使用(aka
inject

nil
s推回它们所属的
a


如果在10之后没有两个非nil值,那么需要什么呢?这个场景没有被考虑到等式中,因为我只是试图解决一个简单的代码挑战,并且很难找到解决方案。这个挑战并没有超出我写的范围。不管代码挑战是否回答了我的问题,你都需要(通过编辑),因为这个问题现在还没有完全指定,我希望这是否决票的原因。如果10不改变(因为后面不能跟两个非零),则可以假定数组的最后两个元素中的每一个元素,或者,如果在最后一个位置的下一个位置有一个10,并且数组的最后一个值是非零,则应将后者添加到10中。甚至可以有一个数组
[10,10,nil,…,nil]
。是否应该更改其中一个10?规则是什么并不重要,但必须有一个。啊,好的。这是一场保龄球挑战赛。我没有想到任何边缘案例。我给出的阵型是教练提供的阵型。这还是个新问题。你为什么要在末尾加两个零?如果最后一个位置有一个10,那么它大概会保持10。通过添加两个零,我不必将其视为特殊情况。我只需计算
10+0+0
。类似地,如果数组结束
[10,3]
,我可以使用
[10,3,0,0]
来计算
10+3+0
。如果数组结束
[10,nil]
,我可以使用
[10,0,0]
(删除
nil
s后)来计算
10+0+0
。请注意,三元组的数量等于删除
nil
s后数组的大小,这就是
map
适用的原因。整洁,非常有用。
e.entries
  #=> [[6, 2, 7], [2, 7,  1], [7,  1, 10], [ 1, 10, 9], [10, 9, 0], [9, 0, 8],
  #    [0, 8, 2], [8, 2, 10], [2, 10, 10], [10, 10, 3], [10, 3, 5], [3, 5, 7],
  #    [5, 7, 2], [7, 2,  5], [2,  5,  5], [ 5,  5, 0], [5, 0, 0]] 
e.map { |v| v.first == 10 ? v.sum : v.first }
  #=> [6, 2, 7, 1, 19, 9, 0, 8, 2, 23, 18, 3, 5, 7, 2, 5, 5] 
a.tap { |aa| nil_indices.each { |i| aa.insert(i, nil) } }
  #=> [6, 2, 7, 1, 19, nil, 9, 0, 8, 2, 23, nil, 18, nil, 3, 5, 7, 2, 5, 5]