python
1water1 = 100 2water2 = 150 3 4limit = 300 #水が入る容量 5 6count = 0 7judge1, judge2 = False, False 8 9l = [0] 10while 1: 11 if (l[count] + water1) <= 300: 12 l.append(l[count] + water1) 13 else: 14 judge1 = True 15 16 if (l[count] + water2) <= 300: 17 l.append(l[count] + water2) 18 else: 19 judge2 = True 20 21 if judge1 and judge2: 22 break 23 else: 24 count += 1 25 26del l[0] 27print(sorted(set(l)))
結果
[100, 150, 200, 250, 300]
上のコードは水が300[ml]入る容器にwater1[ml]とwater2[ml]を入れていき、水の容量をできるだけ細かく刻んで入れた場合の総数を求めるコードです。
例えば、最初は300[ml]の容量のコップは水が入っていないので、0[ml]です。次にwater1の容器で100[ml]コップに移すのでコップには100[ml]の水が入ります。これがパターン1です。
次に、コップを空にして、water2の容器で150[ml]の水をコップに入れるとコップの水は150mlになります。これがパターン2です。
パターン3はwater1の容器を使い100[ml]を2回注いで200[ml]にないます。これを300[ml]からこぼれないように繰り返した時、できるだけ多くのパターンをつくり、その時のコップの中身を出力します。
もっとスッキリまとまる気がするのですが、リファクタリングするとしたらどのようになるでしょうか?
よろしくお願いいたします。
学校の課題か何かでしょうか?少し不自然な質問に感じました。
「学校の課題を解いてほしい等の質問は、具体的にプログラミングで困っている質問ではないと考え、推奨していません。」by teratail
基本的なところについて質問します。
「水の容量をできるだけ細かく刻んで入れた場合の総数を求めるコードです。」という問題なのに、答えが質問文に記載されているようになる意味が分かりません。
「できるだけ」「細かく刻んで」という文面を素直にとらえるならば、「与えられた2つのコップのいずれかまたは両方を使って、そのコップに満杯の水を入れ、与えられた容器に、容器の総計量(問題文の場合は300ミリリットル)まで水を注ぐとき(コップを容器に注ぐときに「1回」とする)、なるべくその回数が多くなるようにせよ」というような意味になるのではないでしょうか。
この場合、答えとしては「water1 = 100 を3回使う」すなわち、「3」または[100,100,100]となるのではないでしょうか?
一方、もし「[100, 150, 200, 250, 300]」という答えがあっているならば、問題文は「与えられた容量の異なる2つのコップがある。このコップにそれぞれ満杯に水をいれ、与えられた容器が満杯になるまで注いでいった場合の各回における容器に入っている水の容量のパターンをすべて列挙せよ。ただし、何も注がない(0ミリリットル)パターンは答えから除外する」というような問題となるはずです。
そもそも、質問者さんは問題をきちんと理解しているのでしょうか?
質問文に書かれた答えは、あっているのでしょうか?
「リファクタリング」は金を出せばクラウドソーシングでアルバイトしている質問者よりも(恐らくちょっと上)初心者がやってくれると思いますよ。探してみては?
まず、皆様に誤解を与えるような質問を投稿してしまい大変申し訳ございませんでした。
初めに断っておきますと学校の課題ではありません。
もともとこれは、Atcoderというサイトの問題を細かく考えようとして作り出した私のオリジナルです。
https://atcoder.jp/contests/abc074/tasks/arc083_a?lang=ja
↑元の問題
上の問題がレベルの低い私にとって難しく、一筋縄ではいかなかったので、write upを探しました。
https://scrapbox.io/pocala-kyopro/C_-_Sugar_Water
↑その時読んだ記事
上の記事を読んで、「水を先に全部作るプログラミング」ってどうやって書くんだろう。と思い、試行錯誤しながら一生懸命つくりました。でも、自分のコードに自信がないので、「もっと綺麗に書けるのでは?」と思いました。しかし、私は学生でもないですし、職業もプログラマーとまったく関係ありません。身の回りにプログラマーは一人もいません。なので、私よりもたくさん優れたプログラマーがたくさんいるteratailに質問してみれば何かヒントを得られるかもしれない。ということで、作ったコードを質問しました。
学生が課題を面倒くさがって、teratailに問題を丸投げしているならそれは怠惰であり、プログラマーとして成長しにくいと思います。
しかし、私は自分のコードをより良くしたい、私はこのアプローチで問題に取り組んでみたけど、もっと違うの視点からの良いアプローチがあるのではないか、という動機で質問させていただきました。
hogeee様、状況理解しました。そのような背景を記述いただくと、ありがたいです。
回答2件
あなたの回答
tips
プレビュー