Números cíclopes
Un número cíclope es un número natural cuya representación binaria sólo tiene un cero en el centro. Por ejemplo,
1 2 3 4 5 6 7 8 9 10 |
0 es ciclope porque su representación binaria es 0 1 no es ciclope porque su representación binaria es 1 5 es ciclope porque su representación binaria es 101 9 no es ciclope porque su representación binaria es 1001 10 no es ciclope porque su representación binaria es 1010 27 es ciclope porque su representación binaria es 11011 85 no es ciclope porque su representación binaria es 1010101 101 no es ciclope porque su representación binaria es 1100101 111 no es ciclope porque su representación binaria es 1101111 119 es ciclope porque su representación binaria es 1110111 |
Definir las funciones
1 2 3 |
esCiclope :: Integer -> Bool ciclopes :: [Integer] graficaCiclopes :: Int -> IO () |
tales que
- (esCiclope n) se verifica si el número natual n es cíclope. Por ejemplo,
1 2 3 4 5 6 7 8 9 10 |
esCiclope 0 == True esCiclope 1 == False esCiclope 5 == True esCiclope 9 == False esCiclope 10 == False esCiclope 27 == True esCiclope 85 == False esCiclope 101 == False esCiclope 111 == False esCiclope 119 == True |
- ciclopes es la lista de los número cíclopes. Por ejemplo,
1 2 3 4 |
λ> take 12 ciclopes [0,5,27,119,495,2015,8127,32639,130815,523775,2096127,8386559] λ> length (show (ciclopes !! (10^5))) 60207 |
- (graficaCiclopes n) dibuja la gráfica del último dígito de los n primeros números cíclopes. Por ejemplo, (graficaCiclopes n) dibuja
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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 |
import Graphics.Gnuplot.Simple -- 1ª solución -- =========== -- esCiclope 5 == True -- esCiclope 6 == False esCiclope :: Integer -> Bool esCiclope n = esCiclopeBinario (decimalAbinario n) -- decimalAbinario 4 == [0,0,1] -- decimalAbinario 5 == [1,0,1] -- decimalAbinario 6 == [0,1,1] decimalAbinario :: Integer -> [Integer] decimalAbinario 0 = [0] decimalAbinario 1 = [1] decimalAbinario n = r : decimalAbinario q where (q,r) = quotRem n 2 -- esCiclopeBinario [1,1,0,1,1] == True -- esCiclopeBinario [1,1,0,1] == False -- esCiclopeBinario [1,1,2,1,1] == False -- esCiclopeBinario [2,2,0,2,2] == False esCiclopeBinario :: [Integer] -> Bool esCiclopeBinario xs = odd n && xs == ys ++ 0 : ys where n = length xs m = n `div` 2 ys = replicate m 1 -- take 8 ciclopes == [0,5,27,119,495,2015,8127,32639] ciclopes :: [Integer] ciclopes = filter esCiclope [0..] -- 2ª solución -- =========== -- take 8 ciclopes2 == [0,5,27,119,495,2015,8127,32639] ciclopes2 :: [Integer] ciclopes2 = [binarioAdecimal (replicate n 1 ++ 0 : replicate n 1) | n <- [0..]] -- binarioAdecimal [0,1,1] == 6 binarioAdecimal :: [Integer] -> Integer binarioAdecimal [x] = x binarioAdecimal (x:xs) = x + 2 * binarioAdecimal xs esCiclope2 :: Integer -> Bool esCiclope2 n = n `pertenece` ciclopes2 pertenece :: Integer -> [Integer] -> Bool pertenece x ys = x == head (dropWhile (<x) ys) -- 3ª solución -- =========== -- take 8 ciclopes3 == [0,5,27,119,495,2015,8127,32639] ciclopes3 :: [Integer] ciclopes3 = [sum [2^k | k <- [0..n-1]] + sum [2^k | k <- [n+1..n+n]] | n <- [0..]] esCiclope3 :: Integer -> Bool esCiclope3 n = n `pertenece` ciclopes3 -- 4ª solución -- =========== -- take 8 ciclopes3 == [0,5,27,119,495,2015,8127,32639] ciclopes4 :: [Integer] ciclopes4 = [2^(2*n+1) - 1 - 2^n | n <- [0..]] esCiclope4 :: Integer -> Bool esCiclope4 n = n `pertenece` ciclopes4 -- 5ª solución -- =========== -- take 8 ciclopes5 == [0,5,27,119,495,2015,8127,32639] ciclopes5 :: [Integer] ciclopes5 = [2*4^n - 1 - 2^n | n <- [0..]] esCiclope5 :: Integer -> Bool esCiclope5 n = n `pertenece` ciclopes5 -- 6ª solución -- =========== -- take 8 ciclopes6 == [0,5,27,119,495,2015,8127,32639] ciclopes6 :: [Integer] ciclopes6 = [2*x*x - 1 - x | x <- iterate (*2) 1] esCiclope6 :: Integer -> Bool esCiclope6 n = n `pertenece` ciclopes6 -- Comparación de eficiencia -- ========================= -- λ> ciclopes !! 9 -- 523775 -- (6.68 secs, 4,696,734,960 bytes) -- λ> ciclopes2 !! 9 -- 523775 -- (0.00 secs, 134,664 bytes) -- λ> ciclopes3 !! 9 -- 523775 -- (0.00 secs, 150,920 bytes) -- λ> ciclopes4 !! 9 -- 523775 -- (0.01 secs, 131,936 bytes) -- λ> ciclopes5 !! 9 -- 523775 -- (0.00 secs, 132,064 bytes) -- -- λ> length (show (ciclopes2 !! (3*10^4))) -- 18063 -- (0.65 secs, 486,437,480 bytes) -- λ> length (show (ciclopes3 !! (3*10^4))) -- 18063 -- (2.94 secs, 1,188,645,584 bytes) -- λ> length (show (ciclopes4 !! (3*10^4))) -- 18063 -- (0.02 secs, 6,769,592 bytes) -- λ> length (show (ciclopes5 !! (3*10^4))) -- 18063 -- (0.02 secs, 6,773,552 bytes) -- -- λ> length (show (ciclopes2 !! (10^5))) -- 60207 -- (6.42 secs, 5,148,671,368 bytes) -- λ> length (show (ciclopes4 !! (10^5))) -- 60207 -- (0.07 secs, 22,291,480 bytes) -- λ> length (show (ciclopes5 !! (10^5))) -- 60207 -- (0.04 secs, 22,316,216 bytes) -- -- λ> length (show (ciclopes4 !! (5*10^6))) -- 3010301 -- (2.34 secs, 1,116,327,832 bytes) -- λ> length (show (ciclopes5 !! (5*10^6))) -- 3010301 -- (2.39 secs, 1,099,177,056 bytes) -- Definición de graficaCiclopes -- ============================= graficaCiclopes :: Int -> IO () graficaCiclopes n = plotList [ Key Nothing -- , PNG "Numeros_ciclopes.png" ] [x `mod` 10 | x <- take n ciclopes5] |
Pensamiento
¿Sabes cuando el agua suena,
si es agua de cumbre o valle,
de plaza, jardín o huerta?
Cantores, dejad
palmas y jaleo
para los demás.Antonio Machado
Solución en maxima
ciclopes (n) := map (lambda ([n],(2^n – 1)(22^n + 1)), (makelist(k,k,0,n-1)))$
esCiclope (n) := member(n,ciclopes (n))$
ciclopes2 (n) := map (lambda ([n], mod (n,10)), ciclopes (n))$
graficaCiclopes (n) := plot2d ([discrete, makelist (k,k,0,n-1), ciclopes2 (n)])$