1
0
Progateでプログラムの勉強を始めたものです。
Ruby学習レッスン1(詳細のコードはスクショ参照)
答えは同じなのですが、コードを書き直せと言われました。
答えのコードを見て理解もしましたが、ここで疑問が生じました。
「自分の書いたコードだと悪い点があるか?」です。
答えは同じですが、
・他の人が見ると見にくい
・コードが無駄に長くなってしまう
という2つのデメリットを考えましたが、あっていますか?
また、逆にメリットがあれば知りたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答11件
#1
総合スコア23549
投稿2024/05/13 09:29
意見のまえに、、、、
codeはスクリーンショットではなく textで貼ってください。
読みにくいし コピペもできないので引用が面倒
(読む気がしないので意見も出せない)
#2
総合スコア5493
投稿2024/05/13 09:44
編集2024/05/13 12:56素直に書いた場合は、答えのようなコードになるかとおもいますが、
あなたが作成したコードの方が好感が持てます。
良い点としては、余りの演算を行っている個所が少ないということです。
このケースでは差はありませんが、
もし、number % 3とか number % 5の演算に非常に時間がかかるとか、複雑な計算が必要なケースの場合は、
そのような演算を行っている個所は、少ない方が良いです。
もう一点、良い点としては、number % 3と number % 5の結果を変数に格納していることです。
これにより、number % 3と number % 5の結果がどうなっているかを、(デバッガ等で)直接確認することができます。
このような例題では、問題になりませんが、実戦の場合では、期待した結果にならない場合が、多々発生します。
その時、変数に演算結果を格納していれば、直接参照できるので、問題の解決が速くなります。
変数に演算結果を格納していない場合は、その演算結果を頭で計算して推定するか、その後、どのようにコードが流れるかをたどることで、演算結果を
推定するしかありません。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#3
総合スコア4443
投稿2024/05/13 09:54
編集2024/05/14 03:29私も#2 と同様に感じましたが、
その前に、どのように書き直せと言われたのか説明してもらわないとなんとも言えません。まさかお手本のコードと全く同じものを書かないと正解にならないということはないはずですから、書きなおしかたも指示されたはずです。
ああ、そういうことか。
「「number%3 == 0」がありません」と言っているので、このレッスンでは「number%3 == 0」がコードの中に現れるかどうかで課題を達成しているかどうかを判定しているのですね。レッスンの中で「3の倍数かどうか判定する方法」としてそういう説明があったのではないですか。
3の倍数かどうかを二度計算しなくてよいように計算結果を変数に入れておくというのは一つの見識だと思いますから、間違っているというわけではないですね。
ちなみに、スクリーンショットだと上記のメッセージを回答に書くためにわざわざもう一度手で打ち直さないといけないんですよね。そういうこともあって、私はスクリーンショットでコードやメッセージが示されると読まないです (そういう人は多いと思います)。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#4
総合スコア23549
投稿2024/05/13 13:35
編集2024/05/13 13:37「このレベルの課題は人が見ずにプログラムで処理している」のかな、と感じました。
人が読めばどちらも同じアルゴリズムですから。
で
私も#2 に同感なのですが、その線で考えると2点問題を感じました。
Dqiwqqさんの解の良いところは if elsif else の判定式を How でなく What にしている所なのですが、その場合
- 命名が良くない。
score3 では何なの分からない。余りを求めているのですから mod_3などにすべき。
2. 抜き出し単位が不十分というか踏み込みをもう一歩
if の判定は 5や3の倍数か否かですから multiple_of_3? = (number % 3).zero? として if multiple_of_3? && multiple_of_5? までしてしまうのがよいかと。
あ! これだと number % 3 == 0 がない、って言われるかな?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#5
総合スコア85764
投稿2024/05/13 15:11
自動採点なので、プログラムとしては正しくても、題意に沿ってないと丸は付かないと言うことかと思います。
小中学校のテストでもよく聞く話ですね(その場合は自動採点じゃないけど、授業で教えたことに沿ってないとだめとか)。
変数に代入するか、代入せず式のまま書くかの一般論で言うと、変数に代入した方が良いのは、
○何度も参照される場合
・式の計算が一度で済むので効率が良い。ただしCのような最適化が熟した言語だと生成されるコードは一緒だったりすることも多いのでこのメリットは無いかも。また、最適化されない場合でも、そこが律速段階なのか?によっては効率と見やすさのトレードオフを考えるべき
・式に修正が入った時に一箇所だけ直せば良い
○もし一度しか参照されない場合であっても
・変数名を適切に付けることで、その式が何の値であるかのコメント的意味を持つ
・複雑な式や、括弧のネストが深い場合など、一部を切り出して変数に置くことで見やすくなる(意味のある単位で変数化して、変数名が適切であることが前提。そのあたりをよく考えずににやると逆に見にくくなる)
変数に代入するデメリットは、あまり大きくはないですが、
・代入部分と、参照部分を両方見ないと、参照部分の意味が分からない(適切な変数名であれば良いが)
・プログラムを読んでいる時に、その変数がもっと後で参照されない保証がないので、スコープの終わりまで変数名と意味を覚えておかないといけない(変数名のスコープをぎりぎりまで狭められれば良いが)
・適切な変数名を考えるのが面倒(良い名前が思いつかないなら、変数に代入しないことも検討すべき)
と、変数化することで読みにくくなる場合もあります。
結局、「名前重要」ということでしょうか。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#8
総合スコア300
投稿2024/05/14 14:25
編集2024/05/14 14:30#7
それは、わかってます。プログラムのコードとして間違っているとは一言もいっていません。
問題文は、プログラムを作れではないのです。①から④の条件で条件分岐を作れです。
その条件分岐を作れってところに、代入文と条件分岐を書いてしまってますよね。
答えのコードの行番号をよくみてください
#条件分岐を作成してください の後に、行間は空いていません。
問題文をちゃんと理解して回答していないということです。
実行結果あってさえいればOKの問題だと、問題文は「プログラムを作れ」となり、
わざわざ細かい条件などは書くことは、ほとんどないとおもいます。
なぜなら、実行させて結果をみればよいから、細かい条件の説明は意味がないからです。
これがプログラムを作れって問題なら、なんで「コードを書き直せ」になるのって、私も思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#9
総合スコア85764
投稿2024/05/14 17:11
どうでも良い細かいことですが、問題文の出力するメッセージ部分にコピーボタンらしきものが付いていることから推察すると、4行目以降はputsも含め全部自分で書くことになっていたのではないかと思います。
ifの条件だけ空欄になっていて埋める問題ならコピーボタン要らない。
問題文に沿ってないから正答でないのだろうというのは変わりませんが。
P.S.
number % 3 == 0
じゃなくてnumber / 3 * 3 == number
と書いたらどうなるのかなと思いましたが、%
を知らないと見做されて×かな。(その前に%
を学んでいるという前提)
number % 3 < 1
はひねくれ者と見做されて×か。これが通れば度量が大きい。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。