في هيئة التحقق العالمية، أُسنِدت إليك للتو مهمة بالغة الأهمية. في كل أنحاء المدينة، ومن عمليات الشراء عبر الإنترنت إلى تسجيلات الدخول الآمنة، تعتمد عمليات لا تُحصى على دقة المعرّفات الرقمية مثل أرقام بطاقات الائتمان، وأرقام الحسابات المصرفية، ورموز المعاملات، ومعرّفات التتبع. وخوارزمية 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 لتتعلّم وتتقن Clojure عبر 12 مفهومًا105 تمارين، وإرشاد بشري حقيقي، وكل ذلك مجانًا.
نستكشف 8 نسخ مختلفة من Luhn، بدءًا من تطبيق Ruby أنيق للغاية، ومرورًا ببعض الأساليب الأمرية والوظيفية، وانتهاءً بنسخة SQLite استغرق فكّها بعض الجهد من Erik و Jeremy!