Menu Close

Sucesión de cuadrados reducidos

La sucesión de cuadrados de orden n definida a partir de un número x se forma iniciándola en x y, para cada término z el siguiente es el número formado por los n primeros dígitos del cuadrado de z. Por ejemplo, para n = 4 y x = 1111, el primer término de la sucesión es 1111, el segundo es 1234 (ya que 1111^2 = 1234321) y el tercero es 1522 (ya que 1234^2 = 1522756).

Definir la función

   sucCuadrados :: Int -> Integer -> [Integer]

tal que (sucCuadrados n x) es la sucesión de cuadrados de orden n definida a partir de x. Por ejemplo,

   λ> take 10 (sucCuadrados 4 1111)
   [1111,1234,1522,2316,5363,2876,8271,6840,4678,2188]
   λ> take 10 (sucCuadrados 3 457)
   [457,208,432,186,345,119,141,198,392,153]
   λ> take 20 (sucCuadrados 2 55)
   [55,30,90,81,65,42,17,28,78,60,36,12,14,19,36,12,14,19,36,12]

Soluciones

sucCuadrados :: Int -> Integer -> [Integer]
sucCuadrados n x = iterate (siguiente n) x
 
siguiente :: Int -> Integer -> Integer
siguiente n x = read (take n (show (x^2)))
Medio

4 soluciones de “Sucesión de cuadrados reducidos

  1. albcercid
    sucCuadrados :: Int -> Integer -> [Integer]
    sucCuadrados n x = x:sucCuadrados n (read $ take n $ show (x^2))
  2. paumacpar
    sucCuadrados :: Int -> Integer -> [Integer]
    sucCuadrados n x = x : sucCuadrados n (siguiente n x)
     
    siguiente :: Int -> Integer -> Integer
    siguiente n x = numero (take n (digitos (x*x)))
     
    digitos :: Integer -> [Integer]
    digitos x = [read [c] | c <- show x]
     
    numero :: [Integer] -> Integer
    numero xs = auxN (reverse xs)
     
    auxN :: [Integer] -> Integer
    auxN []     = 0
    auxN (x:xs) = x + 10 * (auxN xs)
  3. Chema Cortés
    sucCuadrados :: Int -> Integer -> [Integer]
    sucCuadrados n = iterate (nDigitos n . (^2))
      where nDigitos m = read . take m . show
  4. enrnarbej
    import Data.List (foldl')
     
    sucCuadrados :: Int -> Integer -> [Integer]
    sucCuadrados n x =
      iterate (x -> fromDigits (take n (digits (x^2)))) x
     
    fromDigits :: [Integer] -> Integer
    fromDigits xs = foldl' (x y -> 10*x + y) 0 xs
     
    digits :: Integer -> [Integer]
    digits n = [read [x] | x <- show n]

Escribe tu solución

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