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

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

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

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

Q&A

解決済

1回答

718閲覧

rubyの初学者です。問題を解いているのですが手詰まりで解けないのでお力貸していただきたいです

mnmn13

総合スコア2

Ruby

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

0グッド

0クリップ

投稿2023/03/24 11:21

実現したいこと

ruby 初学者です
問題を解いてるのですが手詰まりでどうしてもうまくいきませんので
どなたかご教授ください。
問題は以下です。
あなたは自分のウェブサイトでプレゼント企画を実施しました。
プレゼントには A と B の二種類があります。

当選者は以下の条件に従って、選出されます。

・整数 X の倍数番目の応募者はプレゼント A の当選者とする
・整数 Y の倍数番目の応募者はプレゼント B の当選者とする

応募者の数が与えられるので、各応募者のプレゼント当選情報を出力してください。プレゼント A と B の両方当選した人は AB、A だけ当選した人は A、B だけ当選した人は B、どちらも当選してない人は N を出力してください。

入力例 1 の場合、応募者の人数は 5 人なので、5 人の当選情報を出力します。プレゼント A の当選者は、2 の倍数番目の応募者で、プレゼント B の当選者は 4 の倍数の当選者なので、2 番目の応募者は A、4 番目の応募者は AB となり、それ以外の応募者は N になります。

前提

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

N X Y
・1 行目にはそれぞれ整数 N, X, Y がこの順で半角スペース区切りで与えられます。これらは応募者が N 人であることを示し、X の倍数番目の応募者がプレゼント A の当選者となり、Y の倍数番目の応募者がプレゼント B の当選者となることを示します。
・入力は 1 行となり、末尾に改行が 1 つ入ります。

それぞれの値は文字列で標準入力から渡されます。

該当のソースコード

下記のコードを書いたのですがどうしても最後の行に、Nのに該当する数字が出力されてしまいます。

N, X, Y = gets.split(' ').map(&:to_i)
for i in 1 .. N do
if
i % X ==0 && i % Y == 0
puts "AB"
elsif
i % X != 0 && i % Y != 0
puts "N"
elsif
i % X == 0
puts "A"
else
i % Y == 0
puts "B"
end
end
puts i

初歩的な質問で申し訳ないですがご回答いただけると幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

どうしても最後の行に、Nのに該当する数字が出力されてしまいます。

最後にputs iがあるからですね。この時点ではiの値はNなので、Nが出力されます。
これを書いた意図は何でしょうか?

また、elseの後のi % Y == 0が無意味です。比較結果の真偽が何にも使われず捨てられます。
単にelseでいいし、elseの条件を明示したければ、elsifにするのもありです。

投稿2023/03/24 11:30

otn

総合スコア84538

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

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

mnmn13

2023/03/24 12:19

ご回答いただきありがとうございます。 ご指摘いただいて理解できました。 お恥ずかしながらfor式自体の理解がしっかりとできていませんでした。 for 変数 in 範囲、ハッシュ、配列などを指定 do  puts 変数 end 上記のような覚え方をしてしまっていました。 なのでputs i を入力していました。puts 変数ではなく処理の内容を書くべきで 今回でいうと条件分岐の部分が処理にあたるということであってますでしょうか? また else のあとが必要ないのもご指摘ありがとうございます。 elseの条件を明示したければというところですが、なぜelseではなくelsifにする必要があるのですか? 重ね重ねのご質問で恐縮ですがよろしくお願いいたします。 コードに関しては修正して正常に動きました。 ありがとうございます。
otn

2023/03/24 13:23

> 今回でいうと条件分岐の部分が処理にあたるということであってますでしょうか? そうですね。 > なぜelseではなくelsifにする必要があるのですか? ifやelsifの後の式は、条件と見なされて、次のelsif/else/endまでの文を実行するかどうかの判断条件になります。 elseの後は、条件を書かないので、条件っぽい物を書いてもそれは条件として扱われません。 i % Y == 0 はiやYがメソッド名ならそれぞれ呼び出されますが、ここでは変数なので、単に計算して結果が捨てられるだけです。 もしかすると、最適化処理でこの行自体がバイトコードに残らないかも。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問