Luhn

Luhn

Середня

Вступ

Ми працюємо в 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 коректне!

Некоректний канадський SIN

Число для перевірки - 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 некоректне!

Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
YAMLScript Exercism

Час розпочати Luhn?

Зареєструйтеся на Exercism, щоб вивчати й опановувати YAMLScript, а також 60 вправ та справжнє наставництво від людей, і все це безкоштовно.

Глибоке занурення у Luhn!

Ми розглядаємо 8 різних версій Luhn: починаємо з дуже охайної реалізації на Ruby, досліджуємо імперативні та функціональні підходи, а наприкінці доходимо до версії на SQLite, над розшифруванням якої Еріку та Джеремі довелося попрацювати!