質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

7回答

5638閲覧

Rubyで配列の数字を足していきたい

suikawarare

総合スコア51

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

1グッド

6クリップ

投稿2014/11/23 05:02

Arrayに累積配列?を作成したいですがよい実装方法を教えてください


[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]から
[1, 3, 6, 10, 15, 21, 28, 36, 45, 55]を返したいです。

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

mpyw

総合スコア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

SadahikoHantani

総合スコア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

manman

総合スコア233

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mpyw

2014/11/24 04:35

なるほど、あらかじめ `a` が存在してるならこれですね
mpyw

2014/11/24 04:36

# コメント欄で ` ` 使えないのか…あと消せないのがつらい(汗
manman

2014/11/24 06:54

「1からNまでの配列」に限らず、一般の配列としたかったので、 a とおきました。 a = [1, 2, 3.2, 4, 5] p a.size.times.map{|i| a[0..i].inject(:+)} #=> [1, 3, 6.2, 10.2, 15.2] 余談ですが、コメント欄はMarkdownが使えないみたいです。
otn

2014/11/26 12:00

CertaiNさんの「あらかじめ a が存在しているなら」というのは、 メソッドチェーンの中で使うなら、下記のようにいったん変数に置かないといけないというような意味でしょう。 (a=foo.bar.baz).size.times.map{|i| a[0..i].inject(:+)}.hoge.hage > 「1からNまでの配列」に限らず、一般の配列としたかったので、 当然そういう質問だと思っていたのですが。
tamy

2016/07/08 13:01

トリッキーですが tap 使えば一時変数消せますね [1,2,3,4,5].tap{|a| break a.size.times.map{|i| a[0..i].inject(:+)}}
guest

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

otn

総合スコア84505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

問題を勘違いしていました。
回答自体を削除しようとおもいましたが、方法がわからず...

-------- 以下は無視してください ... -----
配列の合計を得るというのは、よくある処理ですね。たくさんの情報を google 検索でえることができます。
いくつかを紹介します。

a = [123, 456, 789]
p a.inject(:+) #=> 1368

Rails 中には sum() というメソッドがあります。

[5, 15, 10].sum # => 30

投稿2014/11/24 05:59

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こちらでどうでしょうか?

class Array
def cumulative_sum
sum = 0
self.map{|x| sum += x}
end
end

a = (1..10).to_a
a.cumulavive_sum

投稿2014/11/24 02:30

dboyaji

総合スコア62

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問