Números bigenerados
Se dice que y es un generador de x si x es igual a la suma de y los dígitos de y. Por ejemplo, 1996 y 2014 son generadores de 2021 ya que
1 2 |
2021 = 1996 + 1 + 9 + 9 + 6 2021 = 2014 + 2 + 0 + 1 + 4 |
Un número bigenerado es un número que tiene exactamente 2 generadores. Por ejemplo,
- 2021 es un número bigenerados y sus generadores son 1996 y 2014
- 20 no es bigenerador porque no tiene ningún generador
- 21 no es bigenerador porque tiene sólo un generador (el 15).
- 101 es el menor número bigenerado ysus generadores son 91 y 100.
Definir las funciones
1 2 |
esBigenerado :: Integer -> Bool bigenerados :: [Integer] |
tales que
- (esBigenerado x) se verifica si x es bigenerado. Por ejemplo,
1 2 3 4 |
esBigenerado 2021 == True esBigenerado 20 == False esBigenerado 21 == False esBigenerado 101 == True |
- bigenerados es la lista de los números bigenerados. Por ejemplo,
1 2 |
λ> take 12 bigenerados [101,103,105,107,109,111,113,115,117,202,204,206] |
Comprobar con QuickCheck que la lista de los números bigenerados es infinita; es decir, para cualquier número positivo n existe un y mayor que x que es bigenerado.
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
import Test.QuickCheck (Property, (==>), quickCheck) esBigenerado :: Integer -> Bool esBigenerado x = length (generadores x) == 2 -- (generadores x) es la lista de los generadores de x. Por ejemplo, -- generadores 2021 == [1996,2014] -- generadores 20 == [] -- generadores 21 == [15] -- generadores 101 == [91,100] generadores :: Integer -> [Integer] generadores x = filter (esGenerador x) [1..x] -- (esGenerador x y) se verifica si y es un generador de x. Por ejemplo, -- esGenerador 818 796 == True -- esGenerador 818 805 == True esGenerador :: Integer -> Integer -> Bool esGenerador x y = x == y + sumaDigitos y -- (sumaDigitos n) es la suma de los dígitos de n. Por ejemplo, -- sumaDigitos 2021 == 5 sumaDigitos :: Integer -> Integer sumaDigitos = sum . digitos -- (digitos n) es la lista de los dígitos de n. Por ejemplo, -- digitos 2021 == [2,0,2,1] digitos :: Integer -> [Integer] digitos x = [read [c] | c <- show x] bigenerados :: [Integer] bigenerados = filter esBigenerado [1..] -- La propiedad es prop_bigenerados :: Integer -> Property prop_bigenerados n = n >= 0 ==> any esBigenerado [n+1..] -- La comprobación es -- λ> quickCheck prop_bigenerados -- +++ OK, passed 100 tests. |
Nuevas soluciones
- En los comentarios se pueden escribir nuevas soluciones.
- El código se debe escribir entre una línea con <pre lang="haskell"> y otra con </pre>