array=[6, 2, 7, 1, 10, nil, 9, 0, 8, 2, 10, nil, 10, nil, 3, 5, 7, 2, 5, 5]
如果元素等于十,我想抓取数组中的下两个值并将它们添加到10,而不删除nil值。预期输出是:如果数组是整数,则在数组中添加值
[6, 2, 7, 1, 19, nil, 9, 0, 8, 2, 23, nil, 18, nil, 3, 5, 7, 2, 5, 5]
array=[6, 2, 7, 1, 10, nil, 9, 0, 8, 2, 10, nil, 10, nil, 3, 5, 7, 2, 5, 5]
如果元素等于十,我想抓取数组中的下两个值并将它们添加到10,而不删除nil值。预期输出是:如果数组是整数,则在数组中添加值
[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
例
arr = [6, 2, 7, 1, 10, nil, 9, 0, 8, 2, 10, nil, 10, nil, 3, 5, 7, 2, 5, 5]
change_da_10s(arr)
#=> [6, 2, 7, 1, 19, nil, 9, 0, 8, 2, 23, nil, 18, nil, 3, 5, 7, 2, 5, 5]
说明
Ť他的三个主要步骤如下。
保存nil
的索引。
nil_indices = arr.each_index.reject { |i| arr[i] }
#=> [5, 11, 13]
卸下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]
在返回值的差距仅仅是显示在nil
小号者。
该计算需要以下步骤。
arr = [6, 2, 7, 1, 10, nil, 9, 0, 8, 2, 10, nil, 10, nil, 3, 5, 7, 2, 5, 5]
b = arr.compact
#=> [6, 2, 7, 1, 10, 9, 0, 8, 2, 10, 10, 3, 5, 7, 2, 5, 5]
c = b.concat([0, 0])
#=> [6, 2, 7, 1, 10, 9, 0, 8, 2, 10, 10, 3, 5, 7, 2, 5, 5, 0, 0]
e = c.each_cons(3)
#=> #<Enumerator: [6, 2, 7, 1, 10, 9, 0, 8, 2, 10, 10, 3, 5, 7, 2, 5, 5, 0, 0]
# :each_cons(3)>
我们可以看到,将通过此枚举产生通过调用它Enumerable#entries(或Enumerable#to_a)的值。
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]
Enumerable#sum用Ruby V2.4首次亮相。对于早期版本,请使用Enumerable#reduce(又名inject
)。
将nil
拨回a
他们所属的地方。
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]
你为什么要添加两个零到最后? – olafsadventures
如果在最后一个位置有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'适用的原因。 –
整洁,非常有帮助。 – olafsadventures
如果10之后不存在两个非零值,那么期望什么? –
该方案没有考虑到等式中,因为我只是试图解决简单的代码挑战,并且无法找到解决方案。这个挑战并不超出我写的范围。 – olafsadventures
无论代码挑战是否回答了我的问题,您都需要(通过编辑),因为问题现在还没有完全明确,我认为这是downvote的原因。有人可能会假定数组中的最后两个元素中的每一个元素(如果是10)都不会被更改(因为两个非nils不能跟随)或者如果在倒数第二个位置中有一个10,并且最后一个值该数组不是零,后者应该被添加到10中。甚至可以有一个数组[10,10,零,....,零]。是否应该改变10?规则是什么并不重要,但必须有一个。 –