Autor Tema: Reto #2 - Operaciones matemáticas y estructuras de control  (Leído 3229 veces)

Desconectado CarlosRdrz

  • Moderador Global
  • PHPero Master
  • *****
  • Mensajes: 2.505
  • Karma: 131
  • Sexo: Masculino
  • A.k.a. TLX
    • Ver Perfil
Reto #2 - Operaciones matemáticas y estructuras de control
« 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[&#39;valor&#39;]) ? -42 : -47;

if($num == 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
« Última modificación: 22 de Octubre de 2009, 21:06:26 pm por TLX »
La dedicación de mi respuesta sera directamente proporcional a la dedicación de tu pregunta.
Hacer códigos que entiendan las máquinas es fácil, lo difícil y realmente útil es hacer códigos que entiendan las personas.
http://twitter.com/CarlosRdrz
http://www.carlosrdrz.es

Comunidad PHPeros

Reto #2 - Operaciones matemáticas y estructuras de control
« en: 20 de Octubre de 2009, 17:37:42 pm »

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Re:Reto #2 - Operaciones matemáticas y estructuras de control
« Respuesta #1 en: 21 de Octubre de 2009, 15:38:41 pm »
Citar
107

No estoy seguro...

Desconectado CarlosRdrz

  • Moderador Global
  • PHPero Master
  • *****
  • Mensajes: 2.505
  • Karma: 131
  • Sexo: Masculino
  • A.k.a. TLX
    • Ver Perfil
Re:Reto #2 - Operaciones matemáticas y estructuras de control
« Respuesta #2 en: 21 de Octubre de 2009, 18:47:45 pm »
No, no es correcto, lo siento.

Cambié la dificultad a media.

Saludos
La dedicación de mi respuesta sera directamente proporcional a la dedicación de tu pregunta.
Hacer códigos que entiendan las máquinas es fácil, lo difícil y realmente útil es hacer códigos que entiendan las personas.
http://twitter.com/CarlosRdrz
http://www.carlosrdrz.es

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Re:Reto #2 - Operaciones matemáticas y estructuras de control
« Respuesta #3 en: 21 de Octubre de 2009, 19:28:44 pm »
Citar
43????

Pues si es dificilillo :S

Desconectado CarlosRdrz

  • Moderador Global
  • PHPero Master
  • *****
  • Mensajes: 2.505
  • Karma: 131
  • Sexo: Masculino
  • A.k.a. TLX
    • Ver Perfil
Re:Reto #2 - Operaciones matemáticas y estructuras de control
« Respuesta #4 en: 21 de Octubre de 2009, 20:05:08 pm »
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:
Citar
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!
« Última modificación: 21 de Octubre de 2009, 20:09:18 pm por TLX »
La dedicación de mi respuesta sera directamente proporcional a la dedicación de tu pregunta.
Hacer códigos que entiendan las máquinas es fácil, lo difícil y realmente útil es hacer códigos que entiendan las personas.
http://twitter.com/CarlosRdrz
http://www.carlosrdrz.es

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Re:Reto #2 - Operaciones matemáticas y estructuras de control
« Respuesta #5 en: 21 de Octubre de 2009, 20:36:07 pm »
Me sige saliendo  mas o menos lo mismo...
Citar

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....

« Última modificación: 21 de Octubre de 2009, 20:38:09 pm por westwest »

Desconectado Siquillote

  • PHPero Master
  • ******
  • Mensajes: 4.229
  • Karma: 179
  • Sexo: Masculino
    • Ver Perfil
Re:Reto #2 - Operaciones matemáticas y estructuras de control
« Respuesta #6 en: 21 de Octubre de 2009, 20:36:39 pm »
Me sale 43 a mi tambien O.0

#Fdo. Physlet

Desconectado CarlosRdrz

  • Moderador Global
  • PHPero Master
  • *****
  • Mensajes: 2.505
  • Karma: 131
  • Sexo: Masculino
  • A.k.a. TLX
    • Ver Perfil
Re:Reto #2 - Operaciones matemáticas y estructuras de control
« Respuesta #7 en: 21 de Octubre de 2009, 20:42:40 pm »
En general no vais muy desencaminados, pero algo se os escapa, concretamente en el condicional del bucle.

Ánimo, estáis cerca!
Saludos :)
La dedicación de mi respuesta sera directamente proporcional a la dedicación de tu pregunta.
Hacer códigos que entiendan las máquinas es fácil, lo difícil y realmente útil es hacer códigos que entiendan las personas.
http://twitter.com/CarlosRdrz
http://www.carlosrdrz.es

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Re:Reto #2 - Operaciones matemáticas y estructuras de control
« Respuesta #8 en: 21 de Octubre de 2009, 21:03:31 pm »
Citar

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...


Desconectado CarlosRdrz

  • Moderador Global
  • PHPero Master
  • *****
  • Mensajes: 2.505
  • Karma: 131
  • Sexo: Masculino
  • A.k.a. TLX
    • Ver Perfil
Re:Reto #2 - Operaciones matemáticas y estructuras de control
« Respuesta #9 en: 21 de Octubre de 2009, 21:21:18 pm »
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
La dedicación de mi respuesta sera directamente proporcional a la dedicación de tu pregunta.
Hacer códigos que entiendan las máquinas es fácil, lo difícil y realmente útil es hacer códigos que entiendan las personas.
http://twitter.com/CarlosRdrz
http://www.carlosrdrz.es

Desconectado kry0ster

  • PHPerit@
  • *
  • Mensajes: 16
  • Karma: 0
  • Sexo: Masculino
  • PHP programmer
    • Ver Perfil
    • .:: Kry0ster ::. Programación y seguridad informática
Re:Reto #2 - Operaciones matemáticas y estructuras de control
« Respuesta #10 en: 22 de Octubre de 2009, 04:17:27 am »
Citar
-13 eso es lo q me da

Desconectado CarlosRdrz

  • Moderador Global
  • PHPero Master
  • *****
  • Mensajes: 2.505
  • Karma: 131
  • Sexo: Masculino
  • A.k.a. TLX
    • Ver Perfil
Re:Reto #2 - Operaciones matemáticas y estructuras de control
« Respuesta #11 en: 22 de Octubre de 2009, 15:44:59 pm »
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
La dedicación de mi respuesta sera directamente proporcional a la dedicación de tu pregunta.
Hacer códigos que entiendan las máquinas es fácil, lo difícil y realmente útil es hacer códigos que entiendan las personas.
http://twitter.com/CarlosRdrz
http://www.carlosrdrz.es

Desconectado Tope

  • PHPero Experto
  • *****
  • Mensajes: 540
  • Karma: 23
  • Sexo: Masculino
  • Programador PHP
    • Ver Perfil
    • www.Info-Keko.Es
Re:Reto #2 - Operaciones matemáticas y estructuras de control
« Respuesta #12 en: 22 de Octubre de 2009, 15:55:35 pm »
Creo que la explicacion tiene que ser así

Citar
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

Citar
$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

Citar
<?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

« Última modificación: 22 de Octubre de 2009, 19:26:38 pm por Tope »
Un Saludo, Tope >> Programador FIJO en PHPeros

Desconectado CarlosRdrz

  • Moderador Global
  • PHPero Master
  • *****
  • Mensajes: 2.505
  • Karma: 131
  • Sexo: Masculino
  • A.k.a. TLX
    • Ver Perfil
Re:Reto #2 - Operaciones matemáticas y estructuras de control
« Respuesta #13 en: 22 de Octubre de 2009, 16:24:57 pm »
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!
La dedicación de mi respuesta sera directamente proporcional a la dedicación de tu pregunta.
Hacer códigos que entiendan las máquinas es fácil, lo difícil y realmente útil es hacer códigos que entiendan las personas.
http://twitter.com/CarlosRdrz
http://www.carlosrdrz.es

Desconectado Tope

  • PHPero Experto
  • *****
  • Mensajes: 540
  • Karma: 23
  • Sexo: Masculino
  • Programador PHP
    • Ver Perfil
    • www.Info-Keko.Es
Re:Reto #2 - Operaciones matemáticas y estructuras de control
« Respuesta #14 en: 22 de Octubre de 2009, 19:27:43 pm »
Gracias por avisar :P

Ahora ya está corregido (he editado el mensaje y cambiado lo de reto2.php en mi servidor)

Entonces...?

Saludos
Un Saludo, Tope >> Programador FIJO en PHPeros