summer_tree_home

Check iOでPython3をマスターするぜっ

The Hamming Distance (Electronic Station) - ハミング距離

いつの間にかElectronic Stationの一問目として追加されていた問題。新作ではなく、古い問題のリニューアルのようだ。

どんな問題?

The Hamming Distance
http://www.checkio.org/mission/hamming-distance2/

2つの整数を二進数で表記した場合のハミング距離を求めよ。

ハミング距離については、Wikipediaを見よとある。日本語版もあった。
ようするに、各桁を比較して異なっている個数がハミング距離となるらしい。

例えば、

117 を二進数表記すると 01110101
 17 を二進数表記すると 00010001
     異なっているのは 01100100

よってハミング距離は3となる。

checkio(117, 17) == 3
checkio(1, 2) == 2
checkio(16, 15) == 5

どうやって解く?

問題文の通り、2つの数字を二進数に変換する。それを1文字ずつ比較して、違いをカウントすればいい。
または、上の例みたいに、XORを取ってから、1の数を数えてもいい。

10進数を2進数にするのってどうやるんだっけ?さくっと検索。→format(a, 'b')

>>> format(117, 'b')
'1110101'

XORはどうするんだっけ?検索検索っと。→ n^m

>>> format(117^17, 'b')
'1100100'

文字列に出てくる'1'を数えるには、.count('1')でOK。

というわけで、あっさり完成。

def checkio(n, m):
    return format(n ^ m, 'b').count('1')

他の人の答え

def checkio(n, m):
    return bin(n ^ m).count('1')

bin()でも2進数に変換できるみたいだ。

>>> bin(117)
'0b1110101'

formatと違って0bが付くのか。