Playground: Reduce el número a 1 en la menor cantidad de pasos
Clase 25 de 30 • Desafíos de Pensamiento Lógico
Contenido del curso
andres gustavo arboleda bermudez
Carlos Daniel Lopez
Vladimir Mena Barreto
Yerson David Aguilar Martinez
Luis Humberto Osorio Quiceno
Yerson David Aguilar Martinez
Rubén Hernández Hernández
Edwin Absalón Martinez Moreno
Alonso Americo Molero Colina
Luis Castro
Hans Yangali
Gustavo Rios
EDWIN FABIAN LEON ARIAS
Lester José Palacios Tercero
Willy León
Marcos Monteverde
Brayan David Rodríguez Quintero
Lucas Aragón
Jorge Díaz Sagot
Maria Zerpa
Erasmo Herrera
Lucas Soto
HAROLD WALTER PALACIOS GARCIA
Javier Orlando Herrera Rodríguez
Luis Humberto Osorio Quiceno
Juan Luis López Pérez
Jhonatan David Giraldo Toro
Laura Arias Sanchez
Samuel Arias
EDWIN ALEXANDER PARRA GOMEZ
Nicolás Plaza
creo que estas pruebas son para profesionales porque los que estamos empezando lo digo por mi caso en particular estoy es anotando las soluciones y tratando de entender de donde sale cada cosa porque la verdad esta dificil.
comparto contigo que para los que estamos iniciando de cero, nos falta aprender muchos conceptos de sintaxis para poder resolver este desafio... es una pena, ademas no encuentro quien me explique la solucion con los conceptos paso a paso
También ser un poco más especificos en el requerimiento.
Mi solución.
export function solution(num) { let resp = 0; while (num > 1) { if (num % 2 === 0) { num = num / 2; } else if (num % 4 == 3) { num++; } else { num--; } resp++; } return resp; }
hay contados casos en los que es mejor sumar que restar, según mis pruebas esos números fueron el 7, 15 y 23
Yerson, un saludo. A que se debe el uso del módulo de 4? Entiendo que la división es en 2. Gracias
@lhosorio traté de encontrar patrones entre estos números donde sumar era la mejor opción, fui resolviendo cada caso y vi que en el 7, el 15 y el 23 era mejor sumar. Con esto visto, trate de encontrar qué tenían en común estos números, la verdad no encontraba nada en común, fui probando con modulo 3 y luego con 4 (probé con 3 porque no se me ocurría nada) y vi que estos números con modulo 4 entregaban 3 de residuo/resto, al fin había encontrado un patrón, por eso pregunto si el numero con modulo 4 entrega 3, así sabré que es mejor sumar, por supuesto, hay otros números que aplicando modulo 4 da 3 (por ejemplo el 11, 19 y 27) pero en esos casos da igual si se suma o resta.
💚SOLUCIÓN CON EXPLICACIÓN 💚
🛡️MURO ANTI-SPOILERS🛡️
!CAT TYPING La dificultad de este ejercicio radica en saber si es mejor SUMAR o RESTAR cuando el número que se nos presenta es impar. Lo ideal es hacer diferentes pruebas de escritorio para nosotros e ir viendo paso a paso el comportamiento. Podemos ayudarnos de una tabla en donde vayamos registrando cuantos pasos se necesitan para llegar a 1.
🎯TIP1:
Para hacer este proceso más sencillo en el momento de encontrar un número IMPAR, saltarselo y hacer la prueba con el número siguiente (que será PAR) de la siguiente manera:
pasos del número siguiente + 1 .pasos del número anterior + 1.En este caso con el número 3 conviene elegir RESTAR ya que sumaríamos 1 + 1 quedando de la siguiente manera:
🎯TIP2:
Cuando estemos calculando los números PARES muchas veces nos daremos cuenta que al dividir por primera vez en 2 nos da un número que muy posiblemente ya habíamos calculado sus pasos (Ejemplo: 6 / 2 = 3) por lo que bastaría sumarle 1 a los pasos del número resultado de la división:
Pasos de 6 = ( Pasos de 3 ) + 1 Pasos de 6 = 2 + 1 Pasos de 6 = 3
👁️OBSERVACIÓN:
Si continuamos la tabla como a continuación:
🔑DEVELANDO EL SECRETO
En mi caso, decidí continuar mi tabla hasta el número 40 donde encontré que en los números [15, 23, 31, 39] es más factible SUMAR.
MÓDULO (%) (recordemos que la operación módulo es el residuo de la división entre 2 números) con los números [15, 23, 31, 39] y los números del 2 al 7 de la siguiente manera:
15%2 = 1 23%2 = 1 31%2 = 1 39%2 = 1 15%3 = 0 Y así sucesivamente...
De modo que, al registrarlos en una tabla (o en mi caso con ayuda de Excel) ¡Encontramos nuestro famoso patrón!
3.
Es por ello que podemos ocupar este dato para integrarlo en nuestro código, donde cuando el número sea IMPAR además verifiquemos si el num % 4 == 3 entonces sumamos , de lo contrario restamos:
// Si el modulo 4 es == 3 SE SUMA if (num % 4 == 3) num++; else num--; }
Puedes ver el código completo más abajo...
🎖️CONCLUSIÓN
Como te darás cuenta, la mayoría de estos ejercicios se trata de encontrar patrones por lo que te invito a no darte por vencido e intentar ocupar cualquier concepto que se te venga a la mente, ya sea matemático o puramente visual. Espero este aporte te haya ayudado a comprender el problema 💚
👾CÓDIGO
export function solution(num) { let pasos = 0; while (num > 1) { if (num % 2 == 0) { //PAR num = num / 2 } else { // IMPAR // Si el modulo 4 es == 3 SE SUMA if (num % 4 == 3) num++; else num--; } //AUMENTAMOS LOS PASOS pasos++; } return pasos `
¿Cómo se supone que sumando se va a convertir en uno? eso no lo tengo nada claro
Genio!
La función tiene un bucle while que se ejecuta mientras num sea mayor que 1. En cada iteración del bucle, se incrementa un contador llamado count y se realizan varias operaciones condicionales basadas en el valor de num.
.
if (num % 2 === 0). Aquí, se está utilizando el operador módulo (%) para obtener el resto de la división de num entre 2. Si este resto es igual a 0, significa que num es divisible entre 2. En este caso, se divide num entre 2 mediante num = Math.floor(num / 2); y se imprime un mensaje indicando el nuevo valor de num en la consola.
.else if (num % 4 === 1 || num === 3). Aquí, se está verificando dos cosas. Primero, si el resto de la división de num entre 4 es igual a 1. Segundo, si num es igual a 3. Si se cumple alguna de estas dos condiciones, se resta 1 a num mediante num -= 1; y se imprime un mensaje indicando el nuevo valor de num en la consola.
.else donde se suma 1 a num mediante num += 1; y se imprime un mensaje indicando el nuevo valor de num en la consola.
.while, la función devuelve el valor del contador, count.
.export function solution(num) { // Initialize a count variable to keep track of the number of steps let count = 0; // Loop while the number is greater than 1 while (num > 1) { // Increment the count at the start of each iteration count++; // If the number is divisible by 2, divide it by 2 if (num % 2 === 0) { num = Math.floor(num / 2); console.log("Mádulo 2 de n = 0; " + num) } // If the number is equal to 3 or the remainder of dividing it by 4 is 1, subtract 1 else if (num % 4 === 1 || num === 3) { num -= 1; console.log("Mádulo 4 de n = 1 || n = 0; " + num) } // If none of the above conditions are met, add 1 to the number else { num += 1; console.log("n + 1; " + num) } } // return the count variable return count; }
que crack gracias.
Muchas gracias me ayudo bastante
cada vez que pasa un reto entiendo menos. a alguien más le pasa?
Hola compañeros, es un echo que el ejercicio está mal explicado respecto a que es lo que se requiere, al inicio yo pensaba que lo que se pedía era que la función recibiera un número y lo redujera a 1, pero no es esto lo que se requiere. Realmente el ejercicio lo que solicita es retornar el número de pasos con el que la función redujo a 1 el número inicial.
Aquí les comparto mi solución al ejercicio ya revisado y validado, me costo mucho lograrlo pero pude hacerlo
Ha manera de consejo para el ejercicio, lo más difícil está en saber en que momento sumar la unidad o restar la unidad.
Yo también pensaba lo mismo! No sabía porque el Output daba 5.
Si que me costo!! Aqui mi solucion:
<export function solution(num) { let response = 0 while (num > 1) { if (num % 2 === 0) { num = num / 2 } else if (num % 2 != 0) { if ((((num + 1) / 2) % 2) != 0) { num-- } else { num++ } } response++ } return response } >
No soy un supermatematico, pero dadas las condiciones jajaja esto también es una respuesta:
num=num/num
fue lo primiero que pense! jeje
Mi solución abajo
Funciona haciendo los dos puntos iniciales de la guía. Y para reducir números más grandes más rápido, siempre se suma 1 hacia número múltiplos de 4, o si no se resta. . . . .
export function solution(num) { let pasos = 0; while ( num != 1 && num != 0 ) { if ( num % 2 ) { ((num + 1) % 4) ? --num : ++num ; } else { num /= 2; } ++pasos; } console.log(num) return pasos; }
Dios mioooooo!!! Pase dos dias tratando de resolver el problema y no pude lograrlo sola. Si estas igual que yo, no te quedes aca!! avanza, mira los aportes, aprende de los demas. No hagan como yo, no se puede aprender en 1 dia como resolver problemas que se logra solo con la practica y experiencia. Tenia una idea de como lograrlo, hice borradores, corridas en frio, todo y aun asi me costo mucho. Aunque la logica que uso en mi codigo es muy diferente a los demas aportes, es la que puedo dominar hasta el momento. La verdad que los demas aportes se me hicieron dificiles de leer en cuanto a la logica que utilizaron xD, mis felicitaciones!! estan a otro nivel xD jejeje. Espero poder orientar a alguien con este aporte. Y tranquilo/a si aun no lo logras, no dejes que la frustracion te ciegue, todo toma un tiempo, no hay que sentirse mal. Yo tuve que acudir a mi esposo (developer) para que me orientara. Este es solo un paso mas para aprender.
export function solution(n) { let i = 0 do { if (n % 2 === 0) { n = n / 2 } else { let countSuma = dividirNumeroImparConSuma(n) let countResta = dividirNumeroImparConResta(n) if (countSuma < countResta) { n += 1 } else { n -= 1 } } i++ } while (n > 1); return i } function dividirNumeroImparConSuma(n) { let count = 0 do { if (n % 2 === 0) { n = n / 2 } else { n += 1 } count++ } while (n > 1); return count } function dividirNumeroImparConResta(n) { let count = 0 do { if (n % 2 === 0) { n = n / 2 } else { n -= 1 } count++ } while (n > 1); return count }
Entramos a la funcion solution() y mientras n sea mayor a 1 se correra el ciclo dowhile() . Que tengo que evaluar? si el numero es par if (n % 2 === 0). Si no es par entonces debo considerar si sumo o resto 1.
Dependiendo cual de los dos metodos (n+1 o n-1) sea el mas corto, decidire si se suma o se resta dentro del ciclo dowhile() en la funcion solution().
Para tomar esa decision, guardo en una variable (countSuma y countResta) las vueltas/iteraciones/ciclos que debo realizar para llevar el numero que se introduce hasta 1. Aca entran las funciones dividirNumeroImparConSuma() y dividirNumeroImparConResta(). Cada una tiene un contador interno count, el cual es retornado al salir de su respectivo ciclo dowhile() y se alojan en las respectivas variables countSuma y countResta.
Una vez se obtienen los count se compara cual tiene menos pasos. Si el de sumar es menor al de restar entonces sumo, sino resto 1 al n.
El contador i es el que muestra cuantos pasos en total se realizan para reducir un numero a 1. i contabiliza como un paso la suma o resta de 1 para convertir el numero impar en par, y asi poder dividirlo entre 2 hasta que el cociente sea 1.
Como dije es la logica que puedo comprender por el momento. Espero poder orientar a alguien :).
La instrucción es muy poco clara, no dice que el objetivo en mostrar los paso en lo que se redujo el numero
siento que para este ejercicio igual se estaria necesitando de algunos ejemplos mas para poder llegar a una mejor conclusion ya que siento que es un poco redundante el enunciado sumandole las operaciones que podemos hacer. ya que el input y el output me hacen confundir mas
¿Hay un error aqui?? No me sale nada.
¿Que conocimiento previo debo tener para entender que lo que busca el enunciado es que la función retorne el número de pasos y no 1 y el número de pasos? ¿Cómo puedo asegurarme de que sea el menor número de pasos? Le pregunté a chatGPT e inmediatamente retorno la solución adecuada así que creo que algo me estoy perdiendo
Un saludo. Creo que falta mas detalle al enunciado. A que hace referencia sacar módulo de 4?.. por que comparar con 3? Quedan dudas. Gracias.
con un poco de ayuda pude llegar a la siguiente conclusión en python:
num = int(input("ingrese un numero para saber si es par o impar: ")) if num % 2 == 0: print("su numero es par") while num > 1: num -= 1 print(num) print("su numero ahora es: " , num) else: print("no es par ") while num > 1: num -= 2 print(num) ```num = int(input("ingrese un numero para saber si es par o impar: "))if num % 2 == 0: print("su numero es par") while num > 1: num -= 1 print(num) print("su numero ahora es: " , num) else: print("no es par ") while num > 1: num -= 2 print(num) 
Hola, les comparto mi solución del ejercicio; puede ser difícil pero lo difícil es lo que más enseña. Soy ingeniero electrónico entonces tengo experiencia; Intenten entender la solución, pero no se preocupen, con el tiempo lograran solucionarlo por sí mismos. (^-^)/
Hacemos la condición: Sí num es par (num % 2 == 0) entonces haga num/2
En caso contrario pregunte Sí (num+1) / 2 da como resultado par, entonces haga num+1
Sí no da resultado par entonces haga num-1
durante cada ciclo del While se incremeta la variable steps + 1
Limitamos toda la logica con el While para que se ejecute hasta que num sea igual a 1
export function solution(num) { let steps = 0 while (num != 1) { if (num % 2 == 0) { num = num / 2 } else if (((num + 1) / 2) % 2 == 0) { num = num + 1 } else { num = num - 1 } steps++ } return steps }
Un único cambio para que funcione: de (num != 1) a (num > 1)
Uno que disque aprendiendo los fundamentos de programación y ya le ponen retos de estos, me parece que no tiene sentido.
PLATZIIII más pedagogia que es esto por favor, uds pueden hacer una mejor labor.
Si estamos acá es porque aún estamos construyendo las bases del codigo
La guia del ejercicio no se entiende por si mismos, toca hacer una prueba o leer en los comentarios para saber que el 5 de la salida (en el ejemplo de la guia) es lo que toca retornar.