elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  Es dificil o imposible?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Es dificil o imposible?  (Leído 7,340 veces)
explorer

Desconectado Desconectado

Mensajes: 101


Analista/Programador Perl


Ver Perfil
Re: Es dificil o imposible?
« Respuesta #10 en: 20 Marzo 2012, 18:47 pm »

Ya que lo vas a ejecutar en Codepad, prueba esta versión:
Código
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. my $alumnos = 20;                    # Número de alumnos
  6. my $grupos  = 4;                     # Tamaño de los grupos
  7.  
  8. my @alumnos = 1 .. $alumnos;
  9. my $n_grupo = 1;
  10.  
  11. while (@alumnos >= $grupos) {
  12.  
  13.    # Creamos un @nuevo_grupo compuesto de tantos alumnos como de grande
  14.    # sean los $grupos, elegidos al azar de los @alumnos restantes
  15.    my @nuevo_grupo = map { splice @alumnos, rand(@alumnos), 1 } 1 .. $grupos;
  16.  
  17.    print "Grupo $n_grupo: [@nuevo_grupo]\n";
  18.  
  19.    $n_grupo++;
  20. }
  21.  
  22. # Resto que ha quedado sin asignar
  23. if (@alumnos) {
  24.    print "Grupo $n_grupo: [@alumnos]\n";
  25. }
  26.  


En línea

yoyo2002

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Es dificil o imposible?
« Respuesta #11 en: 21 Marzo 2012, 11:46 am »

Exacto, eso es, es decir, quiero todas las combinaciones posibles existentes entre los 20 en grupos de 4, sin que ninguno de los 20 vuelva a coincidir con el resto en la combinacion, sea cual sea el orden, pero que no coincidan 2 ni más numeros en una nueva combinación.


En línea

yoyo2002

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Es dificil o imposible?
« Respuesta #12 en: 21 Marzo 2012, 17:31 pm »


Gracias, ahora sí funciona. Pero ¿podría ser que salieran todas las combinaciones de 4 números existentes sin repetición, sin importar el orden en que salga? Es decir, si sale la combinación, 3-5-9-11, esta misma con otro orden no me vale (ej: 5-11-9-5) y tampoco me valdria otra donde volvieran a coincidir dos variables o más... Es decir, ya el 3 no puede volver a coincidir ni con el 5 ni con el 9 ni con el 11, al igual que el resto.

Sé que es dificil....


Ya que lo vas a ejecutar en Codepad, prueba esta versión:
Código
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. my $alumnos = 20;                    # Número de alumnos
  6. my $grupos  = 4;                     # Tamaño de los grupos
  7.  
  8. my @alumnos = 1 .. $alumnos;
  9. my $n_grupo = 1;
  10.  
  11. while (@alumnos >= $grupos) {
  12.  
  13.    # Creamos un @nuevo_grupo compuesto de tantos alumnos como de grande
  14.    # sean los $grupos, elegidos al azar de los @alumnos restantes
  15.    my @nuevo_grupo = map { splice @alumnos, rand(@alumnos), 1 } 1 .. $grupos;
  16.  
  17.    print "Grupo $n_grupo: [@nuevo_grupo]\n";
  18.  
  19.    $n_grupo++;
  20. }
  21.  
  22. # Resto que ha quedado sin asignar
  23. if (@alumnos) {
  24.    print "Grupo $n_grupo: [@alumnos]\n";
  25. }
  26.  
En línea

explorer

Desconectado Desconectado

Mensajes: 101


Analista/Programador Perl


Ver Perfil
Re: Es dificil o imposible?
« Respuesta #13 en: 22 Marzo 2012, 00:21 am »

