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
1 |
latina :: Int -> Array (Int,Int) Int |
tal que (latina n) es la siguiente matriz latina de orden n:
- Para n impar:
1 2 3 4 5 6 7 8 9 |
| 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:
1 2 3 4 5 6 7 8 9 10 |
| 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,
1 2 3 4 5 6 7 8 9 10 11 12 13 |
ghci> 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] ghci> 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
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 |
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, -- ghci> 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, -- ghci> 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 |