El algoritmo de Luhn
El objetivo de este ejercicio es estudiar un algoritmo para validar algunos identificadores numéricos como los números de algunas tarjetas de crédito; por ejemplo, las de tipo Visa o Master Card.
El algoritmo que vamos a estudiar es el algoritmo de Luhn consistente en aplicar los siguientes pasos a los dígitos del número de la tarjeta.
- Se invierten los dígitos del número; por ejemplo, [9,4,5,5] se transforma en [5,5,4,9].
- Se duplican los dígitos que se encuentra en posiciones impares (empezando a contar en 0); por ejemplo, [5,5,4,9] se transforma en [5,10,4,18].
- Se suman los dígitos de cada número; por ejemplo, [5,10,4,18] se transforma en 5 + (1 + 0) + 4 + (1 + 8) = 19.
- Si el último dígito de la suma es 0, el número es válido; y no lo es, en caso contrario.
A los números válidos, se les llama números de Luhn.
Definir las siguientes funciones:
digitosInv :: Integer -> [Integer] doblePosImpar :: [Integer] -> [Integer] sumaDigitos :: [Integer] -> Integer ultimoDigito :: Integer -> Integer luhn :: Integer -> Bool
tales que
-
digitosInv n
es la lista de los dígitos del númeron
, en orden inverso. Por ejemplo,
digitosInv 320274 == [4,7,2,0,2,3]
-
doblePosImpar ns
es la lista obtenida doblando los elementos dens
en las posiciones impares (empezando a contar en cero y dejando igual a los que están en posiciones pares. Por ejemplo,
doblePosImpar [4,9,5,5] == [4,18,5,10] doblePosImpar [4,9,5,5,7] == [4,18,5,10,7]
-
sumaDigitos ns
es la suma de los dígitos dens
. Por ejemplo,
sumaDigitos [10,5,18,4] = 1 + 0 + 5 + 1 + 8 + 4 = = 19
-
ultimoDigito n
es el último dígito den
. Por ejemplo,
ultimoDigito 123 == 3 ultimoDigito 0 == 0
-
luhn n
se verifica sin
es un número de Luhn. Por ejemplo,
luhn 5594589764218858 == True luhn 1234567898765432 == False