У Глобальному управлінні з верифікації нам щойно доручили надзвичайно важливе завдання. У всьому місті, від онлайн-покупок до захищених входів, безліч операцій покладається на точність таких числових ідентифікаторів, як номери кредитних карток, номери банківських рахунків, коди транзакцій та ідентифікатори відстеження. В основі алгоритму Луна лежить проста формула контрольної суми, яка допомагає переконатися, що ці числа дійсні та безпомилкові.
Щойно на наш стіл надійшла партія ідентифікаторів. Усі вони повинні пройти перевірку Луна, щоб переконатися, що вони справжні. Якщо якийсь із них не пройде перевірку, його позначять як недійсний, що дасть змогу запобігти помилкам або шахрайству, як-от хибні транзакції чи несанкціонований доступ.
Чи вдасться нам зробити це правильно? Від нас залежить цілісність багатьох сервісів.
Визначмо, чи є номер кредитної картки коректним за формулою Луна.
Число надійде як рядок тексту (англ. string).
Рядки тексту завдовжки 1 символ або менше некоректні. Пробіли у вхідних даних допускаються, але перед перевіркою їх потрібно прибрати. Усі інші символи, які не є цифрами, заборонені.
4539 3195 0343 6467
Перший крок алгоритму Луна - подвоїти кожну другу цифру, починаючи справа. Будемо подвоювати
4539 3195 0343 6467
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ (double these)
Якщо в результаті подвоєння цифри утворюється число, більше за 9, тоді віднімаємо 9 від добутку. Ось результати нашого подвоєння:
8569 6195 0383 3437
Далі додамо всі цифри:
8+5+6+9+6+1+9+5+0+3+8+3+3+4+3+7 = 80
Якщо сума ділиться на 10 без остачі, то число коректне. Це число коректне!
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
57 не ділиться на 10 без остачі, тому це число некоректне.
Зареєструйтеся на Exercism, щоб вивчати й опановувати Scala, а також 95 вправ та справжнє наставництво від людей, і все це безкоштовно.
Ми розглядаємо 8 різних версій Luhn: починаємо з дуже охайної реалізації на Ruby, досліджуємо імперативні та функціональні підходи, а наприкінці доходимо до версії на SQLite, над розшифруванням якої Еріку та Джеремі довелося попрацювати!