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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1626閲覧

アルゴリズム問題の最中、配列の動きが分からなくなった。(Ruby)

krppppp

総合スコア13

Ruby

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2017/12/21 11:47

###前提・実現したいこと
アルゴリズムを解いてる最中、配列の生成時、扱いに関して分からない事が複数あったので質問させて下さい。
初心者ながら考えながらコードに起こしたのですが、具体的には二次元配列の動きが分かりませんでした。
また改善できる点を指摘おねがいします。

###アルゴリズムの問題
N*Nの数字の文字列が一列ずつ標準入力から渡されます。
左上を起点とした斜めの文字列と右上を起点とした斜めの文字列カンマ区切りで出力せよ

問題では
N

N*N が渡されます

###入力される値
5
1 18 4 19 14
17 3 25 11 6
23 12 16 2 21
10 24 22 8 9
5 20 7 13 15

###該当のソースコード

ruby

1 2 3 4N = gets.to_i 5 6row=Array.new(N).map{Array.new(N,0)} #横 7col=Array.new(N).map{Array.new(N,0)} #縦 8naname=Array.new(2).map{Array.new(N,0)} #斜め 9 10 11N.times {|i| row[i] =gets.split(" ").map(&:to_i) } # 先に単純な横の列を配列に入れ込んだ 12 13 N.times do|i| 14 N.times do|j| 15 16 col[i][j] = row[j][i]  17 18 if (i==j) 19 naname[0][i] = row[i][j] 20 elsif (i+j == N-1) 21 naname[1][i] = row[i][j] 22 end 23 24 end 25 end 26puts naname[0].join(",") # 1,3,16,8,15 27puts naname[1].join(",") # 14,11,,24,5 #あれ!!!?? 28 29

###質問
1、ここのコードにたどり着くのに大分はまりました。
というのも二次元配列を生成するのが初めてに近かったからなのですが、横の配列rowの特定の添え字に標準入力で与えられる文字列の該当の値を代入しています。

これは過去のコードです。

ruby

1row=Array.new(N).map{Array.new(N)} 2#引数に初期値0を設定せず標準入力を取得して先に進んでいたのですが 3N.times {|i| row[i] =gets.split(" ").map(&:to_i)} 4 5puts row[0] #1 18 4 19 14 6puts row[0][0] #

後々この挙動に気づいたのですが、最後の出力にて内側の配列要素を取得することができませんでした。なぜなのでしょうか。

2、3度のtimesで若干見苦しいので綺麗な書き方があればお願いします。

3、”該当のソースコード”を見て貰うと理解して頂けますように、naname[1][2]だけ取得できません。
どこに問題が有るのか教えて下さい。

どうぞよろしくお願いします

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

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

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

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

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

guest

回答2

0

ベストアンサー

デバッグのために
elsifの後に、こういうのを仕込みます

rb

1puts "[#{i}][#{j}]:#{row[i][j]}"

結果が

[0][4]:14 [1][3]:11 [3][1]:24 [4][0]:5

[2][2]が出てない事に気づくでしょう

そして、コードをもう一度みると

rb

1if (i==j) 2 naname[0][i] = row[i][j] 3elsif (i+j == N-1) 4 puts "[#{i}][#{j}]:#{row[i][j]}" 5 naname[1][i] = row[i][j] 6end

[2][2]だと、前の条件に吸い込まれてしまっていることが分かります

私が直すとしたら、こんな感じです

rb

1 naname[0][i] = row[i][j] if (i == j) 2 naname[1][i] = row[i][j] if (i+j == N-1)

私が書くとしたら

rb

1N = gets.to_i 2 3row = N.times.map{ gets.split(' ').map(&:to_i)} 4puts N.times.map{|i| row[i][i]}.join "," 5puts N.times.map{|i| row[i][N-i-1]}.join ","

投稿2017/12/21 13:28

編集2017/12/21 13:43
asm

総合スコア15147

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

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

0

  1. わからない。 

  2. repeated_combination とかを使う。

  3. よーく、ソースコードを読んでみよう。

    if (i==j) naname[0][i] = row[i][j] elsif (i+j == N-1) naname[1][i] = row[i][j] end

(i==j)かつ (i+j == N-1) の時はどうなる?

投稿2017/12/21 13:33

kiichi54321

総合スコア1984

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問