Números con dígitos 1 y 2
Definir las funciones
1 2 3 |
numerosCon1y2 :: Int -> [Int] restosNumerosCon1y2 :: Int -> [Int] grafica_restosNumerosCon1y2 :: Int -> IO () |
tales que
- (numerosCon1y2 n) es la lista ordenada de números de n dígitos que se pueden formar con los dígitos 1 y 2. Por ejemplo,
1 2 |
numerosCon1y2 2 == [11,12,21,22] numerosCon1y2 3 == [111,112,121,122,211,212,221,222] |
- (restosNumerosCon1y2 n) es la lista de los restos de dividir los elementos de (restosNumerosCon1y2 n) entre 2^n. Por ejemplo,
1 2 3 |
restosNumerosCon1y2 2 == [3,0,1,2] restosNumerosCon1y2 3 == [7,0,1,2,3,4,5,6] restosNumerosCon1y2 4 == [7,8,1,2,11,12,5,6,15,0,9,10,3,4,13,14] |
- (graficaRestosNumerosCon1y2 n) dibuja la gráfica de los restos de dividir los elementos de (restosNumerosCon1y2 n) entre 2^n. Por ejemplo, (graficaRestosNumerosCon1y2 3) dibuja
(graficaRestosNumerosCon1y2 4) dibuja
y (graficaRestosNumerosCon1y2 5) dibuja
Nota: En la definición usar la función plotListStyle y como su segundo argumento (el PloStyle) usar
1 2 |
(defaultStyle {plotType = LinesPoints, lineSpec = CustomStyle [PointType 7]}) |
Comprobar con QuickCheck que todos los elementos de (restosNumerosCon1y2 n) son distintos.
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 |
import Test.QuickCheck import Graphics.Gnuplot.Simple -- Definición de numerosCon1y2 -- =========================== numerosCon1y2 :: Int -> [Int] numerosCon1y2 = map digitosAnumero . digitos -- (dígitos n) es la lista ordenada de de listas de n elementos que -- se pueden formar con los dígitos 1 y 2. Por ejemplo, -- λ> digitos 2 -- [[1,1],[1,2],[2,1],[2,2]] -- λ> digitos 3 -- [[1,1,1],[1,1,2],[1,2,1],[1,2,2],[2,1,1],[2,1,2],[2,2,1],[2,2,2]] digitos :: Int -> [[Int]] digitos 0 = [[]] digitos n = map (1:) xss ++ map (2:) xss where xss = digitos (n-1) -- (digitosAnumero ds) es el número cuyos dígitos son ds. Por ejemplo, -- digitosAnumero [2,0,1,9] == 2019 digitosAnumero :: [Int] -> Int digitosAnumero = read . concatMap show -- Definición de restosNumerosCon1y2 -- ================================= restosNumerosCon1y2 :: Int -> [Int] restosNumerosCon1y2 n = [x `mod` m | x <- numerosCon1y2 n] where m = 2^n -- Definición de graficaRestosNumerosCon1y2 -- ========================================= graficaRestosNumerosCon1y2 :: Int -> IO () graficaRestosNumerosCon1y2 n = plotListStyle [ Key Nothing , PNG ("Numeros_con_digitos_1_y_2_" ++ show n ++ ".png") ] (defaultStyle {plotType = LinesPoints, lineSpec = CustomStyle [PointType 7]}) (restosNumerosCon1y2 n) -- Propiedad de restosNumerosCon1y2 -- ================================ -- La propiedad prop_restosNumerosCon1y2 :: Positive Int -> Bool prop_restosNumerosCon1y2 (Positive n) = todosDistintos (restosNumerosCon1y2 n) where todosDistintos xs = xs == nub xs -- La comprobación es -- λ> quickCheckWith (stdArgs {maxSize=12}) prop_restosNumerosCon1y2 -- +++ OK, passed 100 tests. |
Pensamiento
¿Para qué llamar caminos
a los surcos del azar? …
Todo el que camina anda,
como Jesús, sobre el mar.Antonio Machado
4 Comentarios