Suma de los dígitos de una cadena
Definir la función
sumaDigitos :: String -> Int
tal que sumaDigitos xs' es la suma de los dígitos de la cadena
xs`. Por ejemplo,
sumaDigitos "SE 2431 X" == 10
Definir la función
sumaDigitos :: String -> Int
tal que sumaDigitos xs' es la suma de los dígitos de la cadena
xs`. Por ejemplo,
sumaDigitos "SE 2431 X" == 10
Un número de Lychrel es un número para el que nunca se obtiene un capicúa mediante el proceso de invertir las cifras y sumar los dos números. Por ejemplo, los siguientes números no son números de Lychrel: + 56, ya que en un paso se obtiene un capicúa: 56+65=121. + 57, ya que en dos pasos se obtiene un capicúa: 57+75=132, 132+231=363 + 59, ya que en dos pasos se obtiene un capicúa: 59+95=154, 154+451=605, 605+506=1111 + 89, ya que en 24 pasos se obtiene un capicúa. En esta serie de ejercicios vamos a buscar el primer número de Lychrel.
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.
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úmero n
, en orden inverso. Por ejemplo,digitosInv 320274 == [4,7,2,0,2,3]
doblePosImpar ns
es la lista obtenida doblando los elementos de ns
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 de ns
. Por ejemplo,sumaDigitos [10,5,18,4] = 1 + 0 + 5 + 1 + 8 + 4 = = 19
ultimoDigito n
es el último dígito de n
. Por ejemplo,ultimoDigito 123 == 3 ultimoDigito 0 == 0
luhn n
se verifica si n
es un número de Luhn. Por ejemplo,luhn 5594589764218858 == True luhn 1234567898765432 == False
Definir la función
subconjuntos :: [a] -> [[a]]
tal que subconjuntos xs
es la lista de las subconjuntos de la lista xs
. Por ejemplo,
λ> subconjuntos [2,3,4] [[2,3,4],[2,3],[2,4],[2],[3,4],[3],[4],[]] λ> subconjuntos [1,2,3,4] [[1,2,3,4],[1,2,3],[1,2,4],[1,2],[1,3,4],[1,3],[1,4],[1], [2,3,4], [2,3], [2,4], [2], [3,4], [3], [4], []]
Comprobar con QuickChek que el número de elementos de subconjuntos xs
es 2 elevado al número de elementos de xs
.
Definir la función
producto :: [a] -> [b] -> [(a,b)]
tal que producto xs ys
es el producto cartesiano de xs
e ys
. Por
ejemplo,
producto [1,3] [2,4] == [(1,2),(1,4),(3,2),(3,4)]
Comprobar con QuickCheck que el número de elementos de producto xs y
es el producto del número de elementos de xs
y de ys
.
Definir la función
mayorExponente :: Integer -> Integer -> Integer
tal que mayorExponente a b
es el exponente de la mayor potencia de a
que divide a b
. Por ejemplo,
mayorExponente 2 8 == 3 mayorExponente 2 9 == 0 mayorExponente 5 100 == 2 mayorExponente 2 60 == 2
Nota: Se supone que a > 1 y b > 0.
Definir la función
listaNumero :: [Integer] -> Integer
tal que listaNumero xs
es el número formado por los dígitos xs
. Por ejemplo,
listaNumero [5] == 5 listaNumero [1,3,4,7] == 1347 listaNumero [0,0,1] == 1
Definir la función
sumaDigitos :: Integer -> Integer
tal que sumaDigitos n
es la suma de los dígitos de n
. Por ejemplo,
sumaDigitos 3 == 3 sumaDigitos 2454 == 15 sumaDigitos 20045 == 11
Definir la función
digitos :: Integer -> [Int]
tal que digitos n
es la lista de los dígitos del número n
. Por ejemplo,
digitos 320274 == [3,2,0,2,7,4]
Dados dos números naturales, a y b, es posible calcular su máximo común divisor mediante el Algoritmo de Euclides. Este algoritmo se puede resumir en la siguiente fórmula:
mcd(a,b) = a, si b = 0 = mcd (b, a módulo b), si b > 0
Definir la función
mcd :: Integer -> Integer -> Integer
tal que mcd a b
es el máximo común divisor de a
y b
calculado mediante el algoritmo de Euclides. Por ejemplo,
mcd 30 45 == 15 mcd 45 30 == 15
Comprobar con QuickCheck que el máximo común divisor de dos números a
y b
(ambos mayores que 0) es siempre mayor o igual que 1 y además es menor o igual que el menor de los números a
y b
.