Luhn

Luhn

متوسط

مقدمه

در سازمان اعتبارسنجی جهانی، همین حالا مأموریتی مهم به شما سپرده شده است. در سراسر شهر، از خریدهای آنلاین تا ورودهای امن، عملیات بیشماری به درستی شناسه‌های عددی مانند شماره‌ی کارت‌های اعتباری، شماره‌ی حساب‌های بانکی، کدهای تراکنش و شناسه‌های رهگیری وابسته‌اند. الگوریتم 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

اگر مجموع بر ۱۰ بخش‌پذیر باشد، آن عدد معتبر است. این عدد معتبر است!

مثال ۲: شماره کارت اعتباری نامعتبر

8273 1232 7352 0569

ارقام را یک‌درمیان، با شروع از سمت راست، دو برابر کنید

7253 2262 5312 0539

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

7+2+5+3+2+2+6+2+5+3+1+2+0+5+3+9 = 57

۵۷ بر ۱۰ بخش‌پذیر نیست، پس این عدد معتبر نیست.

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

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

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

بررسی عمیق Luhn!

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