Rubyで配列要素を合計するための新しい配列を作成するにはどうすればよいですか?どのようにして配列要素をルビの場所に集めることができますか?
[1,2,3,4,5].each_cons(2).map {|a, b| a + b }
は私に[3, 5, 7, 9]
を与えるが、期待される結果は[1,3,6,10,15]
です。
Rubyで配列要素を合計するための新しい配列を作成するにはどうすればよいですか?どのようにして配列要素をルビの場所に集めることができますか?
[1,2,3,4,5].each_cons(2).map {|a, b| a + b }
は私に[3, 5, 7, 9]
を与えるが、期待される結果は[1,3,6,10,15]
です。
[1, 2, 3, 4, 5].each_with_object([]){|e, a| a.push(a.last.to_i + e)}
# => [1, 3, 6, 10, 15]
本当にありがとうございました:)本当に速い答え.. –
'to_i'は、例えば文字列に失敗します。 – mudasobwa
'#to_i'は' nil.to_i'が '0'を返すという慣習では確かです。数字だけを目指す。 –
それは非常にエレガントではないのですが、動作しているようです。これを行う方法の
[1,2,3,4,5].each_with_object([]){|i,l| l<<(l.last||0)+i}
#=> [1,3,6,10,15]
@MuratUstuntasこれは非常識です(これは勝者ではありません。ベンチマークを再検討してください)。適切なソリューションを選択する際には、ナノ秒の半分の差は問題になりません。 – mudasobwa
私は@ mudasobwaに同意します:あなたのベンチマークは、基本的に ' の実装間に大きな統計的な違いはありません。したがって、コードの読みやすさと使い慣れた方法に精通しているかどうかだけで選択してください。 –
はい、あなたは正しいです。私はちょうど言葉を言う。私が間違いを犯したら、許してください。 :) –
たくさん。一つの方法は、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]
'(合計+ n)。タップ&y.method(:<<)' – mudasobwa
@ mudasobwa、はいこれは素晴らしいアイデアです。 –
別のバリエーション:
> [1, 2, 3, 4, 5].reduce([]) {|acc, el| acc << el + (acc[-1] || 0); acc}
#=> [1, 3, 6, 10, 15]
ユク。
inject/reduceを使用してブロック内の2番目のステートメントでオブジェクトを返さなければならない場合は、おそらくeach_with_objectを使用することができます。 –
⇑ようこそ、PHPの
map
を使用し、代わりに既存のものの新しい配列を作成したい場合は! – mudasobwaはい、ちょうど古い学校の解決.. :) –
@ MuratUstuntas "場所"とはどういう意味ですか? – Stefan