Ahora estoy un poco dormido, pero creo que la solución es esta:
Código
  1. my $visto;
  2.  
  3. for my $a1 (1 .. 20) {
  4.    for my $a2 (1 .. 20) {
  5.        for my $a3 (1 .. 20) {
  6.            for my $a4 (1 .. 20) {
  7.  
  8.                my @ordenados = sort { $a <=> $b } $a1, $a2, $a3, $a4;
  9.  
  10.                # salimos si hay coincidencia
  11.                next if $ordenados[0] == $ordenados[1]
  12.                     or $ordenados[0] == $ordenados[2]
  13.                     or $ordenados[0] == $ordenados[3]
  14.                     or $ordenados[1] == $ordenados[2]
  15.                     or $ordenados[1] == $ordenados[3]
  16.                     or $ordenados[2] == $ordenados[3]
  17.                ;
  18.  
  19.                # salimos si hay coincidencia por pares
  20.                next if $visto{"$ordenados[0]-$ordenados[1]"}
  21.                     or $visto{"$ordenados[0]-$ordenados[2]"}
  22.                     or $visto{"$ordenados[0]-$ordenados[3]"}
  23.                     or $visto{"$ordenados[1]-$ordenados[2]"}
  24.                     or $visto{"$ordenados[1]-$ordenados[3]"}
  25.                     or $visto{"$ordenados[2]-$ordenados[3]"}
  26.                ;
  27.  
  28.                # recordamos todos los pares nuevos
  29.                $visto{"$ordenados[0]-$ordenados[1]"} =
  30.                $visto{"$ordenados[0]-$ordenados[2]"} =
  31.                $visto{"$ordenados[0]-$ordenados[3]"} =
  32.                $visto{"$ordenados[1]-$ordenados[2]"} =
  33.                $visto{"$ordenados[1]-$ordenados[3]"} =
  34.                $visto{"$ordenados[2]-$ordenados[3]"} = 1;
  35.  
  36.                # Impresión
  37.                print "[", join('-', @ordenados), "]\n";
  38.            }
  39.        }
  40.    }
  41. }
La salida es algo corta:
[1-2-3-4]
[1-5-6-7]
[1-8-9-10]
[1-11-12-13]
[1-14-15-16]
[1-17-18-19]
[2-5-8-11]
[2-6-9-12]
[2-7-10-13]
[2-14-17-20]
[3-5-9-13]
[3-6-8-14]
[3-7-11-15]
[3-10-12-16]
[4-5-10-14]
[4-6-11-16]
[4-7-8-12]
[4-9-15-17]
[4-13-18-20]
[5-12-15-18]
[5-16-19-20]
[6-10-15-19]
[7-9-14-18]
[8-13-16-17]


Curiosamente, el alumno 1 nunca estará con el número 20. ¿Por qué?
Supongamos que queremos la combinación [1-a-b-20]. ¿Qué valores serían a o b?. Pues cualquiera entre 2 y 19... pero eso no es posible, porque todos los números entre 2 y 19 ya han salido con el 1 antes (mirar las 6 primeras combinaciones). Y se cumpliría la condición de que el 1 ya se ha visto con cualquiera de esos números.

Me temo que esto no es lo que quieres...

Según las condiciones que has puesto, la segunda es la que limita la salida de todas las combinaciones: «tampoco me valdría otra donde volvieran a coincidir dos variables o más...». Como los grupos son de 4, eso quiere decir que habrá alumnos que estarán en más combinaciones (el 1, seis veces), pero otras, menos (el 20, tres veces) por la razón explicada antes.
« Última modificación: 22 Marzo 2012, 00:23 am por explorer » En línea

yoyo2002

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Es dificil o imposible?
« Respuesta #14 en: 22 Marzo 2012, 12:02 pm »

Muchísimas gracias. Aunque no salgan todas, ya el resto de combinaciones las intentaré hacer manualmente, aunque tenga que usar una "Variable comodín".

