En la Global Verification Authority, acabas de recibir una misión crítica. Por toda la ciudad, desde las compras en línea hasta los inicios de sesión seguros, innumerables operaciones dependen de la exactitud de identificadores numéricos como números de tarjetas de crédito, números de cuentas bancarias, códigos de transacción e identificadores de seguimiento. El algoritmo de Luhn es una fórmula simple de suma de verificación que se usa para asegurar que estos números sean válidos y estén libres de errores.
Acaba de llegar a tu escritorio un lote de identificadores. Todos deben pasar la prueba de Luhn para garantizar que son legítimos. Si alguno no la pasa, se marcará como no válido, lo que evita errores o fraudes, como transacciones incorrectas o accesos no autorizados.
¿Puedes asegurarte de que esto se haga bien? La integridad de muchos servicios depende de ti.
Determina si un número de tarjeta de crédito es válido según la fórmula de Luhn.
El número se proporcionará como un string.
Los strings de longitud 1 o menos no son válidos. Se permiten espacios en la entrada, pero deben eliminarse antes de comprobar. No se permite ningún otro carácter que no sea un dígito.
4539 3195 0343 6467
El primer paso del algoritmo de Luhn es duplicar cada segundo dígito, empezando por la derecha. Vamos a duplicar
4539 3195 0343 6467
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ (double these)
Si al duplicar el número se obtiene un número mayor que 9, resta 9 al producto. Estos son los resultados de nuestro duplicado:
8569 6195 0383 3437
Luego suma todos los dígitos:
8+5+6+9+6+1+9+5+0+3+8+3+3+4+3+7 = 80
Si la suma es divisible entre 10, el número es válido. ¡Este número es válido!
8273 1232 7352 0569
Duplica los segundos dígitos, empezando por la derecha
7253 2262 5312 0539
Suma los dígitos
7+2+5+3+2+2+6+2+5+3+1+2+0+5+3+9 = 57
57 no es divisible entre 10, así que este número no es válido.
Regístrate en Exercism para aprender y dominar Scala con 95 ejercicios y mentoría humana real, todo gratis.
Exploramos 8 versiones diferentes de Luhn, comenzando con una implementación de Ruby muy pulcra, explorando algunos enfoques imperativos y funcionales, y terminando con una versión en SQLite que a Erik y Jeremy les costó algo de trabajo descifrar.