Global Verification Authority में आपको अभी-अभी एक बहुत महत्वपूर्ण काम सौंपा गया है। पूरे शहर में, ऑनलाइन खरीदारी से लेकर सुरक्षित लॉगिन तक, अनगिनत काम क्रेडिट कार्ड नंबर, बैंक खाता नंबर, ट्रांज़ैक्शन कोड और ट्रैकिंग ID जैसी संख्यात्मक पहचानों की सटीकता पर निर्भर करते हैं। Luhn एल्गोरिदम एक आसान चेकसम फॉर्मूला है, जो गलती से टाइप हुए नंबरों को पहचानने में मदद करता है।
आपकी मेज़ पर पहचानकर्ताओं का एक ढेर अभी पहुँचा है। इन सभी को Luhn की जाँच पास करनी होगी, ताकि पक्का हो सके कि ये वैध हैं। अगर कोई इनमें से जाँच पास न कर पाए, तो उसे अमान्य बता दिया जाएगा। इससे गलत ट्रांज़ैक्शन होना या खाते का सत्यापन न हो पाना जैसी गलतियों से बचा जा सकेगा।
क्या आप यह काम ठीक से पूरा कर सकते हैं? कई सेवाओं की विश्वसनीयता आप पर निर्भर है।
पता कीजिए कि कोई संख्या Luhn सूत्र के अनुसार मान्य है या नहीं।
यह संख्या एक स्ट्रिंग के रूप में दी जाएगी।
जिन स्ट्रिंग की लंबाई 1 या उससे कम है, वे मान्य नहीं होतीं। इनपुट में स्पेस की अनुमति है, लेकिन जाँचने से पहले उन्हें हटा देना चाहिए। इसके अलावा बाकी सभी गैर-अंकीय अक्षरों की अनुमति नहीं है।
जाँची जाने वाली संख्या 4539 3195 0343 6467 है।
Luhn एल्गोरिदम का पहला चरण यह है कि संख्या के अंत से शुरू कीजिए और दाएँ से दूसरे अंक से आरंभ करते हुए बाएँ की ओर बढ़ते हुए हर दूसरे अंक को दोगुना कीजिए।
4539 3195 0343 6467
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ (double these)
अगर किसी अंक को दोगुना करने पर परिणाम 9 से अधिक आता है, तो उस परिणाम में से 9 घटा दीजिए। तब हमें यह मिलता है:
8569 6195 0383 3437
अंत में, हम सभी अंकों का जोड़ करते हैं। अगर जोड़ 10 से पूरा-पूरा विभाजित हो जाता है, तो मूल संख्या मान्य है।
8 + 5 + 6 + 9 + 6 + 1 + 9 + 5 + 0 + 3 + 8 + 3 + 3 + 4 + 3 + 7 = 80
80, 10 से पूरा-पूरा विभाजित हो जाता है, इसलिए संख्या 4539 3195 0343 6467 मान्य है!
जाँची जाने वाली संख्या 066 123 478 है।
हम संख्या के अंत से शुरू करते हैं और दाएँ से दूसरे अंक से आरंभ करते हुए बाएँ की ओर बढ़ते हुए हर दूसरे अंक को दोगुना करते हैं।
066 123 478
↑ ↑ ↑ ↑ (double these)
अगर किसी अंक को दोगुना करने पर परिणाम 9 से अधिक आता है, तो उस परिणाम में से 9 घटा दीजिए। तब हमें यह मिलता है:
036 226 458
हम अंकों का जोड़ करते हैं:
0 + 3 + 6 + 2 + 2 + 6 + 4 + 5 + 8 = 36
36, 10 से पूरा-पूरा विभाजित नहीं होता, इसलिए संख्या 066 123 478 मान्य नहीं है!
Exercism पर साइन अप कीजिए और Emacs Lisp को 96 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।
हम Luhn के 8 अलग-अलग वर्शन देखते हैं। शुरुआत एक बहुत करीने से लिखी Ruby इम्प्लीमेंटेशन से होती है, फिर कुछ इम्पेरेटिव और फंक्शनल तरीके देखते हैं, और अंत में एक SQLite वर्शन पर पहुँचते हैं, जिसे समझने में Erik और Jeremy को काफी मेहनत लगी!