Luhn

Luhn

متوسط

مقدمه

در سازمان تأیید جهانی، همین حالا مأموریت مهمی به شما سپرده شده است. در سراسر شهر، از خریدهای آنلاین تا ورودهای امن، بی‌شمار عملیات به دقت شناسه‌های عددی مانند شماره‌های کارت اعتباری، شماره‌های حساب بانکی، کدهای تراکنش و شناسه‌های رهگیری وابسته‌اند. الگوریتم لوهن یک فرمول ساده‌ی جمع کنترلی است که به شناسایی اعدادی که اشتباه تایپ شده‌اند کمک می‌کند.

دسته‌ای از شناسه‌ها تازه روی میز شما رسیده است. همه‌ی آن‌ها باید در آزمون لوهن قبول شوند تا معتبر بودنشان تضمین شود. اگر هر کدام رد شوند، به عنوان نامعتبر علامت‌گذاری می‌شوند و این کار از اشتباهاتی مانند تراکنش‌های نادرست یا تأییدهای ناموفق حساب جلوگیری می‌کند.

می‌توانید مطمئن شوید که این کار درست انجام می‌شود؟ یکپارچگی بسیاری از سرویس‌ها به شما بستگی دارد.

دستورالعمل‌ها

تعیین کنید که آیا یک عدد بر اساس فرمول لان معتبر است یا نه.

عدد به‌صورت یک رشته در اختیار شما قرار می‌گیرد.

اعتبارسنجی یک عدد

رشته‌هایی با طول ۱ یا کمتر معتبر نیستند. فاصله‌ها در ورودی مجازند، اما باید پیش از بررسی حذف شوند. تمام نویسه‌های غیررقمی دیگر مجاز نیستند.

مثال‌ها

شماره‌ی کارت اعتباری معتبر

عددی که باید بررسی شود 4539 3195 0343 6467 است.

اولین گام الگوریتم لان این است که از انتهای عدد شروع کنید و هر رقم دوم را دو برابر کنید، با شروع از رقم دوم از سمت راست و حرکت به سمت چپ.

4539 3195 0343 6467
↑ ↑  ↑ ↑  ↑ ↑  ↑ ↑  (double these)

اگر نتیجه‌ی دو برابر کردن یک رقم بزرگ‌تر از ۹ باشد، ۹ را از آن نتیجه کم می‌کنیم. به این نتیجه می‌رسیم:

8569 6195 0383 3437

در پایان، همه‌ی ارقام را جمع می‌کنیم. اگر مجموع بر ۱۰ بخش‌پذیر باشد، عدد اصلی معتبر است.

8 + 5 + 6 + 9 + 6 + 1 + 9 + 5 + 0 + 3 + 8 + 3 + 3 + 4 + 3 + 7 = 80

۸۰ بر ۱۰ بخش‌پذیر است، پس عدد 4539 3195 0343 6467 معتبر است!

شماره‌ی بیمه‌ی اجتماعی نامعتبر کانادا

عددی که باید بررسی شود 066 123 478 است.

از انتهای عدد شروع می‌کنیم و هر رقم دوم را دو برابر می‌کنیم، با شروع از رقم دوم از سمت راست و حرکت به سمت چپ.

066 123 478
 ↑  ↑ ↑  ↑  (double these)

اگر نتیجه‌ی دو برابر کردن یک رقم بزرگ‌تر از ۹ باشد، ۹ را از آن نتیجه کم می‌کنیم. به این نتیجه می‌رسیم:

036 226 458

ارقام را جمع می‌کنیم:

0 + 3 + 6 + 2 + 2 + 6 + 4 + 5 + 8 = 36

۳۶ بر ۱۰ بخش‌پذیر نیست، پس عدد 066 123 478 معتبر نیست!

ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Common Lisp Exercism

آماده‌اید Luhn را شروع کنید؟

در Exercism ثبت‌نام کنید تا Common Lisp را همراه با 27 مفهوم92 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.

بررسی عمیق Luhn!

ما ۸ نسخه‌ی مختلف از Luhn را بررسی می‌کنیم؛ با یک پیاده‌سازی بسیار مرتب در Ruby شروع می‌کنیم، چند رویکرد دستوری و تابعی را می‌بینیم و در پایان به نسخه‌ای با SQLite می‌رسیم که رمزگشایی آن برای اریک و جرمی کمی وقت برد!