f=lambda n,k=1:`k`in bin(n^n/2)and-~f(n,k*10)
ลองออนไลน์!
มันทำงานอย่างไร
โดย XORing nและn / 2 (หารด้วย2หลักสับปิดบิตสุดท้าย) เราได้รับจำนวนเต็มใหม่ม.ที่มีบิตล้างระบุการจับคู่บิตติดกันในn
ตัวอย่างเช่นถ้าn = 1337371เรามีดังต่อไปนี้
n = 1337371 = 101000110100000011011₂
n/2 = 668685 = 10100011010000001101₂
m = 1989654 = 111100101110000010110₂
สิ่งนี้จะช่วยลดภารกิจในการค้นหาศูนย์ที่ยาวที่สุด ตั้งแต่ฐานเป็นตัวแทนของจำนวนเต็มบวกเสมอเริ่มต้นด้วย1เราจะพยายามที่จะหาที่ยาวที่สุด10 *สตริงของตัวเลขที่ปรากฏในฐานเป็นตัวแทนของม. สามารถทำซ้ำได้
เตรียมkเป็น1 ทุกครั้งที่ฉถูกดำเนินการทดสอบครั้งแรกของเราถ้าแทนทศนิยมของkปรากฏในฐานเป็นตัวแทนของม. ถ้าเป็นเช่นนั้นเราคูณkด้วย10และเรียกfอีกครั้ง ถ้ามันไม่ได้รหัสไปทางขวาของand
ไม่ได้ดำเนินการและเราจะกลับเท็จ
bin(k)[3:]
การทำเช่นนี้ครั้งแรกที่เราคำนวณ ในตัวอย่างของbin(k)
ผลตอบแทน'0b111100101110000010110'
และที่จุดเริ่มต้นจะถูกลบด้วย0b1
[3:]
ตอนนี้-~
ก่อนที่จะโทร recursive เพิ่มขึ้นเท็จ / 0ครั้งเดียวสำหรับทุกครั้งฉเรียกว่าซ้ำ เมื่อ10 {J} ( 1ตามด้วยเจซ้ำของ0 ) ไม่ปรากฏอยู่ในฐานเป็นตัวแทนของk , ระยะที่ยาวที่สุดของศูนย์ในkมีความยาวJ - 1 เนื่องจากj - 1ศูนย์ติดต่อกันในkบ่งชี้ว่าjจับคู่บิตที่อยู่ติดกันในnผลลัพธ์ที่ต้องการคือjซึ่งเป็นสิ่งที่เราได้รับโดยการเพิ่มค่าเท็จ / 0รวมjครั้ง