पायथन 2 , 46 45 बाइट्स
f=lambda n,k=1:`k`in bin(n^n/2)and-~f(n,k*10)
इसे ऑनलाइन आज़माएं!
यह काम किस प्रकार करता है
XORing n और n / 2 द्वारा ( 2 बिट द्वारा अनिवार्य रूप से अंतिम बिट को काटते हुए), हमें एक नया पूर्णांक m मिलता है, जिसके अशोधित बिट्स n में आसन्न बिट्स से मेल खाते हैं ।
उदाहरण के लिए, यदि n = 1337371 , हमारे पास निम्नलिखित हैं।
n = 1337371 = 101000110100000011011₂
n/2 = 668685 = 10100011010000001101₂
m = 1989654 = 111100101110000010110₂
यह सबसे लंबे समय तक चलने वाले शून्य को खोजने के लिए कार्य को कम करता है। चूंकि सकारात्मक पूर्णांक का बाइनरी प्रतिनिधित्व हमेशा 1 से शुरू होता है , इसलिए हम मी के बाइनरी प्रतिनिधित्व में दिखाई देने वाले अंकों के सबसे लंबे 10 * स्ट्रिंग को खोजने का प्रयास करेंगे । यह पुनरावर्ती रूप से किया जा सकता है।
प्रारंभ k के रूप में 1 । हर बार f निष्पादित होने पर, हम पहले परीक्षण करते हैं कि क्या k का दशमलव प्रतिनिधित्व m के बाइनरी प्रतिनिधित्व में दिखाई देता है । यदि ऐसा है, हम गुणा k द्वारा 10 और कॉल च फिर से। यदि ऐसा नहीं होता है, तो सही के कोड को and
निष्पादित नहीं किया जाता है और हम गलत वापस कर देते हैं ।
ऐसा करने के लिए, हम पहले गणना करते हैं bin(k)[3:]
। हमारे उदाहरण में, bin(k)
रिटर्न '0b111100101110000010110'
, और 0b1
शुरुआत में इसके साथ हटा दिया जाता है [3:]
।
अब, -~
पुनरावर्ती कॉल में वृद्धि से पहले हर बार f के लिए एक बार गलत / 0 पुनरावृत्ति कहा जाता है। एक बार जब 10 {j} ( 1 के बाद जे की पुनरावृत्ति 0 ) की बाइनरी प्रतिनिधित्व में प्रकट नहीं होता कश्मीर , में शून्य की सबसे लंबे समय तक रन कश्मीर लंबाई है j - 1 । चूँकि j - 1 लगातार शून्य में k का संकेत j से समीपवर्ती बिट्स n में मिलता है , वांछित परिणाम j है , जिसे हम गलत / 0 बढ़ाकर प्राप्त करते हैं।कुल j समय।