Cuadrados ondulantes
Un número se dice ondulante si sus cifras alternan entre dos valores. Por ejemplo, 272 es ondulante, así como 2727. El primer cuadrado ondulante no trivial (todos los cuadrados de dos cifras son ondulantes) es 121 = 11^2.
Definir la función
1 |
cuadradosOndulantes :: Integer -> [Integer] |
tal que (cuadradosOndulantes n) es la lista de los cuadrados ondulantes menores que n^2. Por ejemplo,
1 2 |
λ> cuadradosOndulantes 50000 [0,1,4,9,16,25,36,49,64,81,121,484,676,69696] |
Nota: Este ejercicio ha sido propuesto por Marcos Giráldez.
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 |
import Data.List (isPrefixOf) cuadradosOndulantes :: Integer -> [Integer] cuadradosOndulantes n = [x^2 | x <- [0..n] , ondulante (x^2)] -- 1ª definición de ondulante ondulante1 :: Integer -> Bool ondulante1 n | n < 100 = True | otherwise = aux zs x y where (x:y:zs) = show n aux [] _ _ = True aux (c:cs) a b = c == a && aux cs b a -- 2ª definición de ondulante ondulante2 :: Integer -> Bool ondulante2 n = (drop 2 xs) `isPrefixOf` xs where xs = show n -- Comparación de eficiencia -- λ> length [n | n <- [1..10^6], ondulante1 n] -- 459 -- (5.73 secs, 1,115,105,408 bytes) -- λ> length [n | n <- [1..10^6], ondulante2 n] -- 459 -- (2.01 secs, 467,856,432 bytes) -- Se usará como ondulante la 2ª ondulante :: Integer -> Bool ondulante = ondulante2 |
Referencias
- Sucesión A016073 de la OEIS.
- Undulating number de Eric W. Weisstein en MathWorld.