Saltar al contenido
Regresar

Cuenta Manzanas en tu Terreno: Python y Funciones Lambda

Publicado:  a las  04:47 p.m.

¿Alguna vez te has preguntado cómo un simple algoritmo puede desentrañar la lógica detrás de la naturaleza, como la predecible (y a veces no tan predecible) caída de las manzanas? 🍎

🔮 Enunciado del Problema

Imagina que eres el afortunado dueño de un terreno que se extiende desde la posición s hasta la posición t en un eje horizontal. Dentro de tu propiedad, descansa un venerable manzano. De vez en cuando, una manzana se desprende del árbol, influenciada por el viento o simplemente por la ley de la gravedad.

Como un diligente jardinero (y aspirante a científico de datos), registras cada caída. Anotas la distancia y la dirección en que la manzana cayó desde el árbol: un número negativo indica que cayó hacia la izquierda, mientras que un número positivo indica que cayó hacia la derecha.

Tu misión es escribir una función que, dada la posición del árbol p, los límites del terreno s y t, y un arreglo apples[n] con las distancias de cada caída, determine cuántas manzanas terminaron dentro de los límites de tu preciado terreno.

Parámetros:

Valor de retorno:

Ejemplo:

>>> counting_apples(2, 10, 9, [5, -7, 10, 1])
2

En este ejemplo, el terreno se extiende de 2 a 10. El manzano está en la posición 9. De las manzanas que cayeron, solo dos aterrizaron dentro del terreno: la que cayó 1 unidad a la derecha (posición final 10) y la que cayó -7 unidades a la izquierda (posición final 2). La manzana que cayó 5 unidades a la derecha (posición final 14) y la que cayó 10 unidades a la derecha (posición final 19) quedaron fuera del terreno.

🧩 Resolución Paso a Paso

Para resolver este problema, nos basamos en el poder de las funciones de orden superior y las funciones lambda en Python, permitiéndonos crear un código conciso y legible.

Primero, utilizamos la función filter(). Esta función es como un tamiz inteligente que revisa cada elemento de nuestra lista de distancias (apples) y decide si debe pasar a la siguiente etapa basándose en una condición:

filter(lambda apple: s <= p + apple <= t, apples)

Aquí, la función lambda actúa como nuestro criterio de selección. Para cada apple (distancia), calculamos la posición final donde cayó la manzana (p + apple). Luego, verificamos si esta posición está dentro de los límites de nuestro terreno (s <= p + apple <= t). Si la manzana cayó dentro del terreno, la función lambda retorna True, y la distancia de la manzana pasa a la siguiente etapa. De lo contrario, retorna False, y la manzana se descarta.

Después, convertimos el iterador resultante de filter() en una lista:

list(filter(lambda apple: s <= p + apple <= t, apples))

Esto nos da una lista con solo las distancias de las manzanas que cayeron dentro del terreno. Finalmente, utilizamos la función len() para contar el número de elementos en esta lista, que representa el número total de manzanas que aterrizaron dentro de nuestro terreno.

len(list(filter(lambda apple: s <= p + apple <= t, apples)))

Solución Completa:

def counting_apples(s, t, p, apples):
	"level: easy; points: 2"
	return len(list(filter(lambda apple: s <= p + apple <= t, apples)))

🧠 Conceptos Clave

Este problema nos permite explorar la potencia de las funciones de orden superior y las funciones lambda en Python. Las funciones de orden superior son funciones que pueden recibir otras funciones como argumentos o retornar funciones como resultados. Esto nos permite crear un código más flexible y modular. En nuestro caso, filter() es una función de orden superior que recibe una función lambda como argumento.

Las funciones lambda, también conocidas como funciones anónimas, son funciones que se definen en línea y no tienen un nombre asociado. Son ideales para situaciones donde necesitamos una función simple para un solo uso, como en el caso de nuestro filtro.

¿Sabías que la función filter() en Python retorna un iterador, no una lista directamente? Esto es más eficiente en memoria, ya que solo calcula los elementos que cumplen la condición a medida que se necesitan. Sin embargo, para obtener la longitud, debemos convertir el iterador a una lista primero.

💫 Reflexiones Finales

Este problema, aunque sencillo, ilustra el poder de la programación funcional en Python. Podríamos optimizar aún más este código evitando la conversión a lista si solo necesitamos contar los elementos. Se podría usar sum(1 for apple in apples if s <= p + apple <= t) para iterar sobre el arreglo y sumar 1 por cada manzana que cae dentro del rango.

Es importante recordar que la legibilidad del código es crucial. Aunque existen formas más concisas de escribir la solución, es importante elegir la opción que sea más fácil de entender y mantener.

¡Espero que este viaje a través del jardín de las manzanas te haya resultado instructivo! 🌳 Si te ha gustado este tipo de análisis y quieres seguir explorando el fascinante mundo del desarrollo de software, te invito a explorar otros artículos de mi blog. ¡No te pierdas la oportunidad de seguir aprendiendo y mejorando tus habilidades!



Publicación anterior
Distancia Mínima Duplicados: Python y Optimización de Arrays
Siguiente publicación
Serie Numérica: Descubre el Patrón y Calcula el N-ésimo Término