f=lambda n,k=1:`k`in bin(n^n/2)and-~f(n,k*10)
Probieren Sie es online!
Wie es funktioniert
Durch XOR-Verknüpfung von n und n / 2 (Division durch 2 schneidet im wesentlichen das letzte Bit ab) erhalten wir eine neue Ganzzahl m, deren nicht gesetzte Bits übereinstimmende benachbarte Bits in n anzeigen .
Wenn beispielsweise n = 1337371 ist , haben wir Folgendes.
n = 1337371 = 101000110100000011011₂
n/2 = 668685 = 10100011010000001101₂
m = 1989654 = 111100101110000010110₂
Dies reduziert die Aufgabe, den längsten Lauf von Nullen zu finden. Da die Binärdarstellung einer positiven Ganzzahl immer mit einer 1 beginnt , versuchen wir, die längste 10 * -Ziffernfolge zu finden, die in der Binärdarstellung von m vorkommt . Dies kann rekursiv erfolgen.
Initialisiere k als 1 . Jedes Mal , wenn f ausgeführt wird, prüfen wir zuerst, ob die Dezimaldarstellung von k in der Binärdarstellung von m erscheint . In diesem Fall multiplizieren wir k mit 10 und rufen f erneut auf. Wenn dies nicht der Fall ist, wird der Code rechts von and
nicht ausgeführt und es wird False zurückgegeben .
Dazu berechnen wir zunächst bin(k)[3:]
. In unserem Beispiel wird bin(k)
zurückgegeben '0b111100101110000010110'
und das 0b1
am Anfang mit entfernt [3:]
.
Nun wird der -~
Wert vor dem rekursiven Aufruf jedes Mal, wenn f rekursiv aufgerufen wird, einmal auf False / 0 erhöht . Sobald 10 {j} ( 1 gefolgt von j Wiederholungen von 0 ) nicht in der binären Darstellung von k erscheint , hat der längste Lauf von Nullen in k die Länge j - 1 . Da j - 1 aufeinanderfolgende Nullen in k j übereinstimmende benachbarte Bits in n anzeigen , ist das gewünschte Ergebnis j , was wir durch Inkrementieren von False / 0 erhalteninsgesamt j mal.