teratail
質問するログイン新規登録

Q&A

解決済

2回答

1139閲覧

python リファクタリングをお願いします。

hogeee

総合スコア27

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/11/01 11:40

編集NaN/aN/aN aN:aN

0

1

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]からこぼれないように繰り返した時、できるだけ多くのパターンをつくり、その時のコップの中身を出力します。

もっとスッキリまとまる気がするのですが、リファクタリングするとしたらどのようになるでしょうか?
よろしくお願いいたします。

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

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

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

toast-uz

2020/11/01 12:15

学校の課題か何かでしょうか?少し不自然な質問に感じました。 「学校の課題を解いてほしい等の質問は、具体的にプログラミングで困っている質問ではないと考え、推奨していません。」by teratail
sfdust

2020/11/01 22:47 編集

基本的なところについて質問します。 「水の容量をできるだけ細かく刻んで入れた場合の総数を求めるコードです。」という問題なのに、答えが質問文に記載されているようになる意味が分かりません。 「できるだけ」「細かく刻んで」という文面を素直にとらえるならば、「与えられた2つのコップのいずれかまたは両方を使って、そのコップに満杯の水を入れ、与えられた容器に、容器の総計量(問題文の場合は300ミリリットル)まで水を注ぐとき(コップを容器に注ぐときに「1回」とする)、なるべくその回数が多くなるようにせよ」というような意味になるのではないでしょうか。 この場合、答えとしては「water1 = 100 を3回使う」すなわち、「3」または[100,100,100]となるのではないでしょうか? 一方、もし「[100, 150, 200, 250, 300]」という答えがあっているならば、問題文は「与えられた容量の異なる2つのコップがある。このコップにそれぞれ満杯に水をいれ、与えられた容器が満杯になるまで注いでいった場合の各回における容器に入っている水の容量のパターンをすべて列挙せよ。ただし、何も注がない(0ミリリットル)パターンは答えから除外する」というような問題となるはずです。 そもそも、質問者さんは問題をきちんと理解しているのでしょうか? 質問文に書かれた答えは、あっているのでしょうか?
hentaiman

2020/11/01 15:34

「リファクタリング」は金を出せばクラウドソーシングでアルバイトしている質問者よりも(恐らくちょっと上)初心者がやってくれると思いますよ。探してみては?
hogeee

2020/11/01 18:39

まず、皆様に誤解を与えるような質問を投稿してしまい大変申し訳ございませんでした。 初めに断っておきますと学校の課題ではありません。 もともとこれは、Atcoderというサイトの問題を細かく考えようとして作り出した私のオリジナルです。 https://atcoder.jp/contests/abc074/tasks/arc083_a?lang=ja ↑元の問題 上の問題がレベルの低い私にとって難しく、一筋縄ではいかなかったので、write upを探しました。 https://scrapbox.io/pocala-kyopro/C_-_Sugar_Water ↑その時読んだ記事 上の記事を読んで、「水を先に全部作るプログラミング」ってどうやって書くんだろう。と思い、試行錯誤しながら一生懸命つくりました。でも、自分のコードに自信がないので、「もっと綺麗に書けるのでは?」と思いました。しかし、私は学生でもないですし、職業もプログラマーとまったく関係ありません。身の回りにプログラマーは一人もいません。なので、私よりもたくさん優れたプログラマーがたくさんいるteratailに質問してみれば何かヒントを得られるかもしれない。ということで、作ったコードを質問しました。 学生が課題を面倒くさがって、teratailに問題を丸投げしているならそれは怠惰であり、プログラマーとして成長しにくいと思います。 しかし、私は自分のコードをより良くしたい、私はこのアプローチで問題に取り組んでみたけど、もっと違うの視点からの良いアプローチがあるのではないか、という動機で質問させていただきました。
toast-uz

2020/11/01 22:55

hogeee様、状況理解しました。そのような背景を記述いただくと、ありがたいです。
guest

回答の取得に失敗しました

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

ただいまの回答率
%

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

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

質問する

関連した質問