2016-11-22 7 views
2

Rubyで配列要素を合計するための新しい配列を作成するにはどうすればよいですか?どのようにして配列要素をルビの場所に集めることができますか?

[1,2,3,4,5].each_cons(2).map {|a, b| a + b } 

は私に[3, 5, 7, 9]を与えるが、期待される結果は[1,3,6,10,15]です。

+0

⇑ようこそ、PHPのmapを使用し、代わりに既存のものの新しい配列を作成したい場合は! – mudasobwa

+0

はい、ちょうど古い学校の解決.. :) –

+0

@ MuratUstuntas "場所"とはどういう意味ですか? – Stefan

答えて

1
[1, 2, 3, 4, 5].each_with_object([]){|e, a| a.push(a.last.to_i + e)} 
# => [1, 3, 6, 10, 15] 
+0

本当にありがとうございました:)本当に速い答え.. –

+0

'to_i'は、例えば文字列に失敗します。 – mudasobwa

+3

'#to_i'は' nil.to_i'が '0'を返すという慣習では確かです。数字だけを目指す。 –

0

それは非常にエレガントではないのですが、動作しているようです。これを行う方法の

[1,2,3,4,5].each_with_object([]){|i,l| l<<(l.last||0)+i} 
#=> [1,3,6,10,15] 
+0

@MuratUstuntasこれは非常識です(これは勝者ではありません。ベンチマークを再検討してください)。適切なソリューションを選択する際には、ナノ秒の半分の差は問題になりません。 – mudasobwa

+0

私は@ mudasobwaに同意します:あなたのベンチマークは、基本的に ' の実装間に大きな統計的な違いはありません。したがって、コードの読みやすさと使い慣れた方法に精通しているかどうかだけで選択してください。 –

+0

はい、あなたは正しいです。私はちょうど言葉を言う。私が間違いを犯したら、許してください。 :) –

2

たくさん。一つの方法は、Enumeratorインスタンスを作成し、injectを使用することです:

def adder array 
    enum = Enumerator.new do |y| 
    array.inject (0) do |sum, n| 
     y << sum + n 
     sum + n 
    end 
    end 
    enum.take array.size 
end 

adder [1,2,3,4,5] #=> [1, 3, 6, 10, 15] 
+1

'(合計+ n)。タップ&y.method(:<<)' – mudasobwa

+0

@ mudasobwa、はいこれは素晴らしいアイデアです。 –

1

別のバリエーション:

> [1, 2, 3, 4, 5].reduce([]) {|acc, el| acc << el + (acc[-1] || 0); acc} 
#=> [1, 3, 6, 10, 15] 

ユク。

+1

inject/reduceを使用してブロック内の2番目のステートメントでオブジェクトを返さなければならない場合は、おそらくeach_with_objectを使用することができます。 –

8
理解するため

もっとシンプルな、私は思う:

temp_sum = 0 
arr.map! {|e| temp_sum += e } 
=> [1, 3, 6, 10, 15] 

あなただけの代わりにmap!

+1

これまでのところ、最初の答えは質問の「場所」の部分に答えています。これにはN個の合計を生成するという欠点がありますが、 '.with_object(temporary_sum) 'で修正することができます。 – mudasobwa

+0

@mudasobwa、固定:) – Ilya

+1

偉大な答え。 .... – sawa

関連する問題