#! /usr/bin/env python # -*- coding: utf-8 -*- #======================================= # cpadel.py - genera calendario de partidos para n equipos #------------------------------------------------------------------------------------------------- # FJA - neocipres@telefonica.net Febrero de 2007 (06/02/07) #------------------------------------------------------------------------------------------------- # Distribuido de acuerdo a los términos de la licencia GNU/GPL #======================================= __uso__ = '''\nAyuda:\n \tcpadel.py - genera calendario de partidos para n equipos. Los \tresultados se escriben en el archivo cpadel.out \n \tUso: cpadel <numero de equipos>\n cpadel es un enlace a cpadel.py \n''' __autor__ = 'FJA - neocipres@telefonica.net Febrero de 2007 (06/02/07)' import sys, random lpartidos = [] lindices = [] lpnoa = [] tparejas = () lsem = [] cero = 0, 0 nsem = 0 npartidos = 0 ind = 0 def raya( n ): rep = lambda p: p[0]*p[1] return rep((n, "=")) def generaLind( npartidos ): lista = [] for i in range(npartidos): lista.append( i ) random.shuffle( lista ) # permuta el contenido de la lista, la clave del cordero !!! return lista def generaLnoa(npartidos, lpartidos): lista = [] for i in range( npartidos ): lista.append( lpartidos[i] ) return lista def generaM( filas, cols): lista = [] for i in range( 0, filas): fila = [] for j in range(0 , cols): celda = cero fila.append( celda ) lista.append( fila ) return lista def generaCal(): salir = 0 lineasInf = [] # generamos los partidos try: ne = int( cadnum ) for i in range( ne ): k = i + 1 for j in range( k, ne ): if i+1 <> j+1: tparejas = i+1, j+1 lpartidos.append( tparejas) npartidos = len( lpartidos ) if ne % 2 == 0: ps = ne/2 nsem = ( npartidos - npartidos % ps )/ps else: ps = ne/2 + ne % 2 nsem = ( npartidos - npartidos % ps )/ps + ( ne - 1 ) print "\n== Partidos a realizar por ", ne," equipos",raya(50), "\n" c = 0 linea = [] for i in range( npartidos ): print lpartidos[i], linea.append( lpartidos[i] ) c +=1 if c > 9: print "\n" c = 0 lineasInf.append( linea ) linea = [] lineasInf.append( linea ) print "\n\n== Partidos: ", npartidos, raya(70), "\n" # generamos matriz lsem = generaM( nsem, ps ) lpnoa = generaLnoa( npartidos, lpartidos ) # la rellenamos con los partidos continuar = raw_input("\tPulsa enter ... ") while not salir: # aleatoriamente modificamos el orden de los índices, y a probar suerte ... lindices = generaLind( npartidos ) for n in lindices: celda = lpartidos[n] a = celda[0] b = celda[1] for i in range( 0, nsem): for j in range(0 , ps): if a in lsem[i][j] or b in lsem[i][j]: break else: if lsem[i][j] == cero: lsem[i][j] = celda lpnoa.remove( celda ) ind = 1 break if ind: ind = 0 break print "\n",raya(70),"\n" print "\tPartidos no adjudicados: ", len( lpnoa ), "\n\n\t", lpnoa print "\n",raya(70),"\n" if len( lpnoa ) == 0: salir = 1 else: lsem = generaM( nsem, ps ) lpnoa = generaLnoa( npartidos, lpartidos ) #fin = raw_input("¿Repetir? (s/n): ") #if 'S' in fin.upper(): # lsem = generaM( nsem, ps ) # lpnoa = generaLnoa( npartidos, lpartidos ) #else: # salir = 1 print "\n\t", nsem," jornadas\n" for i in range( len( lsem ) ): if i < 9: espacio = " " else: espacio = "" print "\tJornada ",espacio,i+1," - ",lsem[i] print "\n", raya(70), "\n" print "\tGenerando informe ...\n" informe = [] informe.append("\n == Partidos a realizar por "+str(ne)+" equipos " + raya(50) +"\n\n") for i in range( len(lineasInf) ): informe.append( str(lineasInf[i])+"\n" ) informe.append("\n\n == Partidos: "+str(npartidos)+" "+raya(70)+"\n\n") informe.append("\n "+str(nsem)+" jornadas") informe.append("\n"+raya(80)+"\n\n") for i in range( len( lsem ) ): if i < 9: espacio = " " else: espacio = "" informe.append(" Jornada "+espacio+str(i+1)+" - "+str(lsem[i])+"\n") informe.append("\n"+raya(80)+"\n") try: f = open('cpadel.out', 'w') for i in range( len( informe ) ): f.write( str(informe[i]) ) except IOError, detalle: print "Error: ", detalle else: f.close() print "\n\tInforme generado en cpadel.out\n\n" except OSError, detalle: print "\n\t Error: ", detalle, "\n" try: cadnum = sys.argv[1] except IndexError: print raya(70) print __uso__ print "\t", __autor__ ,"\n" print raya(70) else: generaCal()