En esta serie de apuntes voy a estar revisando algunos acertijos de programación.
Hoy voy a revisar aquel que se conoce, entre otros nombres, como “el problema de la suma de dos números enteros”.
El plan es poder hacer dos cosas al mismo tiempo. Por un lado escribir esto me da una excusa para poder seguir aprendiendo cosas que no conozco y por el otro lado tengo la oportunidad de poder crear nuevo material para el blog.
Recuerden que yo no soy un experto en nada de esto, solamente soy una persona a la que le gusta intentar aprender enseñando.
El problema:
El acertijo con el que estamos trabajando dice lo siguiente:
Dado un array de integers llamado:
array_cifras = [1, 2, 3, 4, 5, 7, 8, 9, 10, 14, 15]
Y un integer “x”:
“x=8”
Crear una función booleana que revise si existen en “array_cifras” dos elementos que sumados den por resultado el integer “x”.
Los materiales
Tenemos una colección de números. De entre todos esos números de la colección, tenemos que averiguar si es cierto que al menos dos de ellos sumados dan por resultado “x”.
Sebamos que para trabajar tenemos lo siguiente:
– Un array: Los array se utilizan para guardar datos de algún tipo. No es exactamente una lista, aunque en un primer momento se parece a una.
Entre otras diferencias, una lista puede tener elementos de distintas clases mientras que un array solamente puede contener elementos de una misma clase. Aunque supongo que este concepto puede variar entre lenguajes de programación, nos alcanza saber que nuestro array tiene solamente integers.
Otro detalle importante es saber que se pueden acceder a los elementos del array por medio del índice.
Por ejemplo, en Python un array como el nuestro aparece de la siguiente forma:
array_cifras = [1, 2, 3, 4, 5]
Pero por otra parte, un array en bash aparece de esta otra forma:
array_cifras=(1 2 3 4 5)
O también de la siguiente forma:
declare -a array_cifras=(“1” “2” “3” “4” “5”)
En este caso necesitamos usar primero el comando “declare” junto con la opción “-a” para señalar que la variable se trata de un array, al que podemos agregarle otras opciones también.
En resumen: los detalles entre lenguajes varían en la forma de escribir la respuesta, pero el concepto es más o menos siempre el mismo.
– Integer: en programación es un tipo de datos que representa números enteros. Positivos, negativos, cero; cualquier número que no tengas decimales.
Para resolver el problema, tenemos que encontrar si existen o no dos números enteros en el array que sumados den por resultado otro número “x”. No necesitamos mostrar cuales dos son esos números de la suma, solamente decir si existen o no dentro del conjunto.
– Boolean function: se trata de una función booleana.
Es una función que regresa un valor de “verdadero” o “falso”. Para poder usarla vamos a necesitar tener presente el tema de “conectores lógicos.”
Resolución en Python:
Por búsqueda exhaustiva:
Hay varias formas de resolver este problema. La siguiente forma es por “búsqueda exhaustiva”, porque revisa todos los números en el array.
De todas maneras, creo que tengo una idea para mejorarla.
Digamos que el número que tenemos que constatar como resultado de la suma es:
“x=8”
Y el array es:
array_cifras = [1, 2, 3, 4, 5, 7, 8, 9, 10, 14, 15]
Realmente no importa conocer el orden de los números, porque ahora vamos a revisarlos todos. Pero sabemos que tenemos que descartar del array cualquier número igual o superior a 8, ya que ninguna cifra sumada a un número superior a 8 va a dar por resultado 8.
Eso lo hacemos en la primera parte de la función. Eso vuelve el programa un poco más compleja, tiene que hacer dos pasadas en lugar de una, pero creo que también lo vuelve más interesante para aprender otras cosas.
Luego continuamos probando sumar cada número del array con todos los demás para ver que combinación resulta en “x”. Pero directamente dentro del nuevo array que solo tiene las cifras que cumplen la condición de ser menores al resultado.
El código terminado es el siguiente:
def check_array(array_cifras, X): cifras_posibles = [] # array para guardar las cifras posibles. for num in array_cifras: if num < X: # buscamos las posibles cifras. cifras_posibles.append(num) # guardamos el nuevo array. for i in range(len(cifras_posibles)): for j in range(i+1, len(cifras_posibles)): # sumar cada num. if cifras_posibles[i] + cifras_posibles[j] == X: return True return False # si la suma no es posible, regresa False array_cifras = [1, 2, 3, 4, 5, 7, 8, 9, 10, 14, 15] X = 8 cifras_posibles = check_array(array_cifras, X) print(cifras_posibles)
Resolución en Bash:
Por búsqueda exhaustiva:
La solución en este caso es similar al anterior.
Revisamos exhaustivamente cada elemento en el array con todos los demás, hasta encontrar el par de números que resulten en “x”.
La principal diferencia es que en esta oportunidad no creamos un nuevo array para los números menores al resultado, simplemente lo comprobamos antes de realizar la suma.
La solución es la siguiente:
#!/bin/bash # El array para revisar array_cifras=(1 20 6 1 2 3 4 5 7 8 9 10 14 15) # la variable con la cifra de resultado x=7 # Iniciar el loop en el array for (( i=0; i<${#array_cifras[@]}; i++ )); do # comprobar si el elemento a sumar es mayor que x if [ ${array_cifras[i]} -lt $x ]; then for (( j=0; j<${#array_cifras[@]}; j++ )); do # Comprobar si la suma de dos elementosn es igual a x if [ $((array_cifras[i] + array_cifras[j])) -eq $x ]; then echo "True" exit 0 fi done fi done echo "False" exit 1
Conclusión
Con esto llegamos al final del texto sobre cómo resolver el problema de la suma de dos números enteros con distintos lenguajes de programación.
Cualquier error que encuentres en el material, por favor avisame para que pueda corregirlo.
La seguimos en el próximo apunte.
Leave a Reply