「自作Python100本ノック」13日目です。
なんかC++用の良さげな問題を見つけたので、「これをPythonにちょこっと直せばいけるんじゃね?」
と思ってた時もありました。
まあ、何だかんだで解き、なんかとか2問だけgetすることが出来たのでこれで今日は乗り切ります。
さて、
「自作Python100本ノック」とはそもそも何ぞや?
どの程度のレベル感なのか?
どのように進めて行くのか?
など気になる方は詳しくはこちらに整理してありますのでまずはそちらを確認するようお願いします。
それでは始めていきます。
##Q89: 全て偶数だったらひたすら割るやつ
問題:
渡辺君は,黒板に書かれている整数がすべて偶数であるとき,次の操作を行います。
黒板に書かれている整数すべてを,2で割ったものに置き換える。
渡辺君は最大で何回操作を行うことができるかを求めてください。
条件:
数字はリスト型で与えられる。
例:
count_odd([16,12,24) ==> 2
1 回操作を行うと (8, 6, 12) になります。2 回操作を行うと (4, 3, 6) になります。2 個目の 3 が奇数なため 3 回目の操作は行えません。
個人的にwhile
の使い方に慣れてなく、考えるのに結構時間かかりました。。。
map()
とか使ってリスト内の数字を同時に2で割って、あまりの合計が0でなかったらみたいな式を作りたかったのですが、作れず。
def count_n(n_list):
counts = []
for n in n_list:
count = 0
while n % 2 == 0:
count += 1
n = n / 2
else:
counts.append(count)
aws = min(counts)
print(aws)
count_n([16,16,4])
[参考]B - Shift only
##Q90: 大きい数字からとるゲーム
問題:
N 枚のカードがあり、0 〜 N までの整数が被らないように書かれています。
Alice と Bob はこれらのカードを使ってゲームを行います。ゲームでは 2 人が交互に 1 枚ずつカードを取っていきます。Alice が先にカードを取ります。
2 人がすべてのカードを取ったときゲームは終了し、取ったカードの数の合計がその人の得点になります。
2 人とも自分の得点を最大化するように最適戦略をとったとき、Alice は Bob より何点多くの得点を獲得できるかを求めてください。
元の問題が解けなかったので、自分で解けるような問題に変えました。
本当は、カードの数字はランダムにしたかったのですが、うまくいかず結局カードの数字は「0 〜 N」というつまらない問題になってしまいました。
物足りたい人は、[参考]から元の問題を是非解いて見てください。(そして教えてください)
from numpy import random
def num_fight(card_number):
cards = list(range(card_number))
count = 0
alice_cards = []
bob_cards = []
while len(cards) != 0:
taken_card = max(cards)
cards.remove(taken_card)
count += 1
if count % 2 == 1:
alice_cards.append(taken_card)
else:
bob_cards.append(taken_card)
alice_score = sum(alice_cards)
bob_score = sum(bob_cards)
aws = alice_score - bob_score
print(aws)
num_fight(10)
##感想
早く終わらせようと1日10問やっていた時が信じられません。
問題自体は、AtCoderとかに死ぬほどあるんですがほぼほぼ競技プログラミング用の問題なので、自分としては実用性が皆無なんですよね。
それでもAtCoderから面白そうな問題を漁りまくるか、もうChekiOから問題持ってきちゃうか悩み中です。
ChekiOからラスト10問持ってくるのが現状ベストかなあ。
Twitterの方ではQiitaの記事に加え、エンジニア向けのニュースなどの共有といった活動もしているので、よろしければフォローお願いします(フォロバ100%)
それでは!
→ 14日目