Definir, usando Data.Matrix, la función
ampliaMatriz :: Matrix a -> Int -> Int -> Matrix a |
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 "] |
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 |
λ> 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) |
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)