Arrayに累積配列?を作成したいですがよい実装方法を教えてください
例
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]から
[1, 3, 6, 10, 15, 21, 28, 36, 45, 55]を返したいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答7件
0
効率重視
lang
1(1..10).inject([]){|a, v| a << (a.last || 0) + v; a}
シンプルさ重視
lang
110.times.map{|i| (1..i+1).inject(:+)}
投稿2014/11/24 03:11
総合スコア5223
0
計算は以下のように行えます。
lang
1ns = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 入力となる Array オブジェクト ns 2f = -> n { (1..n).reduce :+ } # 1 から n までの総和を求める手続き f 3ns.map &f # ns の各要素に f を適用
上の3行は、以下と同じことです。
lang
1[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map {|n| (1..n).reduce :+ }
「Array に〜実装」したいとのことですが、実装方針によって以下のような場合があると思います。
Array クラスのインスタンスメソッドとして実装する場合
lang
1class Array 2 def calc 3 map {|n| (1..n).reduce :+ } 4 end 5end 6 7[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].calc #=> [1, 3, 6, 10, 15, 21, 28, 36, 45, 55]
オブジェクト ns の特異メソッドとして実装する場合
lang
1ns = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 2 3def ns.calc 4 map {|n| (1..n).reduce :+ } 5end 6 7ns.calc #=> [1, 3, 6, 10, 15, 21, 28, 36, 45, 55]
入力となる Array オブジェクトを引数に指定する手続きとして実装する場合
lang
1calc = -> ns { ns.map {|n| (1..n).reduce :+ } } 2 3calc.([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) #=> [1, 3, 6, 10, 15, 21, 28, 36, 45, 55]
投稿2014/11/26 01:08
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
a=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
b="0"
c=a.map{|x| b = b + "+" + x.to_s}.map{|x|eval(x)}
p c
[0+1,0+1+2,...,0+1+...+10]を作ってevalで計算してみたり。
投稿2014/11/25 16:11
総合スコア11
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
CertaiNさんと同様の回答になりますが、以下でどうでしょうか?
lang
1a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 2p a.size.times.map{|i| a[0..i].inject(:+)}
投稿2014/11/24 04:10
総合スコア233
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2014/11/24 04:36
2014/11/24 06:54
2014/11/26 12:00
2016/07/08 13:01
0
一番シンプル。
lang
1a=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 2x=0 3b=a.map{|w| x+=w}
CertaiNさんの1つめの改造。ループ内で先頭の場合の特別処理を無くしました。
lang
1a=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 2b=a.inject([0]){|x,v| x<<x.last+v} 3b.shift
lang
1a=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 2b=a.inject([0]){|x,v| x<<x.last+v}.drop(1)
(変数名が被って直感的にわかりにくいのでブロック引き数名を変更。今のRubyだと被ってもいいのですが)
修正:最後の例、drop
というメソッドがあったので、[1..-1]
を.drop(1)
に書き換えた。
投稿2014/11/24 06:14
総合スコア84505
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
問題を勘違いしていました。
回答自体を削除しようとおもいましたが、方法がわからず...
-------- 以下は無視してください ... -----
配列の合計を得るというのは、よくある処理ですね。たくさんの情報を google 検索でえることができます。
いくつかを紹介します。
-
Rubyで配列に入っている数値の合計を出すメソッドを作る(spec付き) http://qiita.com/kakkunpakkun/items/eac4e8b76978b4a65c26
-
Rubyで数値の配列の合計を求める方法 http://www.xmisao.com/2014/03/25/how-to-sum-array-of-numbers-in-ruby.html
a = [123, 456, 789]
p a.inject(:+) #=> 1368
- sum(identity = 0, &block) : Calculates a sum from the elements http://apidock.com/rails/Enumerable/sum
Rails 中には sum() というメソッドがあります。
[5, 15, 10].sum # => 30
投稿2014/11/24 05:59
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。