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

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

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

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

Q&A

解決済

3回答

6571閲覧

rubyで配列内の配列の要素にたいして1つずつ計算する方法

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

1グッド

1クリップ

投稿2016/05/30 05:02

rubyで配列内の配列の要素を1つずつ計算する方法でつまずいています。

ruby

1ary1 = [0,1,2,3] 2ary2 = [4,5,6,7] 3ary3 = [8,9,10,11] 4 5ary = [ary1,ary2,ary3] 6 7ary.each do |i| 8puts (i * 2) 9end

ruby

1でてくる計算結果 20 31 42 53 60 71 82 93 104 115 126 137 144 155 166 177 188 199 2010 2111 228 239 2410 2511 26 27出てほしい目標 280 292 306 318 3210 3312 3414 3516 3618 3720 3822

よろしくお願いします

DrqYuto👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

ブロック変数 i には、 0, 1, ... などではなく、
[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11] が渡されています。

配列の * は算数の掛け算ではなく、要素の繰り返しのためこうなってしまっています。

Array#flatten を使って、 i0, 1, ... が渡されるようにすることを考えるといいと思います。

投稿2016/05/30 05:12

編集2016/05/30 05:14
yskkin

総合スコア33

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

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

退会済みユーザー

退会済みユーザー

2016/05/30 05:29

分かりやすい回答ありがとうございます。以下でいけました! ary1 = [0,1,2,3] ary2 = [4,5,6,7] ary3 = [8,9,10,11] ary = [ary1,ary2,ary3] array = ary.flatten array.each do |i| puts ( i* 2 ) end
guest

0

まず、つぎのコードとその出力結果は理解できますか?

x.rb

ruby

1ary1 = [0, 1, 2, 3] 2ary2 = [4, 5, 6, 7] 3ary3 = [8, 9, 10, 11] 4ary = [ary1,ary2,ary3] 5 6ary.each do |i| 7 p i 8end
$ ruby x.rb [0, 1, 2, 3] [4, 5, 6, 7] [8, 9, 10, 11]

各要素の値を 次のように 2 倍にした値を表示することにチャレンジしてみます。
[0, 1, 2, 3] --> 0, 2, 4, 6

ruby

1ary.each do |i| 2 i.each do |item| 3 puts item * 2 4 end 5end

実行結果

$ ruby x.rb 2 4 6 8 10 12 14 16 18 20 22

蛇足:
Array には、要素毎に処理をするためのメソッドがいろいろ用意されています。
map, inject, join, ...
(ruby の API リファレンスを読んでみてください)

次の4つの例でも、同じ出力結果になります。

ruby

1puts ary.map { |v| v.map { |x| x * 2 } }.join("\n") 2 3ary.map { |v| v.map { |x| puts x * 2 } } 4 5puts ary.flatten.map { |x| x * 2 }.join("\n") 6 7require 'vector' 8puts (Vector[*(ary.inject([]) {|a, e| a += e })] * 2).to_a.join("\n")

投稿2016/05/30 15:11

katoy

総合スコア22324

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

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

退会済みユーザー

退会済みユーザー

2016/06/02 10:09

色々なやり方があるんですね!参考になります!
guest

0

Ruby

1ary1 = [0,1,2,3] 2ary2 = [4,5,6,7] 3ary3 = [8,9,10,11] 4 5ary = [ary1,ary2,ary3].reduce(:concat) # flatten()でも 6 7ary.each do |i| 8puts (i * 2) 9end

投稿2016/05/30 05:15

編集2016/05/30 05:17
ozwk

総合スコア13521

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

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

退会済みユーザー

退会済みユーザー

2016/05/30 05:51

ありがとうございます。 これでも動作しましたが、動きが漠然としか理解できません。 ary = [ary1,ary2,ary3].reduce(:concat) #ここで各aryにconcatするよーと予定を立てて puts ( i * 2 ) #こちらで配列の要素に大して * 2を追加しているという考えていいんでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問