Ми працюємо в 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 478.
Починаємо з кінця числа й подвоюємо кожну другу цифру, починаючи з другої цифри справа і рухаючись вліво.
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, щоб вивчати й опановувати Python, а також 17 концепцій146 вправ та справжнє наставництво від людей, і все це безкоштовно.
Ми розглядаємо 8 різних версій Luhn: починаємо з дуже охайної реалізації на Ruby, досліджуємо імперативні та функціональні підходи, а наприкінці доходимо до версії на SQLite, над розшифруванням якої Еріку та Джеремі довелося попрацювати!