ひるあんどんブログ

色々なことに手を出してみるブログ

Binary count

ロボットにとって10進数は不便です。 彼らが"1"を数える必要があるとき、彼らのコンピュータ脳はその数の2進表現で1を数えたいです。 2進数について詳しくはここで読むことができます(訳注:日本語版)。

あなたにはある数が与えられます(正の整数)。 あなたはこれを2進表現に変換して、数の表記の中に1がいくつあるか数えてください。 例えば: 5 = 0b101は2つの1を含んでいます。したがって答えは2です。

ヒント(Tips): このタスクは2つの関数を使って簡単に解くことができます -- binと count。

入力: ある数、正の整数。

出力: 2進形式の1の個数、整数。

例:

checkio(4) == 1

checkio(15) == 4

checkio(1) == 1

checkio(1022) == 9

どのように使われるか: 数を2進数に変換する方法を学びます。コンピュータサイエンスの目的で役に立ちます。

事前条件: 0 < number ≤ 232

def checkio(number):
    data = str(bin(number))
    count = 0
    
    
    count += data.count('1')
    
    return count
    

#These "asserts" using only for self-checking and not necessary for auto-testing
if __name__ == '__main__':
    assert checkio(4) == 1
    assert checkio(15) == 4
    assert checkio(1) == 1
    assert checkio(1022) == 9

組み込み関数binは整数を二進数に変換する。
あとは、文字列に変換して文字列中に部分文字列がいくつ含まれるかを調べることのできるcount関数を使う。
という解き方でときました。

clear一位


checkio=lambda n:bin(n).count('1')

あれ、countは文字列に変換する必要がないのか…。

str.count(sub[, start[, end]])¶(原文)

    [start, end] の範囲に、部分文字列 sub が重複せず出現する回数を返します。オプション引数 start および end はスライス表記と同じように解釈されます。

>>> d = 111111111111111111111111111111100000000000
>>> bin(d).count('1')
63

あら、本当だ。シークエンス型だったら、勝手に変換してくれるのかな。わからない。でも、str.countって書いてあるしなぁ…。
調べてもわからんかった。うーむ。なんでだろう。

>>> e = 5555555555555555555555555555555777777777777777
>>> bin(e).count('5')
0

おや? どうやら、数字一般に適用できるわけではないみたい。この解答は、vekyさんって人が書いたんだけどこの人、変態的なコードかくからなぁ。まぁ、いいや。countは文字列に使うってことにしよう。うん。例外がある以上、危険だし。