Definir, usando Data.Matrix, la función
ampliaMatriz :: Matrix a -> Int -> Int -> Matrix a |
tal que (ampliaMatriz p f c) es la matriz obtenida a partir de p repitiendo cada fila f veces y cada columna c veces. Por ejemplo, si ej1 es la matriz definida por
ej1 :: Matrix Char ej1 = fromLists [" x ", "x x", " x "] |
entonces
λ> ampliaMatriz ej1 1 2 ( ' ' ' ' 'x' 'x' ' ' ' ' ) ( 'x' 'x' ' ' ' ' 'x' 'x' ) ( ' ' ' ' 'x' 'x' ' ' ' ' ) λ> (putStr . unlines . toLists) (ampliaMatriz ej1 1 2) xx xx xx xx λ> (putStr . unlines . toLists) (ampliaMatriz ej1 2 1) x x x x x x x x λ> (putStr . unlines . toLists) (ampliaMatriz ej1 2 2) xx xx xx xx xx xx xx xx λ> (putStr . unlines . toLists) (ampliaMatriz ej1 2 3) xxx xxx xxx xxx xxx xxx xxx xxx |
Nota: Este ejercicio está basado en el problema Skener de Kattis.
Soluciones
import Data.Matrix ej1 :: Matrix Char ej1 = fromLists [" x ", "x x", " x "] -- 1ª definición -- ============= ampliaMatriz :: Matrix a -> Int -> Int -> Matrix a ampliaMatriz p f c = ampliaColumnas (ampliaFilas p f) c ampliaFilas :: Matrix a -> Int -> Matrix a ampliaFilas p f = matrix (f*m) n (\(i,j) -> p!(1 + (i-1) `div` f, j)) where m = nrows p n = ncols p ampliaColumnas :: Matrix a -> Int -> Matrix a ampliaColumnas p c = matrix m (c*n) (\(i,j) -> p!(i,1 + (j-1) `div` c)) where m = nrows p n = ncols p -- 2ª definición -- ============= ampliaMatriz2 :: Matrix a -> Int -> Int -> Matrix a ampliaMatriz2 p f c = ampliaColumnas2 (ampliaFilas2 p f) c ampliaFilas2 :: Matrix a -> Int -> Matrix a ampliaFilas2 p f = fromLists (concatMap (replicate f) (toLists p)) ampliaColumnas2 :: Matrix a -> Int -> Matrix a ampliaColumnas2 p c = fromLists (map (concatMap (replicate c)) (toLists p)) -- 3ª definición -- ============= ampliaMatriz3 :: Matrix a -> Int -> Int -> Matrix a ampliaMatriz3 p f c = ( fromLists . concatMap (map (concatMap (replicate c)) . replicate f) . toLists) p -- Comparación de eficiencia -- ========================= ejemplo :: Int -> Matrix Int ejemplo n = fromList n n [1..] -- λ> maximum (ampliaMatriz (ejemplo 10) 100 200) -- 100 -- (6.64 secs, 1,026,559,296 bytes) -- λ> maximum (ampliaMatriz2 (ejemplo 10) 100 200) -- 100 -- (1.90 secs, 513,211,144 bytes) -- λ> maximum (ampliaMatriz3 (ejemplo 10) 100 200) -- 100 -- (1.89 secs, 644,928,024 bytes) -- λ> maximum (ampliaMatriz2 (ejemplo 10) 200 200) -- 100 -- (5.13 secs, 1,248,173,384 bytes) -- λ> maximum (ampliaMatriz3 (ejemplo 10) 200 200) -- 100 -- (4.67 secs, 1,431,540,344 bytes) |
3 Comments