Ahora estoy un poco dormido, pero creo que la solución es esta:
Código
  1. my $visto;
  2.  
  3. for my $a1 (1 .. 20) {
  4.    for my $a2 (1 .. 20) {
  5.        for my $a3 (1 .. 20) {
  6.            for my $a4 (1 .. 20) {
  7.  
  8.                my @ordenados = sort { $a <=> $b } $a1, $a2, $a3, $a4;
  9.  
  10.                # salimos si hay coincidencia
  11.                next if $ordenados[0] == $ordenados[1]
  12.                     or $ordenados[0] == $ordenados[2]
  13.                     or $ordenados[0] == $ordenados[3]
  14.                     or $ordenados[1] == $ordenados[2]
  15.                     or $ordenados[1] == $ordenados[3]
  16.                     or $ordenados[2] == $ordenados[3]
  17.                ;
  18.  
  19.                # salimos si hay coincidencia por pares
  20.                next if $visto{"$ordenados[0]-$ordenados[1]"}
  21.                     or $visto{"$ordenados[0]-$ordenados[2]"}
  22.                     or $visto{"$ordenados[0]-$ordenados[3]"}
  23.                     or $visto{"$ordenados[1]-$ordenados[2]"}
  24.                     or $visto{"$ordenados[1]-$ordenados[3]"}
  25.                     or $visto{"$ordenados[2]-$ordenados[3]"}
  26.                ;
  27.  
  28.                # recordamos todos los pares nuevos
  29.                $visto{"$ordenados[0]-$ordenados[1]"} =
  30.                $visto{"$ordenados[0]-$ordenados[2]"} =
  31.                $visto{"$ordenados[0]-$ordenados[3]"} =
  32.                $visto{"$ordenados[1]-$ordenados[2]"} =
  33.                $visto{"$ordenados[1]-$ordenados[3]"} =
  34.                $visto{"$ordenados[2]-$ordenados[3]"} = 1;
  35.  
  36.                # Impresión
  37.                print "[", join('-', @ordenados), "]\n";
  38.            }
  39.        }
  40.    }
  41. }
La salida es algo corta:
[1-2-3-4]
[1-5-6-7]
[1-8-9-10]
[1-11-12-13]
[1-14-15-16]
[1-17-18-19]
[2-5-8-11]
[2-6-9-12]
[2-7-10-13]
[2-14-17-20]
[3-5-9-13]
[3-6-8-14]
[3-7-11-15]
[3-10-12-16]
[4-5-10-14]
[4-6-11-16]
[4-7-8-12]
[4-9-15-17]
[4-13-18-20]
[5-12-15-18]
[5-16-19-20]
[6-10-15-19]
[7-9-14-18]
[8-13-16-17]


Curiosamente, el alumno 1 nunca estará con el número 20. ¿Por qué?
Supongamos que queremos la combinación [1-a-b-20]. ¿Qué valores serían a o b?. Pues cualquiera entre 2 y 19... pero eso no es posible, porque todos los números entre 2 y 19 ya han salido con el 1 antes (mirar las 6 primeras combinaciones). Y se cumpliría la condición de que el 1 ya se ha visto con cualquiera de esos números.

Me temo que esto no es lo que quieres...

Según las condiciones que has puesto, la segunda es la que limita la salida de todas las combinaciones: «tampoco me valdría otra donde volvieran a coincidir dos variables o más...». Como los grupos son de 4, eso quiere decir que habrá alumnos que estarán en más combinaciones (el 1, seis veces), pero otras, menos (el 20, tres veces) por la razón explicada antes.

En línea

Runex

Desconectado Desconectado

Mensajes: 192


http://tutogramacion.blogspot.com


Ver Perfil WWW
Re: Es dificil o imposible?
« Respuesta #15 en: 22 Marzo 2012, 14:59 pm »

