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桁にすると難しくなりそうだな…。当てるまでにかかった時間も表示するようにすれば、もっと盛り上がるかな?