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

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

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

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

Q&A

解決済

3回答

1534閲覧

rubyで二次元配列の比較をしたい

you-blue-cat

総合スコア31

Ruby

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

0グッド

0クリップ

投稿2021/10/31 05:06

編集2021/10/31 05:44

ストラックアウトを作っています。
S=[["o", "x", "o"], ["o", "o", "x"], ["o", "x", "o"], ["x", "x", "x"]]
Z=[["1", "2", "3"], ["4", "5", "6"], ["7", "8", "9"], ["10", "11", "12"]]
で、Sで〇になった場合は、Zでその番号の数字の点数を加算していきたいです。

S.each do |one, two, three|

if one == "o"
puts Z.select {|(id,_ ,_)| id }
end

end

出力結果
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12

です。何か良い方法はありませんでしょうか?よろしくお願いします。

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

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

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

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

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

guest

回答3

0

それぞれ1次元にして(flatten)、両方をペアにして(transpose)、S側が"o"のものだけ選択してZ側をto_iしたものを(filter_map)、足す(sum)。

Ruby

1S=[["o", "x", "o"], ["o", "o", "x"], ["o", "x", "o"], ["x", "x", "x"]] 2Z=[["1", "2", "3"], ["4", "5", "6"], ["7", "8", "9"], ["10", "11", "12"]] 3 4score = [S,Z].map(&:flatten).transpose.filter_map{|ox,point| ox=="o" && point.to_i}.sum 5p score

なお、filter_mapはRuby2.7以降の機能です。

投稿2021/10/31 11:10

otn

総合スコア85901

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

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

otn

2021/10/31 11:12

説明がよくわからなければ、 p([S,Z].map(&:flatten).transpose) と、中間結果を見るとよいです。
you-blue-cat

2021/10/31 11:14

ありがとうございます。別の方法ですね!勉強になります。
you-blue-cat

2021/10/31 11:15

中間結果ですね。やってみます。
guest

0

ベストアンサー

こういう事でしょうか?

ruby

1num_sum = S.each_with_index.map{|r, i| 2 r.each_with_index.map{|c, j| 3 c == "o" ? Z[i][j].to_i : 0 4 } 5}.reduce(:+).sum 6 7p num_sum 8#=> 29

投稿2021/10/31 05:49

編集2021/10/31 05:58
melian

総合スコア20655

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

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

you-blue-cat

2021/10/31 05:55

回答ありがとうございます。今どの変数に合計値が格納されている状態でしょうか?
melian

2021/10/31 05:58

回答を更新しました。 num_sum に格納されています。
you-blue-cat

2021/10/31 06:16

とてもわかりやすいです。ありがとうございました。
guest

0

幾つかの方法を書いてみました。
最初は素直に書いています。そこから順々にコードを短くしていっています。

r.rb

ruby

1# frozen_string_literal: true 2 3def task_1(s, z) 4 s.flatten.zip(z.flatten) # [["o", "1"], ["x", "2"], ["o", "3"], ["o", "4"], ... 5 .select { |x| x[0] == 'o' } # [["o", "1"], ["o", "3"], ["o", "4"], ... 6 .map { |x| x[1].to_i } # [1, 3, 4, 5, 7, 9] 7 .sum # 29 8end 9 10def task_2(s, z) 11 s.flatten.zip(z.flatten.map(&:to_i)) # [["o", 1], ["x", 2], ["o", 3], ["o", 4], ... 12 .map { |x| x[0] == 'o' ? x[1] : 0 } # [1. 0, 3, 4, ...] 13 .sum # 29 14end 15 16def task_3(s, z) 17 s.flatten.zip(z.flatten) 18 .each_with_object([]) { |x, mem| mem << x[1].to_i if x[0] == 'o' } 19 .sum 20end 21 22def task_4(s, z) 23 s.flatten.zip(z.flatten) 24 .inject(0) { |mem, x| mem + (x[0] == 'o' ? x[1].to_i : 0) } 25end 26 27s = [%w[o x o], %w[o o x], %w[o x o], %w[x x x]] 28z = [%w[1 2 3], %w[4 5 6], %w[7 8 9], %w[10 11 12]] 29 30p task_1(s, z) 31p task_2(s, z) 32p task_3(s, z) 33p task_4(s, z) 34

実行例
イメージ説明

投稿2021/10/31 20:52

編集2021/10/31 20:57
katoy

総合スコア22324

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

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

you-blue-cat

2021/11/01 00:15

回答ありがとうございます。回答が幾つかあると助かります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問