Mayor producto de n dígitos consecutivos de un número
Definir la función
1 |
mayorProducto :: Int -> Integer -> Integer |
tal que (mayorProducto n x) es el mayor producto de n dígitos consecutivos del número x (suponiendo que x tiene al menos n dígitos). Por ejemplo,
1 2 3 4 5 6 7 |
mayorProducto 2 325 == 10 mayorProducto 5 11111 == 1 mayorProducto 5 113111 == 3 mayorProducto 5 110111 == 0 mayorProducto 5 10151112 == 10 mayorProducto 5 101511124 == 10 mayorProducto 5 (product [1..1000]) == 41472 |
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 |
import Data.List (inits, tails) import Data.Char (digitToInt) -- 1ª solución -- =========== mayorProducto1 :: Int -> Integer -> Integer mayorProducto1 n x = maximum [product xs | xs <- segmentos n (cifras x)] -- (cifras x) es la lista de las cifras del número x, de derecha a -- izquierda. Por ejemplo, -- cifras 325 == [5,2,3] cifras :: Integer -> [Integer] cifras x | x < 10 = [x] | otherwise = r : cifras q where (q,r) = quotRem x 10 -- (segmentos n xs) es la lista de los segmentos de longitud n de la -- lista xs. Por ejemplo, -- segmentos 2 [3,5,4,6] == [[3,5],[5,4],[4,6]] segmentos :: Int -> [Integer] -> [[Integer]] segmentos n xs = take (length xs - n + 1) (map (take n) (tails xs)) -- 2ª solución -- =========== mayorProducto2 :: Int -> Integer -> Integer mayorProducto2 n x = maximum (aux ns) where ns = [read [d] | d <- show x] aux xs | length xs < n = [] | otherwise = product (take n xs) : aux (tail xs) -- 3ª solución -- =========== mayorProducto3 :: Int -> Integer -> Integer mayorProducto3 n = maximum . map (product . take n) . filter ((>=n) . length) . tails . cifras -- 4ª solución -- =========== mayorProducto4 :: Int -> Integer -> Integer mayorProducto4 n = maximum . map (product . map (fromIntegral . digitToInt)) . filter ((==n) . length) . concatMap inits . tails . show -- --------------------------------------------------------------------- -- Comparación de soluciones -- -- --------------------------------------------------------------------- -- Tiempo (en segundos) del cálculo de (mayorProducto4 5 (product [1..])) -- -- | Def | 10 | 100 | 1000 | 5000 | -- |-----+------+------+------+-------| -- | 1 | 0.01 | 0.01 | 0.04 | 0.34 | -- | 2 | 0.01 | 0.01 | 0.07 | 2.86 | -- | 3 | 0.01 | 0.01 | 0.06 | 12.48 | -- | 4 | 0.00 | 0.12 | | | ... |
4 Comentarios