python; checkio日記

checkioを中心にpythonプログラミングの記録

Electric Station問題2 Hamming Distance

2進法での距離を求める問題。Hamming Distanceというらしい。 106 (219< 106 < 220) までを考慮したので良いということだったので、

def hamming_d(numb):    
    ans = []
    for i in reversed(range(0, 21)):
        if numb / 2**i >=1:
            ans.append(1)
            numb = numb - 2**i
        else:
            ans.append(0)
    return ans

def checkio(n,m):
    return sum([abs(x-y) for (x, y) in zip(hamming_d(n), hamming_d(m))])

今回は簡単だったと思ったが、いろいろ勉強になるやり方あり。 まず1つめ
returnで関数自体のループをするというやり方が個人的に新鮮
%があまりで//が商。同時に2で割っていく。

def checkio(a, b, distance=0):
    distance += a % 2 != b % 2
    a, b = a // 2, b // 2
    if a == b == 0:
        return distance
    return checkio(a, b, distance)

2つめ
bin(117) だと'0b1110101'というような値を返すbin関数を使用する。
そこまでは良いが、更に'^'
これはBitwise Exclusive Orといって排他的論理和を返す。

checkio = lambda n, m: bin(n ^ m).count("1")

驚愕!!
色々あるOperatorはこのページが参考になる。