Saltar al contenido
Regresar

Contando Montañas con Python: Listas, Iteradores y Condicionales

Publicado:  a las  10:04 a.m.

¿Te imaginas descifrar un mapa topográfico con solo una secuencia de letras? ⛰️ Descubramos cómo convertir pasos de alpinista en cumbres conquistadas con código.

🔮 Enunciado del Problema

Un intrépido alpinista registra cada paso de su expedición. Cada “u” representa un paso hacia arriba, y cada “d” un paso hacia abajo, siempre con respecto al nivel del mar. Una montaña es una región continua por encima del nivel del mar, y un valle, una depresión similar por debajo. El desafío es determinar cuántas montañas ha escalado (y descendido) el alpinista, considerando que tanto el ascenso como el descenso de una montaña deben terminar en el nivel del mar para contabilizarla.

Parámetros:

Valor de retorno:

Ejemplo:

>>> counting_mountains('uudududuuddddudud')
1
>>> counting_mountains('ud')
1
>>> counting_mountains('du')
0
>>> counting_mountains('uuduudduu')
0

Notas adicionales:

🧩 Resolución Paso a Paso

Inicialmente, necesitamos llevar un registro de la altitud del alpinista. Para ello, utilizaremos una variable psum que actuará como un acumulador. Esta variable se actualiza en cada paso, sumando 1 si el paso es hacia arriba (‘u’) y restando 1 si es hacia abajo (‘d’). Además, almacenaremos cada altitud en una lista llamada sea_level para tener un historial completo de la ruta.

psum = 0
sea_level = []
for p in path:
    psum += 1 if p == 'u' else -1
    sea_level.append(psum)

Una vez que tenemos el historial de altitudes, podemos iterar a través de la lista sea_level para identificar las montañas. Una montaña se define como una secuencia de pasos que comienza y termina en el nivel del mar, con una altitud intermedia siempre positiva. Por lo tanto, buscamos puntos en los que la altitud actual sea 0 (nivel del mar) y la altitud anterior haya sido mayor que 0.

mountains = 0
for i in range(1, len(path)):
    if sea_level[i] == 0:
        mountains += 1 if sea_level[i - 1] > 0 else 0

Finalmente, la función devuelve el número de montañas encontradas.

Solución Completa:

def counting_mountains(path):
    "level: medium; points: 5"
    psum = 0
    sea_level = []
    for p in path:
        psum += 1 if p == 'u' else -1
        sea_level.append(psum)

    mountains = 0
    for i in range(1, len(path)):
        if sea_level[i] == 0:
            mountains += 1 if sea_level[i - 1] > 0 else 0
    return mountains

🧠 Conceptos Clave

La solución se apoya fundamentalmente en la acumulación, tanto para el cálculo de la altitud en cada paso (psum) como para el conteo de montañas (mountains). La acumulación es una técnica omnipresente en programación, permitiendo mantener un estado a lo largo de un proceso iterativo.

El uso de la lista sea_level implica una forma de comprensión de la evolución temporal. En lugar de simplemente calcular el resultado final, guardamos un registro completo de la altitud en cada paso. Esto nos permite analizar la trayectoria del alpinista y detectar las montañas con mayor precisión.

La iteración sobre la cadena path y la lista sea_level se realiza mediante iteradores implícitos en los bucles for. La abstracción que ofrecen los iteradores facilita la manipulación de secuencias de datos sin necesidad de gestionar índices manualmente.

Finalmente, las condicionales (if) son cruciales para la lógica de detección de montañas. La condición sea_level[i] == 0 verifica si el alpinista ha regresado al nivel del mar, y la condición sea_level[i - 1] > 0 verifica si venía de una altitud positiva (una montaña). ¿Sabías que las condicionales, a nivel de arquitectura de computadoras, se implementan mediante saltos condicionales en el código máquina, alterando el flujo de ejecución del programa?

💫 Reflexiones Finales

Esta solución, aunque funcional, podría optimizarse. Por ejemplo, la lista sea_level podría ser innecesaria si recalculáramos la altitud anterior directamente en el bucle de conteo de montañas. También, se podrían agregar validaciones al inicio de la función para verificar la consistencia de la entrada (path), como asegurar que solo contenga los caracteres ‘u’ y ‘d’. Otra posible mejora sería generalizar la función para que también pueda contar valles.

Hemos visto cómo transformar una secuencia de pasos en un mapa de montañas conquistadas. 🚀 Si te ha parecido interesante, te invito a explorar otros artículos de mi blog, donde desentrañamos los misterios del código y la lógica que da forma al mundo digital. ¡Anímate a seguir aprendiendo y a escalar nuevas cumbres en el universo de la programación!



Publicación anterior
Proporción de Números: Positivos, Negativos y Ceros en Python
Siguiente publicación
Encuentra Similitudes: Intersección de Arreglos en Python