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

10 Comentarios

  1. Si vamos al Norte, luego al Oeste, luego al Sur y luego al Este volvemos al mismo punto, NOSE, digo yo xD

    1. El anterior tiene, en el peor caso, coste O(n^2), puede hacerse con coste lineal O(n) si se usa array o hash (aquí O(n log n) por usar Data.Map).

    2. Vale, el enunciado no pide encontrar la subruta más corta (eliminar cualquier lazo), sólo «si no tiene dos pasos consecutivos en direcciones opuesta» :/

  2. Hay soluciones más rápida, pero esta ahorra un poco de duplicación

Escribe tu solución