Por segundo año consecutivo va a tener lugar en el grupo flickr de Granada el juego del amigo invisible. Se trata de regalar una fotografía imitando el estilo de la persona que te toque, que se realizará mediante sorteo entre los fotógrafos participantes. Teniendo en cuenta que hay más de 50 personas inscritas, hacer el emparejamiento a mano es bastante tedioso, así que me he hecho un script en python que se encargará de esta tarea.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
from random import choiceimport sys def saca_de_bolsa(bolsa, *personas): for persona in personas: if persona in bolsa: bolsa.remove(persona) class MalaSuerte(Exception): pass def amigo_invisible(amigos): resultado = [] for persona in amigos: bolsa = list(amigos) # saco la persona actual para que no le toque ella misma saca_de_bolsa(bolsa, persona) # saco todos los que ya han salido saca_de_bolsa(bolsa, *resultado) # hago el sorteo if len(bolsa) == 0: raise MalaSuerte amigo = choice(bolsa) resultado.append(amigo) print 'El amigo invisible de %s es %s' % (persona, amigo) # Comprobamos que se le pasa un fichero de entradaif len(sys.argv)<2: print 'Sintaxis: amigo_invisible.py <fichero_entrada>' sys.exit() # Leemos el fichero de entrada y creamos la lista de amigosamigos = ()try: file = open(sys.argv[1]) for line in file: amigos += (line.strip() ,)except: print 'Error al leer el archivo %s' % (sys.argv[1])finally: file.close() # El amigo invisible puede fallar si al sortear la ultima persona, solo esta# ella misma en la bolsasorteo_valido = Falsewhile not sorteo_valido: try: amigo_invisible(amigos) sorteo_valido = True except MalaSuerte: print 'Hemos tenido mala suerte, hay que repetir el sorteo\n\n\n'
Los datos de entrada los coge de un fichero «listado.txt», que tiene que estar en el mismo directorio que el script que hay que pasarle como parámetro y estará formado por los nombres de los participantes, uno por línea. Seguramente se pueda hacer más eficiente y más bonito, pero para hacerlo en 10 minutos antes de irse a dormir, cumple perfectamente con su función :)
Trabajo futuro: enviar un email al usuario con su amigo invisible.
Actualización: corrijo el script, usando el propuesto por Loren, ya que podría darse algún caso en el que el amigo invisible de una persona sea ella misma y esto no se controlaba.
Un regalico pa mandar los correos:
http://pastebin.com/f7ce2509c
No es mia (del todo) y tampoco sé de quien la cogí para darle crédito.
¡¡artista!!
Gracias a los 2 :D
Cuidado Manuel! El amigo invisible es un problema con un gotcha: si el azar así lo quiere la última persona en tu bucle puede ser su propio amigo invisible.
Cuando el número de participantes es par se puede solucionar con un pequeño hack. Cuando el número es impar no hay forma sencilla de evitarlo.
Te dejo mi versión, que por lo menos invalida el sorteo y lo vuelve a realizar si la fuerza, digo la suerte, no nos ha acompañado:
http://pastebin.com/m451142d
Muchas gracias Loren, se me había pasado ese caso :)