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?規則是什麼並不重要,但必須有一個。 –