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 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 недійсне!

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

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

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

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

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