Ми працюємо в Global Verification Authority, і нам щойно доручили критично важливе завдання. По всьому місту, від онлайн-покупок до захищених входів, безліч операцій залежить від точності числових ідентифікаторів, як-от номери кредитних карток, номери банківських рахунків, коди транзакцій і номери відстеження. Алгоритм Луна - проста формула контрольної суми, яка допомагає виявити числа, введені з одруківкою.
Щойно на наш стіл надійшла партія ідентифікаторів. Усі вони мають пройти тест Луна, щоб підтвердити, що вони справжні. Якщо якийсь із них не пройде, його позначать як недійсний, і це допоможе уникнути помилок, як-от хибних транзакцій чи невдалих перевірок рахунків.
Чи зможемо ми зробити це як слід? Від нас залежить надійність багатьох сервісів.
Визначмо, чи є число коректним за формулою Луна.
Число надійде як рядок тексту (англ. string).
Рядки тексту завдовжки 1 символ або менше некоректні. Пробіли у вхідних даних допускаються, але перед перевіркою їх потрібно прибрати. Усі інші символи, які не є цифрами, заборонені.
Число для перевірки - 4539 3195 0343 6467.
Перший крок алгоритму Луна - почати з кінця числа і подвоїти кожну другу цифру, починаючи з другої цифри справа і рухаючись вліво.
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, над розшифруванням якої Еріку та Джеремі довелося попрацювати!