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 468 است.

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

066 123 478
 ↑  ↑ ↑  ↑  (double these)

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

036 226 458

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

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

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

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

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

در Exercism ثبت‌نام کنید تا YAMLScript را همراه با 60 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.

بررسی عمیق Luhn!

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