¿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:
string path
: Una cadena que representa la ruta del alpinista, donde ‘u’ es un paso arriba y ‘d’ es un paso abajo.
Valor de retorno:
int
: El número de montañas que visitó el alpinista durante su ruta.
Ejemplo:
>>> counting_mountains('uudududuuddddudud')
1
>>> counting_mountains('ud')
1
>>> counting_mountains('du')
0
>>> counting_mountains('uuduudduu')
0
Notas adicionales:
- Para que un valle o montaña cuente como tal, el alpinista debe volver al nivel del mar.
- El alpinista siempre dará más de dos pasos antes de finalizar su ruta.
🧩 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!