Espirales
Definir la función
espiral :: Int -> [[Int]]
tal que (espiral n) es la espiral de orden n (es decir, con n filas y n columnas). Por ejemplo,
λ> mapM_ print (espiral 5) [1,1,1,1,1] [0,0,0,0,1] [1,1,1,0,1] [1,0,0,0,1] [1,1,1,1,1] λ> mapM_ print (espiral 6) [1,1,1,1,1,1] [0,0,0,0,0,1] [1,1,1,1,0,1] [1,0,0,1,0,1] [1,0,0,0,0,1] [1,1,1,1,1,1] λ> mapM_ print (espiral 7) [1,1,1,1,1,1,1] [0,0,0,0,0,0,1] [1,1,1,1,1,0,1] [1,0,0,0,1,0,1] [1,0,1,1,1,0,1] [1,0,0,0,0,0,1] [1,1,1,1,1,1,1] λ> mapM_ print (espiral 8) [1,1,1,1,1,1,1,1] [0,0,0,0,0,0,0,1] [1,1,1,1,1,1,0,1] [1,0,0,0,0,1,0,1] [1,0,1,0,0,1,0,1] [1,0,1,1,1,1,0,1] [1,0,0,0,0,0,0,1] [1,1,1,1,1,1,1,1]
Soluciones
import Data.List (transpose) espiral :: Int -> [[Int]] espiral n = espiralAux n n espiralAux :: Int -> Int -> [[Int]] espiralAux 0 _ = [] espiralAux 1 1 = [[1]] espiralAux n m = primeraFila n : segundaFila n : filasDesdeTercera n m -- (primeraFila n) es la primera fila de la espiral de orden n. Por -- ejemplo, -- λ> primeraFila 5 -- [1,1,1,1,1] primeraFila :: Int -> [Int] primeraFila n = replicate n 1 -- (segundaFila n) es la segunda de la espiral de orden n. Por -- ejemplo, -- λ> segundaFila 5 -- [0,0,0,0,1] segundaFila :: Int -> [Int] segundaFila n = replicate (n-1) 0 ++ [1] -- (filasDesdeTercera n m), cuando n = m, es la lista de las filas de la -- espiral de orden n a partir de la tercera. Por ejemplo, -- λ> mapM_ print (filasDesdeTercera 5 5) -- [1,1,1,0,1] -- [1,0,0,0,1] -- [1,1,1,1,1] filasDesdeTercera :: Int -> Int -> [[Int]] filasDesdeTercera n m = map reverse (transpose (espiralAux (m-2) n))