Código
  1. #!/usr/bin/env python
  2. import random,os
  3. class partidos:
  4.  
  5. def __init__(self,alumnos,grupos,grupox):
  6. self.alumnos = alumnos
  7. self.grupos = grupos
  8. self.grupox = grupox
  9. self.creagrupos(alumnos,grupos,grupox)
  10. def creagrupos(self,alumnos,grupos,grupox):
  11. print "La cantidad de alumnos es: " + str(self.alumnos)
  12. print "La cantidad de alumnos por grupo es: " + str(self.grupos)
  13. print "La cantidad de grupos es: " + str(self.grupox)
  14. self.x = 0
  15. self.v = 0
  16. while self.v < self.grupox:
  17. print "Grupo " + str(self.v)
  18. while self.x < self.grupos:
  19. y = random.randint(0,20)
  20. print y,
  21. self.x +=1
  22. self.x = 0
  23. print "\n"
  24. self.v += 1
  25.  
  26. print "Inserte numero alumnos: "
  27. alumnos = input("Alumnos>")
  28. print "Inserte numero de alumnos por grupo: "
  29. grupos = input("Alumnos x Grupo>")
  30. print "Inserte la cantidad de grupos que desea:"
  31. grupox = input("Grupos>")
  32. os.system("clear")
  33. if __name__ == "__main__":
  34. t = partidos(alumnos,grupos,grupox)

Hasta ahí he llegado, se me ocurre una posible solución, añadiendo cada numero aleatorio que se genere en una lista y comparando después cada elemento, sin embargo eso se escapa a mi capacidad de escritura de código XD. En el programa que te he escrito yo, puedes añadir tu manualmente el numero de alumnos total, la cantidad de alumnos por grupo y la cantidad de grupos que deseas crear, así te puede servir para otras veces que desees hacer equipos con una cantidad diferente de alumnos :)

De todas formas creo que la solución ofrecida por explorer es bastante buena para tu objetivo :)
En línea

"No renunciaría al bambú.
Nunca renuciaría a ti.
No te compares con otros" "El me dijo:
El bambú tenía un propósito diferente al del
helecho, sin embargo eran necesarios y
hacían del bosque un lugar hermoso".
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.821



Ver Perfil
Re: Es dificil o imposible?
« Respuesta #16 en: 22 Marzo 2012, 15:32 pm »

se me ocurre una posible solución, añadiendo cada numero aleatorio que se genere en una lista y comparando después cada elemento

Yo probé otra cosa parecida:

1º - Escribir las 20 combinaciones aleatorias (20 .txt)
2º - comparar cada texto con el primer texto, Y Si algún número se repite, vuelve a crear el texto, y lo vuelve a comparar, hasta que no se repita ningún número y ningún texto séa igual.

Pero ese método puede tardar demasiado, es poco efectivo, la verdad es que en 20 min no consiguió crear un texto aleatorio que no repita ningún número en algún grupo... (¿Mala suerte?)

Quizás les sirva como idea.

Salu2
En línea

yoyo2002

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Es dificil o imposible?
« Respuesta #17 en: 23 Marzo 2012, 12:11 pm »

Muchísimas gracias de nuevo a EleKtro H@cker y Runex, sé que no es facil lo que quiero, pero me habéis ayudado bastante y bien.

Gracias.
En línea

Runex

Desconectado Desconectado

Mensajes: 192


http://tutogramacion.blogspot.com


Ver Perfil WWW
Re: Es dificil o imposible?
« Respuesta #18 en: 3 Abril 2012, 15:57 pm »

Yoyo si aun necesitas el programa avisa, que ya se me ha ocurrido una forma factible de hacerlo :).

Un saludo :)
En línea

"No renunciaría al bambú.
Nunca renuciaría a ti.
No te compares con otros" "El me dijo:
El bambú tenía un propósito diferente al del
helecho, sin embargo eran necesarios y
hacían del bosque un lugar hermoso".
Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
la electronica no es dificil!!!
Electrónica
[ LadeDarK ] 3 4,986 Último mensaje 1 Noviembre 2004, 15:21 pm
por Meta
Es dificil pasar de vb6 a vb.net ?
Programación Visual Basic
hacksoft 0 1,669 Último mensaje 13 Octubre 2005, 18:41 pm
por hacksoft
¿Es php muy difícil? « 1 2 3 »
PHP
WildFroVII 22 15,601 Último mensaje 27 Abril 2012, 22:15 pm
por Puntoinfinito
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines