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

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

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

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

Q&A

解決済

4回答

555閲覧

「Ruby」回答のコードで何故動くのか分からない

Kengo_jeb

総合スコア9

Ruby

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

1グッド

1クリップ

投稿2020/02/19 03:55

編集2020/02/19 03:59

###「Ruby」回答のコードで何故動くのか分からない
下記の問題が分からなかった為、答えを確認したんですが、何故答えのコードで動くのか分からなかったので教えていただけませんか。
不明点は回答コードに下記しました。

問題

指定された配列(リスト)の定義の中で、同じ値が存在した場合はtrueを、そうでない場合はfalseを出力してください。

●入力される値
なし
HND, NRT, KIX, NGO, NGO
を要素に持つ配列(リスト)をプログラムで定義し、使用すること。

●期待する出力
配列(リスト)の要素に重複があればtrueを、重複がなかったらfalseを出力する。
最後は改行し、余計な文字、空行を含んではいけません。

回答コード

array = ['HND', 'NRT', 'KIX', 'NGO', 'NGO'] is_duplicate = false array.size.times do |i| array.size.times do |j| if i != j && array[i] == array[j] is_duplicate = true end end end puts is_duplicate

不明点

is_duplicate = false

配列の下に、上記のプログラムを書く意味がわからないので、書く理由を教えていただけませんか。

if i != j && array[i] == array[j] is_duplicate = true end

上記のコードがどの様に動いているか全くわからないです。
また、何故このコードで流れるかも分からないです。
どの様な仕組みで流れているか教えていただけませんか。

初歩的な疑問かと思われますが、不明点について、ご回答して頂けたら幸いです。

DrqYuto👍を押しています

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

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

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

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

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

guest

回答4

0

どの様な仕組みで流れているか教えていただけませんか。

.eachが二重になっているとおり、ijそれぞれが配列を進んでいきます。ijが違う場所で配列の中身が一致したなら、「重複した」ということになります。


なお、同じ動作をするコードは1行で書けます。

ruby

1puts array.length != array.uniq.length

「同じものを1つにまとめる」uniqメソッドを使って、減ったかどうかをチェックすることで重複があったか分かる仕組みです。

投稿2020/02/19 04:06

maisumakun

総合スコア145930

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

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

otn

2020/02/19 08:26

おそらく「Rubyプログラミングを教える教科書」じゃなくて「プログラミングを教える教科書(言語はたまたまRubyを使います)」というような本なのでしょう。
Kengo_jeb

2020/02/19 09:26

maisumakun様、ご回答ありがとうございます。 1行で書ける程の簡単な問題だったんですね! 勉強になりました。ありがとうございます。
guest

0

動かしてみると良いです。

pythontutor

投稿2020/02/19 09:33

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Kengo_jeb

2020/02/19 09:39

ご回答ありがとうございます。 こんな便利なサイトがあるんですね。 コードの動きが分かりとても分かりやすいです。教えて頂きありがとうございます。
guest

0

[配列の下に、上記のプログラムを書く意味]
ふたつあります

  1. もしなかった場合:重複があると、is_duplicate = true が代入されますが、重複がないとis_duplicate は定義されません。そのため

puts is_duplicate
で未定義のエラーとなります。
それを避けるために 予め false を代入しておきます

  1. loopの中で初めて定義された変数はloopが終わると消えてしまいます。

あ、これも未定義エラーになるか。
それを避けるために予めloopの外で定義しておきます

投稿2020/02/19 05:07

winterboum

総合スコア23549

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

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

0

ベストアンサー

動きがわからないということでしたので、ループ中itがどこにいるのかわかりやすいよう、出力させるコードを追加してみました。

rb

1array = ['HND', 'NRT', 'KIX', 'NGO', 'NGO'] 2 3is_duplicate = false 4 5array.size.times do |i| 6 array.size.times do |j| 7 8 dup_array = array.dup 9 dup_array[i] += '[i]' 10 dup_array[j] += '[j]' 11 puts "i=#{i}, j=#{j}" 12 puts "iとtの位置: #{dup_array}" 13 puts "i != j: #{i != j}" 14 puts "array[i] == array[j]: #{array[i] == array[j]}" 15 puts 16 17 if i != j && array[i] == array[j] 18 is_duplicate = true 19 end 20 end 21end 22 23puts is_duplicate

実行すると以下の結果が得られます。

text

