Recorrido en ZigZag
El recorrido en ZigZag de una matriz consiste en pasar de la primera fila hasta la última, de izquierda a derecha en las filas impares y de derecha a izquierda en las filas pares, como se indica en la figura.
1 2 3 4 5 6 7 8 9 |
/ \ | 1 -> 2 -> 3 | | | | | v | | 4 <- 5 <- 6 | => Recorrido ZigZag: [1,2,3,6,5,4,7,8,9] | | | | v | | 7 -> 8 -> 9 | \ / |
Definir la función
1 |
recorridoZigZag :: Matrix a -> [a] |
tal que (recorridoZigZag m) es la lista con los elementos de la matriz m cuando se recorre esta en ZigZag. Por ejemplo,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
λ> recorridoZigZag (fromLists [[1,2,3],[4,5,6],[7,8,9]]) [1,2,3,6,5,4,7,8,9] λ> recorridoZigZag (fromLists [[1,2],[3,4],[5,6],[7,8]]) [1,2,4,3,5,6,8,7] λ> recorridoZigZag (fromLists [[1,2,3,4],[5,6,7,8],[9,10,11,12]]) [1,2,3,4,8,7,6,5,9,10,11,12] λ> recorridoZigZag (fromList 5 4 "Cada paso es la meta") "Cadasap o es al meta" λ> recorridoZigZag (fromList 4 5 "Cada paso es la meta") "Cada osapes laatem " λ> recorridoZigZag (fromList 10 2 "Cada paso es la meta") "Caad psao se l ameat" λ> recorridoZigZag (fromList 2 10 "Cada paso es la meta") "Cada paso atem al se" |
Soluciones
1 2 3 4 5 |
import Data.Matrix (Matrix, toLists, fromLists, fromList) recorridoZigZag :: Matrix a -> [a] recorridoZigZag m = concat [f xs | (f,xs) <- zip (cycle [id,reverse]) (toLists m)] |
Puede mejorarse ligeramente utilizando recursión mutua