f=lambda n,k=1:`k`in bin(n^n/2)and-~f(n,k*10)
Cobalah online!
Bagaimana itu bekerja
Dengan XORing n dan n / 2 (membaginya dengan 2 pada dasarnya memotong bit terakhir), kita mendapatkan bilangan bulat baru m yang bit-bit yang tidak diset menunjukkan bit-bit yang berdekatan yang cocok dengan n .
Misalnya, jika n = 1337371 , kami memiliki yang berikut ini.
n = 1337371 = 101000110100000011011₂
n/2 = 668685 = 10100011010000001101₂
m = 1989654 = 111100101110000010110₂
Ini mengurangi tugas untuk menemukan angka nol terpanjang. Karena representasi biner dari bilangan bulat positif selalu dimulai dengan angka 1 , kami akan mencoba mencari string angka 10 * terpanjang yang muncul dalam representasi biner dari m . Ini bisa dilakukan secara rekursif.
Inisialisasi k sebagai 1 . Setiap kali f dieksekusi, pertama-tama kita menguji apakah representasi desimal k muncul dalam representasi biner m . Jika ya, kita kalikan k dengan 10 dan panggil f lagi. Jika tidak, kode di sebelah kanan and
tidak dijalankan dan kami mengembalikan False .
Untuk melakukan ini, pertama-tama kita menghitung bin(k)[3:]
. Dalam contoh kami, bin(k)
pengembalian '0b111100101110000010110'
, dan 0b1
di awal dihapus dengan [3:]
.
Sekarang, -~
sebelum kenaikan rekursif panggilan False / 0 satu kali untuk setiap kali f disebut rekursif. Setelah 10 {j} ( 1 diikuti oleh pengulangan j dari 0 ) tidak muncul dalam representasi biner k , jangka panjang nol yang terpanjang dalam k memiliki panjang j - 1 . Karena j - 1 nol berurutan dalam k menunjukkan j yang cocok dengan bit yang berdekatan dalam n , hasil yang diinginkan adalah j , yang adalah apa yang kita peroleh dengan menambahkan False / 0total j kali.