Saltar al contenido

Las compuertas del canal

Enunciado

Eleuterio es el aguador del ejido y reparte el agua del canal. En cada compuerta el canal se abre en dos ramales: por la izquierda el agua se va hacia las parcelas con número más chico que el de la compuerta, y por la derecha hacia las de número más grande. Hoy le toca riego a una parcela y hay que anotar por dónde baja el agua.

La red llega como un diccionario, que en JavaScript es un objeto, con la llave numero y las llaves izq y der, que traen otro diccionario igual. Una compuerta del final del canal simplemente no trae esas llaves: ahí ya no hay a dónde seguir.

Recibes la compuerta principal y el número de la parcela, y regresas la lista de números de las compuertas por las que pasa el agua, desde la principal hasta la que tiene el número de la parcela, esa incluida. Si el agua llega a una compuerta y del lado que necesita ya no hay otra, entonces esa parcela no está en la red y regresas una lista vacía.

Por ejemplo, con la compuerta principal 50, que tiene la 20 a la izquierda y la 75 a la derecha, el agua de la parcela 75 pasa por la 50 y la 75, y regresas 50 y 75. Para la parcela 60 el agua pasa por la 50 y llega a la 75, pero la 75 ya no tiene compuerta a la izquierda: regresas una lista vacía.

El canal no pasa de 11 compuertas, y el agua nunca pasa por más de 5 compuertas para llegar a su parcela, contando la principal.

Idea: no hace falta recorrer la red entera. Párate en la compuerta y anótala. Si su número es el de la parcela, ya llegaste. Si la parcela es más chica, te vas por izq, y si es más grande, por der. Antes de bajar revisa si esa llave existe: en Python con in, y en JavaScript comparando con undefined lo que te da la llave.

Ejemplos

  • El ejemplo

    {"numero": 50, "izq": {"numero": 20}, "der": {"numero": 75}}, 75 → [50, 75]

  • El agua se queda sin compuerta

    {"numero": 50, "izq": {"numero": 20}, "der": {"numero": 75}}, 60 → []

  • La parcela de la compuerta principal

    {"numero": 50, "izq": {"numero": 20, "izq": {"numero": 8}, "der": {"numero": 35, "izq": {"numero": 28, "der": {"numero": 31}}}}, "der": {"numero": 75, "izq": {"numero": 60}, "der": {"numero": 90, "izq": {"numero": 82}, "der": {"numero": 99}}}}, 50 → [50]

  • Hasta el fondo del canal

    {"numero": 50, "izq": {"numero": 20, "izq": {"numero": 8}, "der": {"numero": 35, "izq": {"numero": 28, "der": {"numero": 31}}}}, "der": {"numero": 75, "izq": {"numero": 60}, "der": {"numero": 90, "izq": {"numero": 82}, "der": {"numero": 99}}}}, 31 → [50, 20, 35, 28, 31]

  • Una parcela de la orilla

    {"numero": 50, "izq": {"numero": 20, "izq": {"numero": 8}, "der": {"numero": 35, "izq": {"numero": 28, "der": {"numero": 31}}}}, "der": {"numero": 75, "izq": {"numero": 60}, "der": {"numero": 90, "izq": {"numero": 82}, "der": {"numero": 99}}}}, 8 → [50, 20, 8]

Además de estas, el reto tiene pruebas ocultas que se revelan al enviar tu solución.

Empiezas con esto

Python

def camino(compuertas, parcela):
    pass

JavaScript

function camino(compuertas, parcela) {
}
Resolver este reto

Se abre en el navegador, con el editor y las pruebas. Es gratis y no hace falta cuenta para empezar.

Más retos de O(log n)

Ver todos los retos →