Megatló per equips¶
Una megatló és una competició esportiva imaginaria que consta de tres proves cronometrades, i en la que es participa per equips. Com en altres disciplines existeixen diferents categories: sub23, júnior, absoluta, sènior, …
En aquest problema s’ha de calcular la classificació final per equips en la categoria absoluta, a partir dels resultats parcials dels participants en cadascuna de les tres proves. Els participants que no hagin finalitzat una prova (o hagin quedat fora de temps) no figuren al llistat de resultats parcials de la prova.
Nota
per facilitar la tasca en primer lloc es dissenyaran algunes funcions auxiliars. Les altres funcions han de cridar a aquelles definides abans que permetin simplificar el seu disseny.
Es disposa d’una llista amb els resultats d’una de les proves de la megatló. Cada element és un tuple amb la informació d’un participant: el seu dorsal, el nom del seu equip, el nom de la seva categoria, i el temps en segons que ha emprat en aquesta prova (un real). Es recorda que els participants que no hagin finalitzat la prova (o hagin quedat fora de temps) no són a la llista.
Dissenya una funció que, donada una llista com la descrita i el nom d’un equip, calculi i retorni un diccionari on hi hagi un element per cada participant que sigui membre de l’equip. La clau serà el dorsal i el valor un tuple amb la categoria i el temps emprat pel participant.
def dicEquipProva(prova, eq): """ >>> lParti = [ (101, 'TNTres', 'absoluta', 2450.0), (102, 'TNTres', 'absoluta', 2420.0), ... (103, 'TNTres', 'absoluta', 2440.0), (104, 'TNTres', 'absoluta', 2490.0), ... (105, 'TNTres', 'junior', 2470.0), ... (201, 'RunUp', 'absoluta', 2410.0), (202, 'RunUp', 'absoluta', 2470.0), ... (203, 'RunUp', 'absoluta', 2430.0), (204, 'RunUp', 'sub23', 2460.0), ... (301, 'SevenUp', 'absoluta', 2410.0), (302, 'SevenUp', 'absoluta', 2430.0), ... (402, 'Cron', 'junior', 2450.0), ... (501, 'InterK2', 'junior', 2400.0), (502, 'InterK2', 'junior', 2420.0) ] >>> dic = dicEquipProva(lParti, 'RunUp') >>> dic == { 201: ('absoluta', 2410.0), 202: ('absoluta', 2470.0), ... 203: ('absoluta', 2430.0), 204: ('sub23', 2460.0) } True """
Dissenya una funció que, a partir dels resultats d’una prova (una llista amb una estructura com la descrita al primer apartat) i d’una altre llista amb noms d’equips, modifiqui la segona llista per tal de afegir els noms d’equips que tinguin algun participant de categoria absoluta en la prova. La segona llista no ha de contenir noms repetits i ha d’estar ordenada alfabéticament.
def afegeixEquipsCatAbsoluta(prova, leq): """ >>> lParti = [ (101, 'TNTres', 'absoluta', 3080.0), (102, 'TNTres', 'absoluta', 3030.0), ... (103, 'TNTres', 'absoluta', 3050.0), (104, 'TNTres', 'absoluta', 3100.0), ... (105, 'TNTres', 'junior', 3060.0), ... (201, 'RunUp', 'absoluta', 3030.0), (202, 'RunUp', 'absoluta', 3040.0), ... (204, 'RunUp', 'sub23', 3070.0), ... (301, 'SevenUp', 'absoluta', 3050.0), (302, 'SevenUp', 'absoluta', 3020.0), ... (402, 'Cron', 'junior', 3080.0), ... (501, 'InterK2', 'junior', 3030.0), (502, 'InterK2', 'junior', 3020.0), ... (601, 'Amillorar', 'absoluta', 3150.0), (602, 'Amillorar', 'junior', 3160) ] >>> equips = ['RunUp', 'SevenUp', 'TNTres'] >>> afegeixEquipsCatAbsoluta(lParti, equips) >>> equips ['Amillorar', 'RunUp', 'SevenUp', 'TNTres'] """
Dissenya una funció que, donats els resultats de les tres proves de la megatló (tres llistes amb una estructura com la descrita al primer apartat), calculi i retorni una llista amb els noms dels equips que tenen algun(s) participant(s) de categoria absoluta en alguna de les proves de la megatló. És a dir, un equip que simplement tingui un participant de categoria absoluta que hagi acabat alguna prova ja ha de formar part d’aquesta llista que ha d’estar ordenada alfabèticament.
Nota
s’ha de fer servir la funció anterior.
def lEquipsCatAbsoluta(prova1, prova2, prova3): """ >>> p1 = [ (101, 'TNTres', 'absoluta', 2450.0), (102, 'TNTres', 'absoluta', 2420.0), ... (103, 'TNTres', 'absoluta', 2440.0), (104, 'TNTres', 'absoluta', 2490.0), ... (105, 'TNTres', 'junior', 2470.0), ... (201, 'RunUp', 'absoluta', 2410.0), (202, 'RunUp', 'absoluta', 2470.0), ... (203, 'RunUp', 'absoluta', 2430.0), (204, 'RunUp', 'sub23', 2460.0), ... (301, 'SevenUp', 'absoluta', 2410.0), (302, 'SevenUp', 'absoluta', 2430.0), ... (402, 'Cron', 'junior', 2450.0), ... (501, 'InterK2', 'junior', 2400.0), (502, 'InterK2', 'junior', 2420.0) ] >>> p2 = [ (101, 'TNTres', 'absoluta', 3080.0), (102, 'TNTres', 'absoluta', 3030.0), ... (103, 'TNTres', 'absoluta', 3050.0), (104, 'TNTres', 'absoluta', 3100.0), ... (105, 'TNTres', 'junior', 3060.0), ... (201, 'RunUp', 'absoluta', 3030.0), (202, 'RunUp', 'absoluta', 3040.0), ... (204, 'RunUp', 'sub23', 3070.0), ... (301, 'SevenUp', 'absoluta', 3050.0), (302, 'SevenUp', 'absoluta', 3020.0), ... (402, 'Cron', 'junior', 3080.0), ... (501, 'InterK2', 'junior', 3030.0), (502, 'InterK2', 'junior', 3020.0), ... (601, 'Amillorar', 'absoluta', 3150.0), (602, 'Amillorar', 'junior', 3160) ] >>> p3 = [ (101, 'TNTres', 'absoluta', 2890.0), (102, 'TNTres', 'absoluta', 2820.0), ... (103, 'TNTres', 'absoluta', 2840.0), ... (105, 'TNTres', 'junior', 2850.0), ... (201, 'RunUp', 'absoluta', 2830.0), (202, 'RunUp', 'absoluta', 2880.0), ... (301, 'SevenUp', 'absoluta', 2830.0), (302, 'SevenUp', 'absoluta', 2820.0), ... (401, 'Cron', 'absoluta', 2810.0), (402, 'Cron', 'junior', 2830.0), ... (501, 'InterK2', 'junior', 2810.0), (502, 'InterK2', 'junior', 2820.0), ... (601, 'Amillorar', 'absoluta', 2900.0) ] >>> lEquipsCatAbsoluta(p1, p2, p3) ['Amillorar', 'Cron', 'RunUp', 'SevenUp', 'TNTres'] """
Dissenya una funció que, donades tres llistes amb una estructura com la descrita al primer apartat, on cadascuna conté la informació dels participants a una de les proves del megatló, calculi i retorni la classificació dels equips que tinguin participants de la categoria absoluta. La classificació dels equips serà una llista on cada element de la llista és un tuple amb dos elements: el temps de l’equip i el seu nom. La classificació final estarà ordenada de forma creixent pel temps dels equips.
El temps d’un equip es calcula com la mitjana dels temps dels seus participants de categoria absoluta que hagin acabat les tres proves. Si un equip no té cap participant de categoria absoluta que hagi acabat totes tres proves, llavors no ha de formar part de la classificació. El temps de l’equip ha de estar arrodonit a un decimal.
Nota
s’han de fer servir les funcions auxiliars per tal de simplificar el disseny.
def classifAbsoluta(prova1, prova2, prova3): """ >>> p1 = [ (101, 'TNTres', 'absoluta', 2450.0), (102, 'TNTres', 'absoluta', 2420.0), ... (103, 'TNTres', 'absoluta', 2440.0), (104, 'TNTres', 'absoluta', 2490.0), ... (105, 'TNTres', 'junior', 2470.0), ... (201, 'RunUp', 'absoluta', 2410.0), (202, 'RunUp', 'absoluta', 2470.0), ... (203, 'RunUp', 'absoluta', 2430.0), (204, 'RunUp', 'sub23', 2460.0), ... (301, 'SevenUp', 'absoluta', 2410.0), (302, 'SevenUp', 'absoluta', 2430.0), ... (402, 'Cron', 'junior', 2450.0), ... (501, 'InterK2', 'junior', 2400.0), (502, 'InterK2', 'junior', 2420.0) ] >>> p2 = [ (101, 'TNTres', 'absoluta', 3080.0), (102, 'TNTres', 'absoluta', 3030.0), ... (103, 'TNTres', 'absoluta', 3050.0), (104, 'TNTres', 'absoluta', 3100.0), ... (105, 'TNTres', 'junior', 3060.0), ... (201, 'RunUp', 'absoluta', 3030.0), (202, 'RunUp', 'absoluta', 3040.0), ... (204, 'RunUp', 'sub23', 3070.0), ... (301, 'SevenUp', 'absoluta', 3050.0), (302, 'SevenUp', 'absoluta', 3020.0), ... (402, 'Cron', 'junior', 3080.0), ... (501, 'InterK2', 'junior', 3030.0), (502, 'InterK2', 'junior', 3020.0), ... (601, 'Amillorar', 'absoluta', 3150.0), (602, 'Amillorar', 'junior', 3160) ] >>> p3 = [ (101, 'TNTres', 'absoluta', 2890.0), (102, 'TNTres', 'absoluta', 2820.0), ... (103, 'TNTres', 'absoluta', 2840.0), ... (105, 'TNTres', 'junior', 2850.0), ... (201, 'RunUp', 'absoluta', 2830.0), (202, 'RunUp', 'absoluta', 2880.0), ... (301, 'SevenUp', 'absoluta', 2830.0), (302, 'SevenUp', 'absoluta', 2820.0), ... (401, 'Cron', 'absoluta', 2810.0), (402, 'Cron', 'junior', 2830.0), ... (501, 'InterK2', 'junior', 2810.0), (502, 'InterK2', 'junior', 2820.0), ... (601, 'Amillorar', 'absoluta', 2900.0) ] >>> classifAbsoluta(p1, p2, p3) [(2420.0, 'SevenUp'), (2436.7, 'TNTres'), (2440.0, 'RunUp')] """