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