Na Global Verification Authority, você acaba de receber uma tarefa crítica. Por toda a cidade, de compras online a logins seguros, inúmeras operações dependem da exatidão de identificadores numéricos, como números de cartão de crédito, números de conta bancária, códigos de transação e IDs de rastreamento. O algoritmo de Luhn é uma fórmula simples de soma de verificação usada para ajudar a identificar números digitados incorretamente.
Um lote de identificadores acaba de chegar à sua mesa. Todos eles precisam passar no teste de Luhn para garantir que são legítimos. Se algum falhar, será sinalizado como inválido, evitando erros como transações incorretas ou verificações de conta que não deram certo.
Você consegue garantir que tudo isso seja feito corretamente? A integridade de muitos serviços depende de você.
Determine se um número é válido de acordo com a fórmula de Luhn.
O número será fornecido como uma string.
Strings de comprimento 1 ou menos não são válidas. Espaços são permitidos na entrada, mas devem ser removidos antes da verificação. Todos os outros caracteres que não forem dígitos não são permitidos.
O número a ser verificado é 4539 3195 0343 6467.
O primeiro passo do algoritmo de Luhn é começar pelo fim do número e dobrar cada segundo dígito, começando pelo segundo dígito da direita e seguindo para a esquerda.
4539 3195 0343 6467
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ (double these)
Se o resultado de dobrar um dígito for maior que 9, subtraímos 9 desse resultado. Ficamos com:
8569 6195 0383 3437
Por fim, somamos todos os dígitos. Se a soma for divisível por 10, o número original é válido.
8 + 5 + 6 + 9 + 6 + 1 + 9 + 5 + 0 + 3 + 8 + 3 + 3 + 4 + 3 + 7 = 80
80 é divisível por 10, então o número 4539 3195 0343 6467 é válido!
O número a ser verificado é 066 123 478.
Começamos pelo fim do número e dobramos cada segundo dígito, começando pelo segundo dígito da direita e seguindo para a esquerda.
066 123 478
↑ ↑ ↑ ↑ (double these)
Se o resultado de dobrar um dígito for maior que 9, subtraímos 9 desse resultado. Ficamos com:
036 226 458
Somamos os dígitos:
0 + 3 + 6 + 2 + 2 + 6 + 4 + 5 + 8 = 36
36 não é divisível por 10, então o número 066 123 478 não é válido!
Crie sua conta no Exercism para aprender e dominar Emacs Lisp com 96 exercícios e mentoria humana de verdade, tudo de graça.
Exploramos 8 versões diferentes de Luhn, começando com uma implementação em Ruby muito bem organizada, passando por algumas abordagens imperativas e funcionais, e terminando com uma versão em SQLite que deu trabalho para Erik e Jeremy decifrar!