Menu Close

Persistencia multiplicativa de un número

La persistencia multiplicativa de un número es la cantidad de pasos requeridos para reducirlo a una cifra multiplicando sus dígitos. Por ejemplo, la persistencia de 39 es 3 porque 3×9 = 27, 2×7 = 14 y 1×4 = 4.

Definir las funciones

   persistencia     :: Integer -> Integer
   menorPersistente :: Integer -> Integer

tales que

  • (persistencia x) es la persistencia de x. Por ejemplo,
     persistencia 39                             ==   3
     persistencia 2677889                        ==   8
     persistencia 26888999                       ==   9
     persistencia 3778888999                     ==  10
     persistencia 277777788888899                ==  11
     persistencia 77777733332222222222222222222  ==  11
  • (menorPersistente n) es el menor número con persistencia n. Por ejemplo,
     menorPersistente 0  ==  1
     menorPersistente 1  ==  10
     menorPersistente 2  ==  25
     menorPersistente 3  ==  39
     menorPersistente 4  ==  77
     menorPersistente 5  ==  679
     menorPersistente 6  ==  6788
     menorPersistente 7  ==  68889

Comprobar con QuickCheck si todos los números menores que 10^233 tienen una persistencia multiplicativa menor o igual que 11.

Nota: Este ejercicio ha sido propuesto por Marcos Giráldez.

Soluciones

import Test.QuickCheck
 
persistencia :: Integer -> Integer
persistencia x
  | x < 10    = 0
  | otherwise = 1 + persistencia (productoDigitos x)
 
productoDigitos :: Integer -> Integer
productoDigitos x 
  | x < 10    = x
  | otherwise = r * productoDigitos y
  where (y,r) = quotRem x 10
 
menorPersistente :: Integer -> Integer
menorPersistente n =
  head [x | x <- [1..]
          , persistencia x == n]
 
-- La propiedad es
prop_persistencia :: Integer -> Property
prop_persistencia x =
  x <= y ==> persistencia x <= 11
  where y = 10^233
 
-- La comprobación es
--    λ> quickCheck prop_persistencia
--    +++ OK, passed 100 tests.

Referencias

7 soluciones de “Persistencia multiplicativa de un número

  1. enrnarbej
    import Test.QuickCheck
    import Data.List
     
    digits :: Integer -> [Integer]
    digits n = [read [x] | x <- show n]
     
    persistencia :: Integer -> Integer
    persistencia n = snd (until ((x,y) -> x < 10) ((x,y) -> (product (digits x), y+1)) (n,0))
     
    menorPersistente :: Integer -> Integer
    menorPersistente n = head [x | x<-[1..], persistencia x == n]
     
    prop_persistencia :: Integer -> Property
    prop_persistencia n = n < 10^233 ==> persistencia n <= 11
     
    -- Prelude> quickCheck prop_persistencia
    -- +++ OK, passed 100 tests.
  2. Xopre (josrodgal7)
    persistencia     :: Integer -> Integer
    persistencia k = aux k 0
      where aux x n  | x <= 9 = n
              | otherwise = aux (productoDigitos x) (n+1)
     
    productoDigitos:: Integer -> Integer
    productoDigitos 0 = 1
    productoDigitos n = rem n 10 * productoDigitos (div n 10)
     
     
    menorPersistente :: Integer -> Integer
    menorPersistente n = head [ a | a <- [1..], persistencia a == n ]
     
    prop_pm :: Integer -> Property
    prop_pm n = n < 10^233 ==> persistencia n <= 11
  3. Chema Cortés
    import Data.List (genericLength)
    import Test.QuickCheck
     
    persistencia :: Integer -> Integer
    persistencia n = genericLength . takeWhile (>=10)
                   $ iterate (product . digitos) n
     
    menorPersistente :: Integer -> Integer
    menorPersistente n = head [x | x <- [1..], persistencia x == n]
     
    prop_persistencia :: Positive Integer -> Property
    prop_persistencia (Positive n) = n < 10^233 ==> persistencia n <= 11
     
     
    digitos :: Integer -> [Integer]
    digitos n = [read [c] | c <- show n]
  4. joscasgom1
     
    import Test.QuickCheck
     
    persistenciaR :: Integer -> Integer
    persistenciaR x = if length (show x) == 1 then 0 else(1+ (persistenciaR ( product (digitos x))))
     
    digitos :: Integer -> [Integer]
    digitos x = [read [x] | x <- show x]
     
    menorPersistencia :: Integer -> Integer
    menorPersistencia n = head [x | x <- [1..], persistenciaR x == n]
     
    prop_persistencia :: Integer -> Property
    prop_persistencia n = n < 10^233 ==> persistenciaR n <= 11
  5. margirmon
    persistencia :: Integer -> Integer
    persistencia x | x < 10      = 0
                   | otherwise   = 1 + persistencia (product (digitos x))
     
    digitos :: Integer -> [Integer]
    digitos xs = [read [x] | x <- (show xs)]
     
    menorPersistente :: Integer -> Integer
    menorPersistente x = head [n | n <- [1..], persistencia n == x]
  6. Juanjo Ortega (juaorture)
    -- DigitosR desde Relacion 5
    digitosR :: Integer -> [Integer]
    digitosR n = reverse (digitosR' n)
     
    digitosR' n
        | n < 10    = [n]
        | otherwise = (n `rem` 10) : digitosR' (n `div` 10)
     
    persistencia :: Integer -> Integer
    persistencia n = aux n 0
     
    aux :: Integer -> Integer -> Integer
    aux n m | length (show n) <= 1 = 0
            | otherwise            = 1 + aux (product (digitosR n)) (m+1)
     
    menorPersistente :: Integer -> Integer
    menorPersistente n = head [ a | a <- [1..]
                                  , persistencia a == n ]
    • Juanjo Ortega (juaorture)
       
      import Test.QuickCheck
       
      -- Ligeramente simplificado
       
      -- DigitosR desde Relacion 5
       
      digitosR :: Integer -> [Integer]
      digitosR n = reverse (digitosR' n)
       
      digitosR' n
          | n < 10    = [n]
          | otherwise = (n `rem` 10) : digitosR' (n `div` 10)
       
      persistencia :: Integer -> Integer
      persistencia n = aux n 0
       
      aux :: Integer -> Integer -> Integer
      aux n m | n < 10        = 0
              | otherwise            = 1 + aux (product (digitosR n)) (m+1)
       
      menorPersistente :: Integer -> Integer
      menorPersistente n = head [ a | a <- [1..]
                                    , persistencia a == n ]
       
      -- Propiedad para comprobación que faltaba
       
      prop_persistencia :: Integer -> Property
      prop_persistencia n = n > 0 && n < 10^233 ==> persistencia n <= 11
       
      -- *Main> quickCheck prop_persistencia
      -- +++ OK, passed 100 tests.

Escribe tu solución

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.