Autor Tema: Ponganme retos, no matemáticos.  (Leído 3803 veces)

Desconectado Animus

  • PHPero Avanzado
  • ****
  • Mensajes: 273
  • Karma: 1
  • Sexo: Masculino
  • Aprende a aprender, el resto vendrá solo.
    • Ver Perfil
Ponganme retos, no matemáticos.
« en: 09 de Abril de 2012, 11:22:45 am »
Hola, me estoy aburriendo un poco y quiero hacer un proyecto pero no se el qué, entonces quiero que me pongan un reto pero no matemático:

- Medio - [Dificil-Bajo]
- Ya sea funciones, classes, da igual.

Expliquense bien, puede participar cualquiera, no pongo esto en retos ya que lo considero como una ayuda, donde los demás pueden aportar y aprender.


La red social de tus sueños.


Comunidad PHPeros

Ponganme retos, no matemáticos.
« en: 09 de Abril de 2012, 11:22:45 am »

Desconectado CarlosRdrz

  • Moderador Global
  • PHPero Master
  • *****
  • Mensajes: 2.505
  • Karma: 131
  • Sexo: Masculino
  • A.k.a. TLX
    • Ver Perfil
Re:Ponganme retos, no matemáticos.
« Respuesta #1 en: 09 de Abril de 2012, 12:24:42 pm »
Hola!

Te doy un array de 10 números al azar, ejemplo:
$nums = array(23, 1, 56, 22, 12, 22, 0, 67, 4, 10);

Ordénalos de menor a mayor, de forma automática, de forma que si te paso un array diferente de números (en tamaño o en contenido), el código siga funcionando perfectamente sin cambiar nada en el algoritmo.

El algoritmo de ordenación debes crearlo tú mismo (no uses funciones de ordenación de PHP, como sort)
Si estás muy perdido busca en google sobre "bubble sort" o "ordenación burbuja". Busca el algoritmo, no la implementación en PHP, ¡ tienes que implementarlo tu !
Hay otras miles de formas de ordenar aparte de la búrbuja, busca más métodos y intenta implementar varios de ellos ¿ Cuál te parece mejor y por qué ? ¿ Capaz de hacer pruebas de rendimiento ? (Cuanto tiempo tardan los diferentes algoritmos en ejecutarse con diferentes tamaños de arrays y demás).

Puedes usar clases, funciones, o lo que quieras. Eres libre.

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 Animus

  • PHPero Avanzado
  • ****
  • Mensajes: 273
  • Karma: 1
  • Sexo: Masculino
  • Aprende a aprender, el resto vendrá solo.
    • Ver Perfil
Re:Ponganme retos, no matemáticos.
« Respuesta #2 en: 09 de Abril de 2012, 16:45:51 pm »
Por favor, nada de matemáticas, o_O, alguna solución empresarial no sé algo así, sabes, de romperte la cabeza pero no matemáticas, he investigado sobre bubble sort, he hecho casi algo parecido, pero a mi no me funcionó, xD


La red social de tus sueños.


Desconectado Animus

  • PHPero Avanzado
  • ****
  • Mensajes: 273
  • Karma: 1
  • Sexo: Masculino
  • Aprende a aprender, el resto vendrá solo.
    • Ver Perfil
Re:Ponganme retos, no matemáticos.
« Respuesta #3 en: 09 de Abril de 2012, 16:50:27 pm »
(Ponme otro porfa )

Mira, pero l oque no entiendo, por que crea un primer bucle, restando y luego el otro sumando :S

Código: [Seleccionar]
<?php
function bubbleSort ($items) {  
    
$size count($items);  
    for (
$i=0$i<$size$i++) {  
         for (
$j=0$j<$size-1-$i$j++) {  
              if (
$items[$j+1] < $items[$j]) {  
                  
arraySwap($items$j$j+1);  
              }  
         }  
    }  
    return 
$items;  
}  
function 
arraySwap (&$arr$index1$index2) {  
    list(
$arr[$index1], $arr[$index2]) = array($arr[$index2], $arr[$index1]);  
}  
?>

