Menu Close

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 |
         |           | |
         |           v |
         | 4 <- 5 <- 6 |   =>  Recorrido ZigZag: [1,2,3,6,5,4,7,8,9]
         | |           |
         | v           |
         | 7 -> 8 -> 9 |
         \             /

Definir la función

   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,

   λ> 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

import Data.Matrix (Matrix, toLists, fromLists, fromList)
 
recorridoZigZag :: Matrix a -> [a]
recorridoZigZag m =
  concat [f xs | (f,xs) <- zip (cycle [id,reverse]) (toLists m)]

5 soluciones de “Recorrido en ZigZag

  1. jaibengue
    import Data.Matrix
     
    recorridoZigZag :: Matrix a -> [a]
    recorridoZigZag = aux.toLists
      where aux (xs:ys:zss) = xs++(reverse ys)++(aux zss)
            aux [zss]       = zss
            aux []          = []
  2. Maria Ruiz
    recorridoZigZag :: M.Matrix a -> [a]
    recorridoZigZag m = concat $ zipWith id (cycle [id,reverse]) (M.toLists m)
  3. jaiturrod
     
    import Data.Matrix
     
    recorridoZigZag :: Matrix a -> [a]
    recorridoZigZag p = concat([f i | i <- [1..n]])
      where n = nrows p
            m = ncols p
            f x | odd x = [(p!(x,j)) | j <- [1..m]]
                | otherwise = reverse([(p!(x,j)) | j <- [1..m]])
  4. esppercab
     
    recorridoZigZag m =concat(escoge(toLists m))
        where escoge []=[]
              escoge (y:[])=[y]
              escoge (x:y:zs)=x:(reverse y):(escoge zs)
    • esppercab

      Una definición en la que no se trabaja con matrices realmente pero funciona.

Escribe tu solución

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.