「自作Python100本ノック」14日目です。
ついに、ラスト10問に入りました。
いやあああ。長かった。
論理関数の講義の時間に思いつきでやろうと思ったあの日が懐かしいです。
(そういえばあの日以降、1回も出席してないな。。)
30本目あたりの時が1番辛く、そこからはなんか無心でした。
みたいな感じで、本当は今日を最終日にするはずだったんですが、
問題を集められず。。。(本日5問です)
明日こそ最終日です!
さて、
「自作Python100本ノック」とはそもそも何ぞや?
どの程度のレベル感なのか?
どのように進めて行くのか?
など気になる方は詳しくはこちらに整理してありますのでまずはそちらを確認するようお願いします。
それでは始めていきます。
Q91: 1を何回書いたか
問題:
高橋君は 1 以上 N 以下のすべての整数を10進表記で1回ずつ紙に書きました。
この作業で、高橋君は 1 という数字を何個書いたでしょうか。
    
def count_one(n):
    counts = 0
    for i in range(1,n+1):
        str_i = str(i)
        count = str_i.count("1")
        counts += count
    return counts
        
        
        
count_one(100)
[出典]D - 1
Q92: リモコン
問題文:
高橋君は、エアコンの設定温度を変更しようとしています。
現在の設定温度は A 度ですが、これを B 度に設定したいと思っています。
エアコンのリモコンは 1 回ボタンを押すことで、
1 度設定温度を下げる、もしくは上げる
5 度設定温度を下げる、もしくは上げる
10 度設定温度を下げる、もしくは上げる
の、6 種類の操作のいずれか 1 つを実行することが出来ます。
高橋君が設定温度を A 度から B 度に変更するために押すボタンの最小回数を求めなさい。
    
def remocon(a,b):
    target = b - a
    min_count = 100
    for o in range(100):
        for f in range(100):
            for t in range(100):
                if o + 5 * f + 10 * t == target or  -1 * o + -5 * f + -10 * t == target:
                    count = o + f + t
                    if min_count > count:
                        min_count = count
                        a_o = o
                        a_f = f
                        a_t = t
     
    print(a_o, a_f, a_t)
    
remocon(10,5)
[出典]リモコン
Q93: 高橋くんと魔法の箱
問題:
高橋くんは魔法の箱を持っています。
この箱に整数を入れるとそれに対応した整数が出てきます。
出てくる整数は入れた整数だけによって決まり、同じ整数を入れると毎回同じ結果が得られます。
高橋くんは任意の整数 x について、x を入れた時と 2x を入れた時に出てくる整数が同じであることに気づきました。
高橋くんが入れた整数が N 個与えられるので、最大で何種類の整数が出てくるか答えてください。
問題文をいかに読み取ることができるかが鍵になりますね。
    
ans = set([])
for i in l:
    while i % 2 == 0:
        i = i // 2
  
    ans.add(i)
print(len(ans))
[出典]高橋くんと魔法の箱
Q94: 123引き算ゲーム
問題:
最初に、数字 n が与えられます。
1 , 2 , 3 の中から好きな数字を選び、 与えられた数字に対し、引き算を行う、という処理を行うことできます。
この処理は 100 回まで行うことが可能であり、最終的に数字を 0 にすることが目標のゲームです。
しかし、計算途中でなってはいけないNG数字が 3 つ(リスト型で)与えられており、 この数字に一時的にでもなってしまった瞬間、このゲームは失敗となります。 NG数字が n と同じ場合も失敗となります。
あなたは、このゲームが、目標達成可能なゲームとなっているか調べたいです。
目標達成可能な場合はYES、そうでない場合はNOと出力してください。
    
def substract_game(n, ng_words):
    count = 0
    flag = 0
    a = ng_words[0]
    b = ng_words[1]
    c = ng_words[2]
    while count < 100 and n != (a or b or c) and n >=4:
        if not (n-3 in ng_words):
            count += 1
            n = n-3
        elif not (n-2 in ng_words):
            count += 1
            n = n-2
        elif not (n-1 in ng_words):
            count += 1
            n = n-1
        else:
            flag = 0
            break
    
    if (n == 1 or n == 2 or n ==3) and count<=99:
        n = 0
        flag = 1
    
    if n > 0:
        flag = 0
    
    if flag == 1:
        print('YES')
    else:
        print('NO')
        
substract_game(100, [29,54,43])
[出典]C -123引き算
Q95: 割り切れる日付
問題:
高橋君は割り切れる日付が好きです。   
割り切れる日付とは、年÷月÷日の計算結果が整数になる日付のことです。
例えば今日の日付は 2012 年 5 月 2 日ですが、 2012÷5÷2=201.2 となり整数ではないので、今日の日付は割り切れる日付ではありません。
高橋君は割り切れる日付が好きでたまらないので、次の割り切れる日付を心待ちにして、毎日今日が割り切れる日付かどうかをチェックしてしまいます。   
彼に少しでも多くの仕事をしてもらうために、入力として与えられた日付以降で最初に来る割り切れる日付を求めなさい。   
ただし、入力として与えられた日付が割り切れる日付だった場合は、与えられた日付が答えになります。   
例:
check_date("2012/05/02")  ==> "2013/01/01"
   
from datetime import date, timedelta
def check_date(today):
    Y, M, D = [int(n) for n in today.split('/')]
    dt = date(Y, M, D)
    while True:
        if Y % M == 0 and (Y / M) % D == 0:
            break
        dt += timedelta(days=1)
        Y = dt.year
        M = dt.month
        D = dt.day
    
    print(dt.strftime('%Y/%m/%d'))
    
check_date("2017/05/11")
[出典]割り切れる日付
感想
あれれ、おかしいなあ今日を最終日のするはずだったんだけどなあ。。
用意した10個の問題が思ったより難しく、何個かボツになったのが原因だよなあ。
明日また足りなくなった分用意し直して、本当に100本目迎えるよう頑張ります!
それでは!
→15日目
