Sucesión de dígitos 0 y 1 alternados
Los primeros términos de la sucesión de los dígitos 0 y 1 alternados son
1 2 3 4 5 6 7 8 9 10 |
0 1 10 101 1010 10101 101010 1010101 10101010 101010101 |
Definir la lista
1 |
sucAlternada :: [Integer] |
tal que sus elementos son los términos de la sucesión de los dígitos 0 y 1 alternados. Por ejemplo,
1 2 3 4 |
λ> take 10 sucAlternada [0,1,10,101,1010,10101,101010,1010101,10101010,101010101] λ> length (show (sucAlternada !! (2*10^6))) 2000000 |
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 41 42 43 44 45 46 47 48 49 50 51 52 53 |
import Data.List (inits, unfoldr) -- 1ª solución -- =========== sucAlternada :: [Integer] sucAlternada = [read (take x aux) | x <- [1..]] where aux = '0' : '1' : aux -- 2ª solución -- =========== sucAlternada2 :: [Integer] sucAlternada2 = [read (take n (cycle "01")) | n <- [1..]] -- 3ª solución -- =========== sucAlternada3 :: [Integer] sucAlternada3 = 0 : [siguiente n | n <- sucAlternada3] siguiente :: Integer -> Integer siguiente x | even x = 10*x + 1 | otherwise = 10*x -- 3ª solución -- =========== sucAlternada4 :: [Integer] sucAlternada4 = 0 : map siguiente sucAlternada4 -- 5ª solución -- =========== sucAlternada5 :: [Integer] sucAlternada5 = map read ((tail . inits . concat . repeat) "01") -- 6ª solución -- =========== sucAlternada6 :: [Integer] sucAlternada6 = [(10 * 10^n - 1) `div` 99 | n <- [0..]] -- 7ª solución -- =========== sucAlternada7 :: [Integer] sucAlternada7 = unfoldr (\x -> if x `mod` 10 == 0 then Just (x,10 * x + 1) else Just (x,10 * x)) 0 |
9 Comentarios