Python100本ノック 90本目~91本目(89本目~90本目)
Python100本ノック、90本目から91本目についてです。
90本目:全て偶数だったらひたすら割るやつ
問題:渡辺君は、黒板に書かれている整数がすべて偶数であるとき、次の操作を行います。
-> 黒板に書かれている整数すべてを、2で割ったものに置き換える。
渡辺君は最大で何回操作を行うことができるかを求めてください。
条件:数字はリスト型で与えられる。
例:count_odd([16, 12, 24]) ==> 2
1回操作を行うと[8, 6, 12]になります。2回操作を行うと[4, 3, 6]になります。
2個目の3が奇数なため3回目の操作は行えません。
特に問題無く解けました。
自分の解法とQiita記事にある解法で少し方針が違ったので、以下に記載したいと思います。
自分の解法
リストの要素を順番に1回ずつ2で割り、ループする。
これを実現するために、再帰呼び出しを用いました。Qiita記事の解法
リストの要素1つを、割り切れなくなるまで繰り返し2で割り、ループする。
再帰呼び出しを使わなくて済むので、こちらの方が読みやすいですね。
また、Qiita記事に「map()
とかを使って...」という記述があったので挑戦してみました。
...何とかできました!
参考サイト:【Pythonステップアップ!】高階関数mapの便利な使い方 | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト
91本目:大きい数字からとるゲーム
問題:N枚のカードがあり、0~Nまでの整数が被らないように書かれています。
AliceとBobはこれらのカードを使ってゲームを行います。
ゲームでは2人が交互に1枚ずつカードを取っていきます。Aliceが先にカードを取ります。
カードが全て取られたらゲームは終了し、取ったカードの数の合計が各々の得点になります。
2人とも自分の得点を最大化するように最適戦略をとった時、
AliceはBobより何点多くの得点を獲得できるかを求めてください。
特に問題無く解けました。
リスト内包表記や辞書、if文の三項演算子など、
今までに出てきた技術を駆使してコードを短くすることができました!
前の問題に引き続き、+αに挑戦しました。
この問題では、1~100の整数がN枚(1~100枚)、ランダムに準備される点にあたります。
random.randrange(start, end, step)
をどう使うか少し考えましたが、無事に書けました。
参考サイト:Pythonでランダムな整数を生成するrandom.randrange, randint | note.nkmk.me
今回は、重ための文章問題2問に関する記事でした。
どちらも内容を読み解くのに少し時間がかかってしまいましたが、問題無く解けました!
+αに挑戦してクリアーしたり、コードを短くしたりして、実装力の向上を実感しています。
この調子であと10本頑張ります...!