f=lambda n,k=1:`k`in bin(n^n/2)and-~f(n,k*10)
Hãy thử trực tuyến!
Làm thế nào nó hoạt động
Bằng XORing n và n / 2 (chia cho 2 về cơ bản là cắt bỏ bit cuối cùng), chúng ta nhận được một số nguyên m mới có các bit không đặt cho biết các bit liền kề khớp với n .
Ví dụ: nếu n = 1337371 , chúng ta có như sau.
n = 1337371 = 101000110100000011011₂
n/2 = 668685 = 10100011010000001101₂
m = 1989654 = 111100101110000010110₂
Điều này làm giảm nhiệm vụ tìm kiếm số 0 dài nhất. Vì biểu diễn nhị phân của một số nguyên dương luôn bắt đầu bằng 1 , chúng tôi sẽ cố gắng tìm chuỗi 10 * chữ số dài nhất xuất hiện trong biểu diễn nhị phân của m . Điều này có thể được thực hiện đệ quy.
Khởi tạo k là 1 . Mỗi lần f được thực thi, trước tiên chúng ta kiểm tra xem biểu diễn thập phân của k xuất hiện trong biểu diễn nhị phân của m . Nếu có, chúng ta nhân k với 10 và gọi lại f . Nếu không, mã bên phải and
không được thực thi và chúng tôi trả về Sai .
Để làm điều này, trước tiên chúng tôi tính toán bin(k)[3:]
. Trong ví dụ của chúng tôi, bin(k)
trả về '0b111100101110000010110'
và 0b1
ở đầu được loại bỏ bằng [3:]
.
Bây giờ, -~
trước cuộc gọi đệ quy tăng Sai / 0 một lần cho mỗi lần f được gọi đệ quy. Khi 10 {j} ( 1 theo sau là j lặp lại 0 ) không xuất hiện trong biểu diễn nhị phân của k , chuỗi số 0 dài nhất trong k có độ dài j - 1 . Vì j - 1 số 0 liên tiếp trong k chỉ ra j khớp với các bit liền kề trong n , kết quả mong muốn là j , đó là những gì chúng ta thu được bằng cách tăng Sai / 0tổng cộng j lần.