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

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

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

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

RubyGems

RubyGemsはRubyによるプログラミングのためのパッケージマネジメントツールです。ユーザはこれを使用することで、Rubyライブラリのダウンロードやアップデートや、依存関係の自動解決が可能になります。

Q&A

解決済

2回答

544閲覧

「問題」文字と整数の組のソートの回答コードが理解できない「Ruby」

Kengo_jeb

総合スコア9

Ruby

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

RubyGems

RubyGemsはRubyによるプログラミングのためのパッケージマネジメントツールです。ユーザはこれを使用することで、Rubyライブラリのダウンロードやアップデートや、依存関係の自動解決が可能になります。

1グッド

1クリップ

投稿2020/02/19 10:22

編集2020/02/19 10:24

###「Ruby」回答のコードで何故動くのか分からない
表題の問題を解いていましたが分からなかった為、答えを確認しました。しかし、答えを見ても何故そのコードで動くのか分かりませんでした。
下記に問題、回答コード、不明点を下記しました。

問題

1行目に行数を表す整数 n、続く n 行の各行で「文字」と「整数」の組が空白区切りで入力されます。
n 個の組を、「整数」の値で昇順に並べ変え、「文字」を出力してください。

●入力される値
入力は以下のフォーマットで与えられます。

n
S_1 D_1
S_2 D_2
...
S_i D_i
...
S_n D_n

S_i は「文字」で、D_i は「整数」です。
入力される文字 S_i は、同じ文字が複数入力されることはなく、整数 D_i も同様です。

●期待する出力
n 個の組を、「整数」の値で昇順に並べ変え、「文字列」を1行ずつ出力してください。

●入力例1
2
A 1
B 2

●出力例1
A
B

回答コード

num = gets.chomp.to_i array = {} (1..num).each do line = gets.chomp.split(' ') array[line[1].to_i] = line[0] end array = array.sort array.each do |ele| puts ele[1] end

不明点

array[line[1].to_i] = line[0]

array[line[1].to_i] は何を指しているか分かるのですが、line[0]に何故格納するのか分かりません
また、自身の認識ですと、この様に記入すると言う事は、何かの値を格納すると言う意味になる為、動かなくなるイメージです。
上記のコードはどの様な動きになっているか教えていただけませんか。

また、このコードで動いているので、どの様に出力されているか知る為、p array を記載した所、
{1=>"A", 2=>"B"}
と出力されました。何故、唐突にHashで生成されているのか教えて頂きたいです。

array.each do |ele| puts ele[1] end

最終行でのarrayは{1=>"A", 2=>"B"} になっているので、英語の文字のみを出力する為、puts ele[1]を記載したと言う認識で間違っていないでしょうか。

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

DrqYuto👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

Rubyを知らない奴が解答書いたんじゃないですかね

ruby

1n = gets.to_i 2array = Array.new(n){ gets.split } 3array.sort_by{|item| item[1].to_i } 4 .each{|s,d| puts s }

ruby

1n = gets.to_i 2Array.new(n){ 3 s, d = gets.split 4 [s, d.to_i] 5}.sort_by(&:last).each{|s,d| puts s}

投稿2020/02/20 06:59

asm

総合スコア15147

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

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

0

array[line[1].to_i] は何を指しているか分かるのですが、line[0]に何故格納するのか分かりません

いえ、逆です。line[0]array[line[1].to_i]代入しています。

この様に記入すると言う事は、何かの値を格納すると言う意味になる為、動かなくなるイメージです。

どうして「何かの値を格納する」ことと「動かなくなる」が結びつくのでしょうか。何も値を格納しないプログラムは、おそらく固定的な値を出力することしかできないでしょう。

何故、唐突にHashで生成されているのか教えて頂きたいです。

array = {}となっているように、最初からハッシュです。

最終行でのarrayは{1=>"A", 2=>"B"} になっているので、英語の文字のみを出力する為、puts ele[1]を記載したと言う認識で間違っていないでしょうか。

これは合っています。


全般に、コードを忠実に辿らず、自分の思い込みで読み進めてしまっているところが多いように思われます。コードは、書いたとおりにしか動きません。

投稿2020/02/19 10:27

maisumakun

総合スコア145183

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

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

maisumakun

2020/02/19 10:30

これもまた、.sort_by(&:last)で書きたくなるなあ…
winterboum

2020/02/20 01:54

arrayと名乗ってHashとかも気持ち悪い。 Arrayで良いではないか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問