mocchaso note

サーバーエンジニアが何か色々呟いているところ。

Python100本ノック 90本目~91本目(89本目~90本目)

Python100本ノック、90本目から91本目についてです。

qiita.com


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本頑張ります...!