Na Autoridade Global de Verificação, acabaram de te confiar uma missão crítica. Por toda a cidade, das compras online aos inícios de sessão 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 identificadores de rastreio. O algoritmo de Luhn é uma fórmula simples de soma de verificação, usada para garantir que estes números são válidos e estão livres de erros.
Acabou de chegar à tua secretária um lote de identificadores. Todos têm de passar no teste de Luhn para garantir que são legítimos. Se algum falhar, será marcado como inválido, evitando erros ou fraudes, como transações incorretas ou acessos não autorizados.
Consegues garantir que isto é feito como deve ser? A integridade de muitos serviços depende de ti.
Determina se um número de cartão de crédito é válido de acordo com a fórmula de Luhn.
O número é fornecido como uma string.
Strings de comprimento igual ou inferior a 1 não são válidas. Os espaços são permitidos na entrada, mas devem ser removidos antes da verificação. Todos os outros carateres que não sejam algarismos não são permitidos.
4539 3195 0343 6467
O primeiro passo do algoritmo de Luhn é duplicar cada segundo algarismo, começando pela direita. Vamos duplicar
4539 3195 0343 6467
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ (double these)
Se duplicar o algarismo resultar num número maior que 9, subtrai 9 ao produto. Os resultados da nossa duplicação:
8569 6195 0383 3437
Depois soma todos os algarismos:
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 sem resto, o número é válido. Este número é válido!
8273 1232 7352 0569
Duplica cada segundo algarismo, começando pela direita
7253 2262 5312 0539
Soma os algarismos
7+2+5+3+2+2+6+2+5+3+1+2+0+5+3+9 = 57
57 não é divisível por 10 sem resto, por isso este número não é válido.
Inscreve-te no Exercism para aprenderes e dominares Scala com 95 exercícios, e mentoria humana real, tudo grátis.
Exploramos 8 versões diferentes do Luhn, começando com uma implementação Ruby muito arrumada, passando por algumas abordagens imperativas e funcionais e acabando numa versão SQLite que deu algum trabalho ao Erik e ao Jeremy a decifrar!