Na Global Verification Authority, uma tarefa crítica acaba de ser confiada a você. Por toda a cidade, de compras on-line 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 garantir que esses números sejam válidos e livres de erros.
Um lote de identificadores acaba de chegar à sua mesa. Todos eles precisam passar no teste de Luhn para garantir que sejam legítimos. Se algum falhar, será marcado como inválido, evitando erros ou fraudes, como transações incorretas ou acesso não autorizado.
Você consegue garantir que isso seja feito do jeito certo? A integridade de muitos serviços depende de você.
Determine se um número de cartão de crédito é 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 sejam dígitos são proibidos.
4539 3195 0343 6467
O primeiro passo do algoritmo de Luhn é dobrar cada segundo dígito, começando da direita. Vamos dobrar
4539 3195 0343 6467
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ (double these)
Se dobrar o número resultar em um número maior que 9, subtraia 9 do produto. Os resultados da nossa duplicação:
8569 6195 0383 3437
Depois, some todos os dígitos:
8+5+6+9+6+1+9+5+0+3+8+3+3+4+3+7 = 80
Se a soma for divisível por 10, então o número é válido. Este número é válido!
8273 1232 7352 0569
Dobre os segundos dígitos, começando da direita
7253 2262 5312 0539
Some os dígitos
7+2+5+3+2+2+6+2+5+3+1+2+0+5+3+9 = 57
57 não é divisível por 10, então este número não é válido.
Crie sua conta no Exercism para aprender e dominar Erlang com 85 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!