Múltiplos con ceros y unos
Se observa que todos los primeros números naturales tienen al menos un múltiplo no nulo que está formado solamente por ceros y unos. Por ejemplo, 1×10=10, 2×5=10, 3×37=111, 4×25=100, 5×2=10, 6×185=1110; 7×143=1001; 8X125=1000; 9×12345679=111111111.
Definir la función
1 |
multiplosCon1y0 :: Integer -> [Integer] |
tal que (multiplosCon1y0 n) es la lista de los múltiplos de n cuyos dígitos son 1 ó 0. Por ejemplo,
1 2 3 |
take 4 (multiplosCon1y0 3) == [111,1011,1101,1110] take 3 (multiplosCon1y0 23) == [110101,1011011,1101010] head (multiplosCon1y0 1234658) == 110101101101000000110 |
Comprobar con QuickCheck que todo entero positivo tiene algún múltiplo cuyos dígitos son 1 ó 0.
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 |
import Test.QuickCheck -- 1ª definición -- ============= multiplosCon1y0 :: Integer -> [Integer] multiplosCon1y0 n = [x | x <- multiplos n , todos1y0 x] -- (multiplos n) es la lista de los múltiplos de n. Por ejemplo, -- take 12 (multiplos 5) == [5,10,15,20,25,30,35,40,45,50,55,60] multiplos :: Integer -> [Integer] multiplos n = [n,2*n..] -- (todos1y0 n) se verifica si todos los dígitos de n son el 1 o el -- 0. Por ejmplo, -- todos1y0 1101110 == True -- todos1y0 1102110 == False todos1y0 :: Integer -> Bool todos1y0 n = all (`elem` "01") (show n) -- 2ª definición -- ============= multiplosCon1y0b :: Integer -> [Integer] multiplosCon1y0b n = [x | x <- numerosCon1y0 , x `rem` n == 0] -- numerosCon1y0 es la lista de los números cuyos dígitos son 1 ó 0. Por -- ejemplo, -- ghci> take 15 numerosCon1y0 -- [1,10,11,100,101,110,111,1000,1001,1010,1011,1100,1101,1110,1111] numerosCon1y0 :: [Integer] numerosCon1y0 = 1 : concat [[10*x,10*x+1] | x <- numerosCon1y0] -- Comparación de eficiencia -- ========================= -- λ> head (multiplosCon1y0 9) -- 111111111 -- (7.70 secs, 10,853,320,456 bytes) -- λ> head (multiplosCon1y0b 9) -- 111111111 -- (0.01 secs, 167,992 bytes) -- Comprobación de la propiedad -- ============================ -- La propiedad es prop_existe_multiplosCon1y0 :: Integer -> Property prop_existe_multiplosCon1y0 n = n > 0 ==> (not . null) (multiplosCon1y0b n) -- La comprobación es -- λ> quickCheck prop_existe_multiplosCon1y0 -- +++ OK, passed 100 tests. |
Pensamiento
Huye del triste amor, amor pacato,
sin peligro, sin venda ni aventura,
que espera del amor prenda segura,
porque en amor locura es lo sensato.Antonio Machado
Haciendo uso de la definición de Fernando de «unoycero».
La propiedad no sé si es correcta porque no sale si pasa las pruebas ni da un contraejemplo, simplemente para de cargar pasado un tiempo.