Para quien no conozca el juego, normalmente se escribe el numero de todos los participantes en pequeños papelitos y se sacan los papelitos al azar. asi cada uno tiene que dar un regalo a la persona que le sale. No deberia ni salir uno mismo ni salir repetidos.
(La idea en realidad es que mande un mail informandole a cada persona quien le toco =P)
Este es mi codigo, es PHP (no imporat el lenguaje).
con cronometro en mano, incluyendo el depureo me tomo 7 minutos.
(de preferencia escriban su codigo primero y luego leen el mio =) )
PHP:
Código PHP :
//lista de players. $players = array( 'Desy' => '[email protected]', 'Anto' => '[email protected]', 'Jorge' => '[email protected]', 'Leo' => '[email protected]', 'Mano' => '[email protected]', 'Fio' => '[email protected]'); $result = array(); //un array con el resultado del sorteo $players_keys = array_keys($players); //el indice del array no es numerico! U_U foreach($players as $name => $mail){ //por cada jugador buscamos su amigo secreto do{ $rand = rand(0, (count( $players )-1) ); // sacamos un numero del 0 al numero de participantes. $result[$name] = $players_keys[$rand]; // y colocamos el resultado. }while(!$players_keys[$rand] || ( $name == $players_keys[$rand] )); //pero si ese amigo ya fue elejido, o es el mismo concursante volvemos a hacer la pirueta unset($players_keys[$rand]); // y botamos al concursante elejido. } //luego imprimimos.. (esto en realidad es para probar, yo mandaba un email) foreach ($result as $key => $value){ echo "A <b>$key</b> le toca <b>$value</b><br/>"; } ?>
Personalmente me parece demasiado cargado mi do while, sobretodo por el rand, supongo que deberia sacar un numero aleatorio de los que estan fuera, pero fue lo primero que se me ocurrio...