(http://www.codecodex.com/wiki/Bubble_sort#PHP)

EDIT:
Código: [Seleccionar]
<?php
return ($a $b) ? -1;
?>


Que hace el ? y el :, para que sirven?
« Última modificación: 09 de Abril de 2012, 17:22:28 pm por Animus »


La red social de tus sueños.


Desconectado CarlosRdrz

  • Moderador Global
  • PHPero Master
  • *****
  • Mensajes: 2.505
  • Karma: 131
  • Sexo: Masculino
  • A.k.a. TLX
    • Ver Perfil
Re:Ponganme retos, no matemáticos.
« Respuesta #4 en: 09 de Abril de 2012, 17:44:38 pm »
Matematico?? Si solo es ordenar números! No tiene nada de matemáticas!
Es solo pensar un poco y ver como conseguir el objetivo.

El bubblesort viene explicado bien en este video (en inglés, aunque igual sin leerlo también lo entiendes)
http://www.youtube.com/watch?v=vxENKlcs2Tw
También explican el quick sort.

Se usan dos bucles porque el algoritmo se desarrolla de esa forma.
Hay que realizar S veces (S es el tamaño del array) una comparación de los números los unos con los otros, por pares, hasta la posición N

Si lees bien esa frase y lo piensas, necesitas dos bucles para hacer eso.
Uno para contar las veces y otro para comparar los números entre sí hasta la posición N.

La posición N va cambiando porque en cada iteración del primer bucle, un elemento (al menos) se habrá ordenado al final del array.
Imagina que el primer numero es el mas grande de todos, al final de la primera iteración del primer bucle estará al final del array, y por lo tanto ese elemento ya no hace falta ordenarlo, así que se reduce N en 1, para que no se compare.

En fin, es mas difícil explicarlo que conocerlo. Es más fácil si ves ejemplos. En youtube hay muchos videos explicandolo, como el que te he pasado.

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 Animus

  • PHPero Avanzado
  • ****
  • Mensajes: 273
  • Karma: 1
  • Sexo: Masculino
  • Aprende a aprender, el resto vendrá solo.
    • Ver Perfil
Re:Ponganme retos, no matemáticos.
« Respuesta #5 en: 10 de Abril de 2012, 19:40:46 pm »
Vale, gracias por darme ánimos, lo logré sin mirar ningún ejemplo elaborando mi algoritmo, es una caca pero funciona, se puede mejorar, sí. ^^


$nums 
= array(23156221222067410);
    
   for(
$i;$i<=count($nums);$i++){
       
       do{
           
           
$o =$i+1;
           echo 
$nums["$i"].&#39; * &#39;. $nums["$o"].&#39; = &#39;.$nums["$i"]*$nums["$o"].&#39;<br />&#39;;
           
break;
           
       }while(
$o>$i);
            
   }


Dame más por favor :P


La red social de tus sueños.


Desconectado Slipknot

  • PHPer@
  • **
  • Mensajes: 60
  • Karma: 0
  • Sexo: Masculino
    • Ver Perfil
Re:Ponganme retos, no matemáticos.
« Respuesta #6 en: 15 de Abril de 2012, 08:19:03 am »
Que hace el ? y el :, para que sirven?

Es un condicional compacto (no recuerdo si asi se llama :P) y sirve al igual que if...else. Ejemplo:

echo ($a $b) ? -1;

if($a $b) { echo -1; } else { echo 1; }
"He omitido intencionalmente los acentos en la mayoría de mis mensajes"

Desconectado Siquillote

  • PHPero Master
  • ******
  • Mensajes: 4.229
  • Karma: 179
  • Sexo: Masculino
    • Ver Perfil
Re:Ponganme retos, no matemáticos.
« Respuesta #7 en: 15 de Abril de 2012, 14:49:52 pm »

Vale, gracias por darme ánimos, lo logré sin mirar ningún ejemplo elaborando mi algoritmo, es una caca pero funciona, se puede mejorar, sí. ^^


$nums 
= array(23156221222067410);
    
   for(
$i;$i<=count($nums);$i++){
       
       do{
           
           
$o =$i+1;
           echo 
$nums["$i"].&#39; * &#39;. $nums["$o"].&#39; = &#39;.$nums["$i"]*$nums["$o"].&#39;<br />&#39;;
           
break;
           
       }while(
$o>$i);
            
   }


Dame más por favor :P

Hola,

No es por desanimar ni por nada, pero ese algoritmo no tiene nada que ver con el reto que te propuso TLX (CarlosRdrz).
El te propuso ordenar los elementos numéricos de un array de mayor a menor o viceversa y lo que tu has hecho es hacer una tabala que multiplica la variable $i por cada elemento del array, nada que ver.

Un saludo,
Siquillote.

#Fdo. Physlet

Desconectado Warlox

  • Moderadores PHP
  • PHPero Master
  • ****
  • Mensajes: 1.278
  • Karma: 77
  • Sexo: Masculino
  • A veces hay que aprender a correr antes de caminar
    • Ver Perfil
    • Página personal
Re:Ponganme retos, no matemáticos.
« Respuesta #8 en: 16 de Abril de 2012, 19:15:27 pm »
Imprime las tablas de multiplicar del 1 al 10, tratando de optimizar el código al máximo posible y ocupando la menor cantidad de líneas. debería quedarte algo así:

Citar
Tabla del 1

1x1 = 1
1x2 = 2
1x3 = 3
1x4 = 4
1x5 = 5
1x6 = 6
1x7 = 7
1x8 = 8
1x9 = 9
1x10 = 10

Y así hasta llegar a la del 10. Vamos, que no es para nada complicado.
- Moderador de PHP


Desconectado Animus

  • PHPero Avanzado
  • ****
  • Mensajes: 273
  • Karma: 1
  • Sexo: Masculino
  • Aprende a aprender, el resto vendrá solo.
    • Ver Perfil
Re:Ponganme retos, no matemáticos.
« Respuesta #9 en: 16 de Abril de 2012, 21:00:46 pm »
Por que matemático, pero gracias :P


<?php

for($i;$i<=10;$i++){
    echo 
" | 1 x $i = ".$i*1;
}

?>


La red social de tus sueños.


Desconectado Animus

  • PHPero Avanzado
  • ****
  • Mensajes: 273
  • Karma: 1
  • Sexo: Masculino
  • Aprende a aprender, el resto vendrá solo.
    • Ver Perfil
Re:Ponganme retos, no matemáticos.
« Respuesta #10 en: 16 de Abril de 2012, 21:03:04 pm »
Hola,

No es por desanimar ni por nada, pero ese algoritmo no tiene nada que ver con el reto que te propuso TLX (CarlosRdrz).
El te propuso ordenar los elementos numéricos de un array de mayor a menor o viceversa y lo que tu has hecho es hacer una tabala que multiplica la variable $i por cada elemento del array, nada que ver.

Un saludo,
Siquillote.

Si lo sé y me dí cuenta, es que estaba en un tema de "retos" y me lié y lo puse aquí.


La red social de tus sueños.


Desconectado Warlox

  • Moderadores PHP
  • PHPero Master
  • ****
  • Mensajes: 1.278
  • Karma: 77
  • Sexo: Masculino
  • A veces hay que aprender a correr antes de caminar
    • Ver Perfil
    • Página personal
Re:Ponganme retos, no matemáticos.
« Respuesta #11 en: 17 de Abril de 2012, 06:13:02 am »
Claro, ahí solo muestra la tabla del 1, deberías mostrar las demás tablas también...
- Moderador de PHP


Desconectado Animus

  • PHPero Avanzado
  • ****
  • Mensajes: 273
  • Karma: 1
  • Sexo: Masculino
  • Aprende a aprender, el resto vendrá solo.
    • Ver Perfil
Re:Ponganme retos, no matemáticos.
« Respuesta #12 en: 17 de Abril de 2012, 09:07:40 am »
No problem ^^

<?php

class tablas_multiplicar {

	
var 
$tabla;
	
var 
$max_mostrar;

	
public function 
__contruct($xt$mx){
	
	
$this->tabla $xt;
	
	
$this->max_mostrar $mx;
	
}

	
public function 
calcular(){
	
	

	
	
for(
$i;$i<=$this->max_mostrar;$i++){
	
	
	
echo &
#39; | &#39;.$this->tabla.&#39; x &#39;.$i.&#39; = &#39;.$this->max_mostrar*$this->tabla;
	
	
}

	
}

}


?>


Simplemente para utilizar-la usa:


<?php
$tablas 
=new tablas_multiplicar(210);
$tablas->multiplicar();
?>

Esto mostrará la tabla 2, multiplicará hasta llegar a 10, 2 es la tabla y 10 el máximo de valores.

(Creo que está bien, no he podido probarla, pero creo que sí.)


La red social de tus sueños.


Desconectado Siquillote

  • PHPero Master
  • ******
  • Mensajes: 4.229
  • Karma: 179
  • Sexo: Masculino
    • Ver Perfil
Re:Ponganme retos, no matemáticos.
« Respuesta #13 en: 17 de Abril de 2012, 15:39:26 pm »

No problem ^^

<?php

class tablas_multiplicar {

	
var 
$tabla;
	
var 
$max_mostrar;

	
public function 
__contruct($xt$mx){
	
	
$this->tabla $xt;
	
	
$this->max_mostrar $mx;
	
}

	
public function 
calcular(){
	
	

	
	
for(
$i;$i<=$this->max_mostrar;$i++){
	
	
	
echo &
#39; | &#39;.$this->tabla.&#39; x &#39;.$i.&#39; = &#39;.$this->max_mostrar*$this->tabla;
	
	
}

	
}

}


?>


Simplemente para utilizar-la usa:


<?php
$tablas 
=new tablas_multiplicar(210);
$tablas->multiplicar();
?>

Esto mostrará la tabla 2, multiplicará hasta llegar a 10, 2 es la tabla y 10 el máximo de valores.

(Creo que está bien, no he podido probarla, pero creo que sí.)


Hola Animus,

No he probado el código que has realizado, veo un par de fallos por lo cual este código no realizará su trabajo.
Te dejo aquí una lista con los fallos que veo a simple vista.

  • 1 - ¿Donde se establece el método multiplicar()? En todo caso, sería calcular()
  • 2 - ¿Donde se inicia la variable $i? En el for no le das un valor de inicio a la vaiable $i.
  • 3 - Esto no es un error, es un consejo. Si estoy en lo cierto, la esencia de la programación a objetos es la reutilización del código y en el método calcular(), que re***** que debería llamarse multiplicar(), en el for imprimes las cadenas con echo. Que no es que estémal, pero lo adecuado es que se use RETURN.

Un saludo,
Siquillote.

#Fdo. Physlet

Desconectado Animus

  • PHPero Avanzado
  • ****
  • Mensajes: 273
  • Karma: 1
  • Sexo: Masculino
  • Aprende a aprender, el resto vendrá solo.
    • Ver Perfil
Re:Ponganme retos, no matemáticos.
« Respuesta #14 en: 17 de Abril de 2012, 19:27:55 pm »
Lo siento, me he equivocado en lo de multiplicar.

Un bucle "for" nunca he creado una variable con un valor, osea, supongo que al poner que la variable incrementa ya sabrá que sea un valor numérico.


La red social de tus sueños.