Comunidad PHPeros
Otros => Los Retos PHPeros => Mensaje iniciado por: CarlosRdrz en 20 de Octubre de 2009, 17:37:42 pm
-
Hola,
Vamos a suponer que tenemos un archivo PHP en un servidor web, lo vamos a llamar: "reto2.php".
Me gustaría que intentarais averiguar cual sera el resultado en pantalla al entrar a ese archivo de la siguiente forma:
http://www.pagina.com/reto2.php?valor=TRUE
La idea, aunque parece obvia, es que lo intenteis sacar leyendo el código, y no ejecutandolo.
Antes de que alguien pregunte, el código funciona perfectamente, no contiene errores y por supuesto tiene solución.
Aseguraos de introducir la respuesta en un QUOTE y con la letra de color BLANCA, para evitar que el resto de los compañeros vean vuestra solución antes de tiempo.
Aquí tenéis el código:
<?php
$num = (!$_GET['valor']) ? -42 : -47;
if($num % 3 == 0) $num -= 3;
else $num += 8;
for($i=0;$i<abs($num);$i++) {
while(TRUE) {
$num -= -2;
break;
}
}
echo $num;
?>
Algunos consejos:
- Usad papel y bolígrafo.
- Cuidado con los signos en las restas y las sumas, y en la solucion.
- Mirad con cuidado ambos bucles.
Pista: http://www.phperos.net/foro/index.php/topic,4202.msg27351.html#msg27351
Solución: http://www.phperos.net/foro/index.php/topic,4202.msg27417.html#msg27417
GANADOR: Tope
Pronto mas retos,
Saludos
-
107
No estoy seguro...
-
No, no es correcto, lo siento.
Cambié la dificultad a media.
Saludos
-
43????
Pues si es dificilillo :S
-
Tampoco es correcto, sigue intentándolo :)
Me alegra que sea un poco complicado, si fuese fácil entonces no supondría ningún reto, aunque la verdad tampoco es de lo más difícil, solo debes preocuparte de que valor tiene la variable que buscas antes y después del bucle.
Os dejo además la primera pista del reto:
En el bucle for intervienen dos variables: $i y $num, y contiene además un bucle while.
El bucle while es solo un "truco visual", en realidad no importa que ese bucle esté ahí o no, puesto que SIEMPRE se va a ejecutar una y solo una vez el código de su interior.
Sabemos que $num es negativa, y que en cada iteraccion del bucle a $i se le suma 1 unidad y a $num se le SUMAN (- * - = +) 2 unidades, y por lo tanto, su valor absoluto decae en 2 unidades.
Además, tambien sabemos que la condición para que el bucle continúe es: $i < abs($num), que sería equivalente a esta expresion: $i > $num.
Por lo tanto, el resultado debe estar entre el valor inicial de $i (0, lo definimos al iniciar el bucle for) y el valor inicial de $num, así que respuestas mayores de 0 y menores de -47 quedan eliminadas.
A ver si se anima mas gente, que un poco de ejercicio mental le viene bien a todo el mundo!
Prometo que el siguiente reto será mas enfocado a la programación de una solución y no tanto a cálculos matemáticos :)
Saludos!
-
Me sige saliendo mas o menos lo mismo...
A mi me sale que es -42 la variable inicial de $num
luego es divisible entre 3 x tanto keda -45
el for se ejecuta 45 veces desde 0 asta 44
se suman 2 x k menos por menos = mas
osea k seria -45+2*45 = -45+90 = 45
me sale 45....
-
Me sale 43 a mi tambien O.0
-
En general no vais muy desencaminados, pero algo se os escapa, concretamente en el condicional del bucle.
Ánimo, estáis cerca!
Saludos :)
-
A ver si esta vez...
como el num se incrementa, el ABS es mas bajo tambien, x el for quedaria:
for($i=0;$i<45...
for($i=1;$i<43...
asi hasta que el i sea mayor que el valor absoluto, y seria...
en 10 "pasos" a i se le abran sumado 10 (i=10)
a 45 se le abran restado 20 (45-20=25)
en otros 5...
i=15
abs($num) = 15
por tanto $num es -15...
-
Ese sería el resultado si el primer condicional ternario diera como resultado true.
¿Estas seguro del valor que posee $num antes de entrar al bucle for?
Como habrás podido adivinar estas muy muy cerca del resultado.
Saludos
-
-13 eso es lo q me da
-
La respuesta consiste en el resultado y además una explicación que lo explique.
Todos podemos sacar el resultado ejecutando el código, pero la única persona que será ganadora del reto será la que de el resultado correcto junto a una explicación que diga como se va ejecutando el código y llegando a la solución.
Saludos
-
Creo que la explicacion tiene que ser así
EMPEZABAMOS CON -47
Luego le sumabamos 8, se queda en -39
Luego haciamos un for desde 0 hasta el valor absoluto de $num (de -39 es 39)
Le restamos 2 en el for (el while no sirve para nada) durante 13 veces que es el resultado que nos da (no es casualidad, esque $num va descenciendo de dos en en dos y el for "se va haciendo mas corto"
Entonces, esto explicado en el codigo seria
$num = (!$_GET['valor']) ? -42 : -47; // El valor sera true, por lo tanto es -47
if($num % 3 == 0){ // Si -47 entre 3 es entero (que no lo es)
$num -= 3;
} else {
$num += 8; // Se le suman 8, es decir se queda en -39
}
for($i=0; $i < abs($num);$i++) { // Se hace un for desde 0 hasta el número de veces (que es el num pero para ponerlo en positivo, con abs() se obtiene el absoluto
while(TRUE) { // El while está de adorno ;)
$num -= -2; // Se restan, -2 cada vez y por lo tanto menos por menos es más, es decir que es como si sumaramos 2 todo el rato
break;
}
}
// Al final tendriamos -13
Y un codigo que sirva de ayuda para mi explicacion está en http://www.topecb.es/reto2.php?valor=TRUE funcionando
<?php
$num = (!$_GET['valor']) ? -42 : -47;
echo $num;
if($num % 3 == 0){
$num -= 3;
echo "-3";
} else {
$num += 8;
echo "+8";
}
echo "=".$num."<br>";
for($i=0; $i < abs($num);$i++) {
while(TRUE) {
$num -= -2;
echo "-(-2)";
break;
}
}
echo "=26<br>";
echo "-39+26=".$num;
?>
Saludos
-
Siento decirte que -39-26 da de resultado -65 y no -13.
Aunque es un fallo muy tonto no te puedo poner como ganador del reto, pero poco te falta, corrigelo y listo :)
Saludos!
-
Gracias por avisar :P
Ahora ya está corregido (he editado el mensaje y cambiado lo de reto2.php en mi servidor)
Entonces...?
Saludos
-
Perfecto.
Enhorabuena, has sido la primera persona en resolver el reto :)
Si no te importa colocaré también mi propia explicación del código para aportar algo más al tema.
SOLUCIÓN:
<?php
$num = (!$_GET['valor']) ? -42 : -47;
/** El codigo comienza aquí, dijimos que entrariamos al archivo con ?valor=TRUE, así que la variable $_GET['valor'] será true, sin embargo, el ! de delante cambia el valor por false, así que la variable $num queda definida como -47 **/
if($num % 3 == 0) $num -= 3;
else $num += 8;
/** Para empezar, % es un operador que realiza la operación y devuelve el resto, por lo tanto, el condicional quiere decir: Si el resto al dividir $num entre 3 da como resultado es 0... Nuestro numero es -47. Si conoces las reglas de divisibilidad matemáticas sabrás que 47 no es divisible entre 3 porque 7 + 4 no es multiplo de 3, y por lo tanto el resto es distinto de 0, y a la variable se le suma 8. Por lo tanto $num ahora vale -39 **/
/** Comenzamos con el bucle, esta es la única parte mas complicada de todo el código. Para empezar observamos que definimos $i como 0, y el condicional que lo opera es $i < abs($num). abs() es una función que halla el valor absoluto del numero. Por lo tanto, si el numero es -45, quedará como 45. También podemos observar que en cada iteración del bucle a la variable $i se le suma 1 unidad **/
for($i=0;$i<abs($num);$i++) {
/** Como bien ha dicho Tope, este while es de pega, pues siempre se va a ejecutar una única vez, si eliminamos esta línea, la línea de break y el } de justo debajo, el
resultado del código sería el mismo **/
while(TRUE) {
$num -= -2; // Observamos que en cada iteración se le SUMAN (Ten en cuenta que menos por menos es mas) 2 unidades a la variable $num.
break;
}
}
/** Bien, como sabemos, en cada iteración se le suma una unidad a la variable $i, y dos unidades a la variable $num, por lo tanto, deducimos que nuestro condicional esta 3 unidades mas cerca de ser cumplido en cada iteración del bucle. Antes de comenzar el bucle la variable $i vale 0 y la variable $num -39 (Quedando como valor absoluto 39). Vamos a suponer que la linea que suma 2 unidades a la variable $num no existe, y la variable $i se sigue incrementando en 1 unidad cada iteracion ¿Cuantas iteraciones deberia dar el bucle para ser terminado? Exactamente, 39 iteraciones. Pero no es así, esa linea existe y por lo tanto ademas de añadir una unidad a $i, añade otras dos mas a $num. Esto es equivalente a añadir 3 unidades a $i, por lo tanto, el numero de iteraciones que tiene que realizar es: 39/3 = 13 iteraciones.
Si el bucle tiene que hacer 13 iteraciones para terminar, y en cada iteracion se le suma a la variable $num 2 unidades: 13*2 = 26 unidades sumadas en total, así que el numero que buscamos será -39+26=-13.
**/
echo $num;
?>
Espero que se entienda,
Saludos