Espirales
Definir la función
1 |
espiral :: Int -> [[Int]] |
tal que (espiral n) es la espiral de orden n (es decir, con n filas y n columnas). Por ejemplo,
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 |
λ> 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] |
Nota: La serpiente (formada por los 1) nunca se puede tocar a ella misma.
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 |
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)) |
Nuevas soluciones
- En los comentarios se pueden escribir nuevas soluciones.
- El código se debe escribir entre una línea con <pre lang="haskell"> y otra con </pre>
Un comentario