Python: setでリファクタリング
PR

Python: setでリファクタリング

プログラミング
記事内に広告が含まれています。
スポンサーリンク

Web化したりクラウドで動かしたりとしてきましたが、Hit and Blowのプログラムをもう一度見直してみます。

スポンサーリンク

改良できるところ

とりあえず作って→イケてないところを直す。
という流れでやってきています。前回直したのは桁ごとの処理で、最後に

is_number_correct()とか、そもそもコンピュータが数字を決める処理は、まだまだ改良できるでしょう。

https://tech.blog.home.group.jp/lerning-python/python-stringfy

と残していたので、このis_number_correct()を直します。

スポンサーリンク

set()で使われている数字の集合を作る

今までのコードを見てみましょう。

一桁ずつ、他の桁と同じかどうかを見ています。ダラダラ並んでいて、スマートでない感じがします。同じ数字がないことをそのまま表しているのですが。

少し考えてみましょう。

同じ数字がないということは、各桁で使われている数字がバラバラ、異なっているということです。ということは、使われている数字の種類と、桁数が同じということです。
これをPythonで表現しましょう。

「使われている数字」という集合を作って、その要素の数を数えます。
「使っているか否かをTrue/Falseで表す配列を作って、4桁の数字を全部調べてからTrueの数を数える」というアプローチが先に思いつくかもしれませんが、True/Falseで判断するなら集合の要素か否かでも同じですね?
ということで、こんなコードになります。

結構すっきりしました。
「文字列を前から1文字ずつ取り出す」のはforで書けます。いちいちforとrange(len(文字列))を組み合わせる必要はないです。

今回の修正を行った結果のプログラムがこちら。

スポンサーリンク

次に直すとしたら?

これで、気になっていたところは直し終わりました。あとは、4桁の数字を当てるということであちこちに”4″と書いてあるので、そこでしょうか?5桁の数字を当てるように変えるとき、変更箇所が散らばっていて、直し漏れが発生しそうです。

5桁にすると難しくなりそうだな…。当てるまでにかかった時間も表示するようにすれば、もっと盛り上がるかな?


Python: 桁ごとに処理するなら文字列で扱うのがスマート

タイトルとURLをコピーしました