Matrices cruzadas
Consideramos las matrices representadas como tablas cuyos índices son pares de números naturales.
type Matriz a = Array (Int,Int) a
Una matriz cruzada es una matriz cuadrada en la que sólo hay elementos distintos de 0 en las diagonales principal y secundaria. Por ejemplo,
| 1 0 0 0 3 | | 1 0 0 3 | | 0 2 0 1 0 | | 0 2 3 0 | | 0 0 3 0 0 | | 0 4 5 0 | | 0 2 0 1 0 | | 2 0 0 3 | | 1 0 0 0 3 |
Definir la función
creaCruzada :: Int -> Matriz Int
tal que (creaCruzada n) es la siguiente matriz cruzada con n filas y n columnas:
| 1 0 0 ... 0 0 1 | | 0 2 0 ... 0 2 0 | | 0 0 3 ... 3 0 0 | | ....................... | | 0 0 n-2 ... n-2 0 0 | | 0 n-1 0 ... 0 n-1 0 | | n 0 0 ... 0 0 n |
Es decir, los elementos de la diagonal principal son [1,...,n], en orden desde la primera fila hasta la última; y los elementos de la diagonal secundaria son [1,...,n], en orden desde la primera fila hasta la última. Por ejemplo,
λ> elems (creaCruzada 3) [1,0,1, 0,2,0, 3,0,3] λ> elems (creaCruzada 4) [1,0,0,1, 0,2,2,0, 0,3,3,0, 4,0,0,4] λ> elems (creaCruzada 5) [1,0,0,0,1, 0,2,0,2,0, 0,0,3,0,0, 0,4,0,4,0, 5,0,0,0,5]
Soluciones
import Data.Array type Matriz a = Array (Int,Int) a creaCruzada :: Int -> Matriz Int creaCruzada n = array ((1,1),(n,n)) [((i,j),valores n i j) | i <- [1..n], j <- [1..n]] where valores n i j | i == j = i | i+j == n+1 = i | otherwise = 0