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

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

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

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

4回答

1340閲覧

Rubyでハイアンド・ローのアルゴリズムについて

ffj

総合スコア7

Ruby

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

1グッド

0クリップ

投稿2018/02/26 13:01

Rubyでハイアンド・ローのアルゴリズムについて

プログラミングをはじめたばかりなのですが、
思い通りの結果が出力されなくて困っています。

入力される値

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

a b n A_1 B_1 ... A_n B_n

aとA_nを比べてaの方が大きいなら"High"
aとA_nを比べてaの方が小さいなら"Low"
aとA_nが同じだった場合、bとB_nを比べてbの方が大きいなら"High"
aとA_nが同じだった場合、bとB_nを比べてbの方が小さいなら"Low"

と表示したいです。

(例)
与えられた標準入力
1 2
3
2 3
1 4

欲しい結果
"Low"
"High"

該当のソースコード

ruby

1 2a, b = gets.split( ) 3 4n = gets.to_i 5 6for i in 1..n do 7 A_i,B_i = gets.split ( ) 8 if a > A_i then 9 puts "High" 10 elsif a = A_i then 11 elsif b < B_i 12 puts "High" 13 else puts"Low" 14 end 15 16 17end

試したこと

A_i,B_i自体をputsで出力させると値は取れてくるのですが...

for の使い方が間違っているのでしょうか、
初歩的なところで申し訳ないですが、どうかよろしくお願いします。

以下のエラーが出ます。

Main.rb:10: warning: already initialized constant A_i Main.rb:10: warning: previous definition of A_i was here Main.rb:10: warning: already initialized constant B_i Main.rb:10: warning: previous definition of B_i was here
mkt0225👍を押しています

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

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

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

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

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

guest

回答4

0

ruby では 大文字の変数は 定数と扱います。
定数は一度しか値を設定できません。
参考

  • ruby 定数

https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html#const

...
アルファベット大文字 ([A-Z]) で始まる識別子は定数です。 定数の定義 (と初期化) は代入によって行われますが、メソッドの 中では定義できません。一度定義された定数に再び代入を行おうと すると警告メッセージが出ます。
...

質問文に示されている"望んでいる出力" とは一致しませんが、
エラーが出ない様に、書き換えてみました。

lowhigh.rb

ruby

1a, b = gets.split 2 3n = gets.to_i 4 5n.times do 6 a_i, b_i = gets.split 7 if a_i < a 8 puts 'High' 9 elsif a_i > a 10 puts 'Low' 11 else 12 if b_i < b 13 puts 'High' 14 elsif b_i > b 15 puts 'Low' 16 end 17 end 18end

実行例:

$ ruby lowhigh.rb 1 2 3 2 3 Low 1 4 Low 1 2

投稿2018/02/26 13:47

katoy

総合スコア22324

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

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

ffj

2018/02/26 13:56

コードまで書いていただいてありがとうございます。 参考にして自分でもう一度書いて見たいと思います。
guest

0

Rubyでは大文字で始まる変数名は定数となり、再代入時に警告が出ます。
forによってA_i,B_iに繰り返し代入されるので当然警告が出ます。

elsif a = A_i then elsif b < B_i
  • a = A_i

比較は==を使います。=ではaにA_iが代入されます。

  • Rubyではインデントは基本無視されます。

よって、これはa = A_iが偽の場合にb < B_iが比較されます。

投稿2018/02/26 13:35

asm

総合スコア15147

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

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

ffj

2018/02/26 13:56

ありがとうございます。 比較を==にするのを忘れていました... 基本的なところで申し訳ないです。
guest

0

Rubyでは、英大文字で始まる変数名は、定数という意味になっていて、2回目以降の代入では警告が出ます。
エラーじゃ無いので、そのまま実行できますが。

あと、文字列を大小比較すると、辞書順的な比較になるので、数値として比較するならto_iしてください。

投稿2018/02/26 13:28

otn

総合スコア84553

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

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

ffj

2018/02/26 13:54

ありがとうございます! 変数名に大文字がよくなかったのですね。 なるほど、.to_iで数値にするのを忘れていました。ありがとうございます。
guest

0

自己解決

皆様のおかげで解決いたしました。
本当に感謝しております。

ruby

1a, b = gets.split( ) 2n = gets.to_i 3for i in 1..n do 4 a_i,b_i = gets.split ( ) 5 6 if a.to_i > a_i.to_i then 7 puts "High" 8 elsif a.to_i == a_i.to_i && b.to_i > b_i.to_i then 9 puts "High" 10 11 else puts "Low" 12 13 end 14 15end

投稿2018/02/26 14:11

ffj

総合スコア7

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問