1i=0, j=0 2iとtの位置: ["HND[i][j]", "NRT", "KIX", "NGO", "NGO"] 3i != j: false 4array[i] == array[j]: true 5 6i=0, j=1 7iとtの位置: ["HND[i]", "NRT[j]", "KIX", "NGO", "NGO"] 8i != j: true 9array[i] == array[j]: false 10 11i=0, j=2 12iとtの位置: ["HND[i]", "NRT", "KIX[j]", "NGO", "NGO"] 13i != j: true 14array[i] == array[j]: false 15 16i=0, j=3 17iとtの位置: ["HND[i]", "NRT", "KIX", "NGO[j]", "NGO"] 18i != j: true 19array[i] == array[j]: false 20 21i=0, j=4 22iとtの位置: ["HND[i]", "NRT", "KIX", "NGO", "NGO[j]"] 23i != j: true 24array[i] == array[j]: false 25 26i=1, j=0 27iとtの位置: ["HND[j]", "NRT[i]", "KIX", "NGO", "NGO"] 28i != j: true 29array[i] == array[j]: false 30 31i=1, j=1 32iとtの位置: ["HND", "NRT[i][j]", "KIX", "NGO", "NGO"] 33i != j: false 34array[i] == array[j]: true 35 36i=1, j=2 37iとtの位置: ["HND", "NRT[i]", "KIX[j]", "NGO", "NGO"] 38i != j: true 39array[i] == array[j]: false 40 41i=1, j=3 42iとtの位置: ["HND", "NRT[i]", "KIX", "NGO[j]", "NGO"] 43i != j: true 44array[i] == array[j]: false 45 46i=1, j=4 47iとtの位置: ["HND", "NRT[i]", "KIX", "NGO", "NGO[j]"] 48i != j: true 49array[i] == array[j]: false 50 51i=2, j=0 52iとtの位置: ["HND[j]", "NRT", "KIX[i]", "NGO", "NGO"] 53i != j: true 54array[i] == array[j]: false 55 56i=2, j=1 57iとtの位置: ["HND", "NRT[j]", "KIX[i]", "NGO", "NGO"] 58i != j: true 59array[i] == array[j]: false 60 61i=2, j=2 62iとtの位置: ["HND", "NRT", "KIX[i][j]", "NGO", "NGO"] 63i != j: false 64array[i] == array[j]: true 65 66i=2, j=3 67iとtの位置: ["HND", "NRT", "KIX[i]", "NGO[j]", "NGO"] 68i != j: true 69array[i] == array[j]: false 70 71i=2, j=4 72iとtの位置: ["HND", "NRT", "KIX[i]", "NGO", "NGO[j]"] 73i != j: true 74array[i] == array[j]: false 75 76i=3, j=0 77iとtの位置: ["HND[j]", "NRT", "KIX", "NGO[i]", "NGO"] 78i != j: true 79array[i] == array[j]: false 80 81i=3, j=1 82iとtの位置: ["HND", "NRT[j]", "KIX", "NGO[i]", "NGO"] 83i != j: true 84array[i] == array[j]: false 85 86i=3, j=2 87iとtの位置: ["HND", "NRT", "KIX[j]", "NGO[i]", "NGO"] 88i != j: true 89array[i] == array[j]: false 90 91i=3, j=3 92iとtの位置: ["HND", "NRT", "KIX", "NGO[i][j]", "NGO"] 93i != j: false 94array[i] == array[j]: true 95 96i=3, j=4 97iとtの位置: ["HND", "NRT", "KIX", "NGO[i]", "NGO[j]"] 98i != j: true 99array[i] == array[j]: true 100 101i=4, j=0 102iとtの位置: ["HND[j]", "NRT", "KIX", "NGO", "NGO[i]"] 103i != j: true 104array[i] == array[j]: false 105 106i=4, j=1 107iとtの位置: ["HND", "NRT[j]", "KIX", "NGO", "NGO[i]"] 108i != j: true 109array[i] == array[j]: false 110 111i=4, j=2 112iとtの位置: ["HND", "NRT", "KIX[j]", "NGO", "NGO[i]"] 113i != j: true 114array[i] == array[j]: false 115 116i=4, j=3 117iとtの位置: ["HND", "NRT", "KIX", "NGO[j]", "NGO[i]"] 118i != j: true 119array[i] == array[j]: true 120 121i=4, j=4 122iとtの位置: ["HND", "NRT", "KIX", "NGO", "NGO[i][j]"] 123i != j: false 124array[i] == array[j]: true 125 126true

投稿2020/02/19 08:46

Mugheart

総合スコア2349

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

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

Kengo_jeb

2020/02/19 09:20

ご回答ありがとうございます。 上記の様なtimesメソッドを連続してコードを書くと、iとjに「i = 0 , j = 0 」、i = 1 , j = 1」の順番に数値が代入されていくと思っていました。 今回の様な2回ループ処理が行われるコードの場合、i とj の動きは、iは0固定 jは0,1,2,3と数値が代入、それが終わったらiに1が代入され jは再度0,1,2,3と代入するといった感じで進むんですね。 しかし、何故、同じ値が同時に i と j に入力されないのでしょうか? また、この様なコードを書いた際は、ご説明して下さった様に動くと認識しておくべきでしょうか?
Mugheart

2020/02/19 10:47

ループの中でループしているので自明だと思うのですが、 iのループが1回処理を行う中でtが5回ループ処理を行っています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問