Caminos reducidos

Un camino es una sucesión de pasos en una de las cuatros direcciones Norte, Sur, Este, Oeste. Ir en una dirección y a continuación en la opuesta es un esfuerzo que se puede reducir, Por ejemplo, el camino [Norte,Sur,Este,Sur] se puede reducir a [Este,Sur].

Un camino se dice que es reducido si no tiene dos pasos consecutivos en direcciones opuesta. Por ejemplo, [Este,Sur] es reducido y [Norte,Sur,Este,Sur] no lo es.

En Haskell, las direcciones y los caminos se pueden definir por

Definir la función

tal que (reducido ds) es el camino reducido equivalente al camino ds. Por ejemplo,

Nótese que en el penúltimo ejemplo las reducciones son

Soluciones

5 Comentarios

    1. Cometí un error que solo afectaba a la eficiencia. En reduce, llamaba recursivamente a reducido en vez de a reduce.

  1. En una sola pasada (coste O(n), va desde el final reduciendo hacia el frente)

    1. Argh! es cuadrático, la revisión por la derecha recorre toda la cola.
      Ahora sí, usando una cremallera (zipper) con coste lineal (es como el anterior pero usando un «hueco móvil»)

  2. Con parecido a las otras versiones, esta sería mi versión:

Escribe tu solución