2016-03-22 68 views
-6

我有一個數組,其元素是不同大小的陣列,說:總和不同大小的數組的

[[45, 96, 0.0, 96, 96, 96, 0.0], [04, 55, 06, 55, 04, 04, 02, 55]] 

我想找到兩個數組的總和,即

[49, 151, ...] 
+2

好;你是否試圖自己解決這個問題?如果是這樣,你究竟在哪裏卡住?總的來說,人們對「請爲我製作這些代碼」 - 請求(看起來像這樣)做出的反應不是很好,但是**做得很好**「我試過這個,現在我被卡住了,請幫助「 - 請求;-) – Carpetsmoker

+0

@Carpetsmoker:現在我知道了這件事。我不知道爲什麼其他人投下了一個問題? –

回答

7

您可以使用這樣的事情:

a.flat_map{|x| x.in_groups_of(a.max_by(&:size).size, 0)}.transpose.map(&:sum) 

或者這樣:

a.max_by(&:size).map.with_index{|_, i| a.sum{|x| x[i]||0}} 
+0

OP不希望兩個數組中的所有值的總和,而是兩個數組的「運行」總和。 – BoraMa

+0

你試過了嗎?雖然它更好,但它會錯過總和中的最後一個值(因爲第一個數組更短)。 – BoraMa

+0

這有效,儘管它比我的回答更難以理解。我刪除了downvote。 – BoraMa

2

不是很漂亮,但工程:

>> a = [[45, 96, 0.0, 96, 96, 96, 0.0], [04, 55, 06, 55, 04, 04, 02, 55]] 
=> [[45, 96, 0.0, 96, 96, 96, 0.0], [4, 55, 6, 55, 4, 4, 2, 55]] 

>> sorted_a = a.sort_by(&:size).reverse 
=> [[4, 55, 6, 55, 4, 4, 2, 55], [45, 96, 0.0, 96, 96, 96, 0.0]] 

>> zipped_a = sorted_a.first.zip(sorted_a.last) 
=> [[4, 45], [55, 96], [6, 0.0], [55, 96], [4, 96], [4, 96], [2, 0.0], [55, nil]] 

>> zipped_a.map{ |arr| arr.map{ |v| v || 0 } }.map(&:sum) 
=> [49, 151, 6.0, 151, 100, 100, 2.0, 55] 

首先,你必須開始爲最長至zip正常工作數組排序。然後,壓縮將在較短陣列的冗餘值中創建nil值。因此,下一步是將這些nil s替換爲零(使用嵌套的map),最後您可以使用sum的值。

1

你可以試試這個方法也

k =[] 
for i in 0..ar.max_by(&:size).length-1 do 
k << ar.map { |x| [x[i]] } 
end 

k.map(&:flatten).map{|a| a.compact.sum} 
=> [49, 151, 6.0, 151, 100, 100, 2.0, 55] 
0
a = [[45, 96, 0, 96, 96, 96, 0], 
    [ 4, 55, 6, 55, 4, 4, 2, 55]] 

Array.new(a.max_by(&:size).size) { |i| a.reduce(0) { |t,e| t+e[i].to_i } } 
    #=>[49, 151, 6, 151, 100, 100, 2, 55] 

注意nil.to_i #=> 0ref)。

又如:

a = [[1], [2,3,4], [5,6]] 

Array.new(a.max_by(&:size).size) { |i| a.reduce(0) { |t,e| t+e[i].to_i } } 
    #=> [8,9,4] 
相關問題