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が付くのか。