Matrices latinas
Una matriz latina de orden n es una matriz cuadrada de orden n tal que todos sus elementos son cero salvo los de su fila y columna central, si n es impar; o los de sus dos filas y columnas centrales, si n es par.
Definir la función
latina :: Int -> Array (Int,Int) Int
tal que (latina n) es la siguiente matriz latina de orden n:
- Para n impar:
| 0 0... 0 1 0 ... 0 0| | 0 0... 0 2 0 ... 0 0| | 0 0... 0 3 0 ... 0 0| | .........................| | 1 2..............n-1 n| | .........................| | 0 0... 0 n-2 0 ... 0 0| | 0 0... 0 n-1 0 ... 0 0| | 0 0... 0 n 0 ... 0 0|
- Para n par:
| 0 0... 0 1 n 0 ... 0 0| | 0 0... 0 2 n-1 0 ... 0 0| | 0 0... 0 3 n-2 0 ... 0 0| | ................................| | 1 2.....................n-1 n| | n n-1 .................... 2 1| | ................................| | 0 0... 0 n-2 3 0 ... 0 0| | 0 0... 0 n-1 2 0 ... 0 0| | 0 0... 0 n 1 0 ... 0 0|
Por ejemplo,
λ> elems (latina 5) [0,0,1,0,0, 0,0,2,0,0, 1,2,3,4,5, 0,0,4,0,0, 0,0,5,0,0] λ> elems (latina 6) [0,0,1,6,0,0, 0,0,2,5,0,0, 1,2,3,4,5,6, 6,5,4,3,2,1, 0,0,5,2,0,0, 0,0,6,1,0,0]
Soluciones
latina :: Int -> Array (Int,Int) Int latina n | even n = latinaPar n | otherwise = latinaImpar n -- (latinaImpar n) es la matriz latina de orden n, siendo n un número -- impar. Por ejemplo, -- λ> elems (latinaImpar 5) -- [0,0,1,0,0, -- 0,0,2,0,0, -- 1,2,3,4,5, -- 0,0,4,0,0, -- 0,0,5,0,0] latinaImpar :: Int -> Array (Int,Int) Int latinaImpar n = array ((1,1),(n,n)) [((i,j),f i j) | i <- [1..n], j <- [1..n]] where c = 1 + (n `div` 2) f i j | i == c = j | j == c = i | otherwise = 0 -- (latinaPar n) es la matriz latina de orden n, siendo n un número -- par. Por ejemplo, -- λ> elems (latinaPar 6) -- [0,0,1,6,0,0, -- 0,0,2,5,0,0, -- 1,2,3,4,5,6, -- 6,5,4,3,2,1, -- 0,0,5,2,0,0, -- 0,0,6,1,0,0] latinaPar :: Int -> Array (Int,Int) Int latinaPar n = array ((1,1),(n,n)) [((i,j),f i j) | i <- [1..n], j <- [1..n]] where c = n `div` 2 f i j | i == c = j | i == c+1 = n-j+1 | j == c = i | j == c+1 = n-i+1 | otherwise = 0