Porra

Ens demanen un mòdul per a calcular el repartiment de premis i guanys d’una aposta futbolística. Les apostes es fan sobre el resultat d’un partit que encara s’ha de jugar (el què en el llenguatge col·loquial s’anomena una «porra»).

Partim d’un fitxer d’apostes que és un fitxer de text que conté les apostes dels diferents participants, com ara el fitxer exemple1.txt que mostrem a continuació:

Joan P.: 2-3  
Marta:   1-2
Quim:    0-4
Lola:    2-1
Joan C.: 1-2
Ignasi:  2-2

Com podeu veure, el format del fitxer d’apostes és tal que en cada línia hi ha el nom de l’apostador seguit del resultat predit. El nom està separat del resultat per dos punts (':') i un o més espais en blanc, i el resultat són dos enters separats per un guió ('-'), corresponents al nombre de gols a favor i nombre de gols en contra. Tingueu en compte que cada apostador només pot fer una aposta, però es permet que dos apostador prediguin un mateix resultat

Les funcions que heu d’escriure usaran o calcularan un diccionari d’apostes que és un diccionari on cada clau és un resultat predit (una tupla amb dues components, gols a favor, gols en contra) i el valor associat és la llista dels noms dels apostadors que han predit aquell resultat. Els noms de les llistes en els valors del diccionari han d’estar ordenats igualment com apareixen al fitxer d’apostes.

Deseu totes les funcions que es demanen a continuació al fitxer porra.py.

  1. Dissenyeu la funció següent:

    porra.crea_dic_apostes(nomf)

    Calcula un diccionari d’apostes a partir de les apostes contingudes al fitxer d’apostes.

    Paràmetres:

    nomf (str) – Nom del fitxer d’apostes. El fitxer contindrà una aposta com a mínim.

    Retorna:

    Diccionari d’apostes.

    Tipus de retorn:

    dict

    Amb el fitxer exemple1.txt proporcionat:

    
    >>> from porra import crea_dic_apostes
    
    >>> da = crea_dic_apostes('exemple1.txt')
    >>> da == {
    ... (1, 2): ['Marta', 'Joan C.'],
    ... (2, 2): ['Ignasi'], 
    ... (2, 3): ['Joan P.'],
    ... (2, 1): ['Lola'],
    ... (0, 4): ['Quim'],
    ... }
    True
    
    

    Disposeu de jocs de prova al fitxer tests-crea.txt, que depèn del fitxer exemple1.txt amb el contingut anterior.

  2. Dissenyeu la funció següent:

    porra.num_apostes(dic)

    Calcula el nombre d’apostes que conté el diccionari d’apostes.

    Paràmetres:

    dic (dict) – Diccionari d’apostes.

    Retorna:

    Nombre d’apostes que conté el diccionari d’apostes dic.

    Tipus de retorn:

    int

    Per exemple:

    
    >>> from porra import num_apostes
    
    >>> da_1 = {
    ... (1,1): ['Joan', 'Helena'],
    ... (0,1): ['Maria','Carla','Ramon'],
    ... (0,2): ['Pep','Eva']
    ... }
    >>> num_apostes(da_1)
    7
    
    

    Disposeu de jocs de prova al fitxer tests-num.txt.

  3. Per a resoldre aquest apartat i els següents cal conèixer com es realitza el repartiment de premis:

    • La meitat dels diners recollits es destinen a l’apostador que ha fet el ple, és a dir, al qui ha encertat el resultat exacte. Si hi ha més d’un ple, aquests diners es reparteixen per igual entre tots els encertants. Si ningú no ha encertat el resultat exacte, aquests diners se’ls queda l’organitzador.

    • Una tercera part dels diners recollits es destinen als apostadors que han predit una diferència en el marcador que coincideix amb el resultat real, exclosos els qui han fet el ple. Com en el cas anterior, aquests diners es reparteixen equitativament entre tots els encertants i si ningú no encerta la diferència de gols, aquests diners se’ls queda l’organitzador.

    • La resta de diners (una sisena part), se la queda l’espavilat de l’organitzador.

    Dissenyeu la funció següent:

    porra.encerts_ple(da, res)

    Calcula la llista amb el nom dels encertants a partir del diccionari d’apostes i del resultat del partit.

    Paràmetres:
    • da (dict) – Diccionari d’apostes.

    • res (tuple) – Resultat del partit (una tupla amb els gols a favor i gols en contra).

    Retorna:

    Llista amb el nom dels encertants. Cal que la llista retornada estigui ordenada alfabèticament. En cas que ningú no hagi encertat el resultat exacte, la llista retornada ha de ser buida.

    Tipus de retorn:

    list

    Per exemple,

    
    >>> from porra import encerts_ple
    
    >>> da_1 = {
    ... (1,1): ['Joan'],
    ... (0,1): ['Maria','Carla','Ramon'],
    ... (0,2): ['Pep','Eva']
    ... }
    >>> encerts_ple(da_1, (0,1))
    ['Carla', 'Maria', 'Ramon']
    >>> encerts_ple(da_1, (1,1))
    ['Joan']
    >>> encerts_ple(da_1, (0,2))
    ['Eva', 'Pep']
    >>> encerts_ple(da_1, (2,0))
    []
    
    

    Disposeu de jocs de prova al fitxer tests-ple.txt.

  4. Dissenyeu la funció següent:

    porra.encerts_dif(da, res)

    Calcula la llista amb el nom dels encertants de la diferència de gols a partir d’un diccionari d’apostes i del resultat del partit.

    Paràmetres:
    • da (dict) – Diccionari d’apostes.

    • res (tuple) – Resultat del partit (una tupla amb els gols a favor i gols en contra).

    Retorna:

    Llista amb el nom dels encertants de la diferència de gols (exclosos els encertants del ple). Cal que la llista retornada estigui ordenada alfabèticament. La diferència es calcula sempre com els gols de casa menys els gols del visitant i, per tant, pot ser positiva o negativa. En cas que ningú no hagi encertat la diferència de gols, la llista retornada ha de ser buida.

    Tipus de retorn:

    list

    Per exemple,

    
    >>> from porra import encerts_dif
    
    >>> da_1 = { (0, 0): ['Pat', 'Jan', 'Cai'],
    ...          (1, 2): ['Pep'],
    ...          (3, 0): ['Rut', 'Kim'],
    ...          (2, 1): ['Pol'],
    ...          (2, 0): ['Max'] }
    
    >>> encerts_dif(da_1, (1,1))
    ['Cai', 'Jan', 'Pat']
    >>> encerts_dif(da_1, (0,5))
    []
    
    

    Disposeu de jocs de prova al fitxer tests-dif.txt.

  5. Finalment, utilitzeu les funcions dels apartats anteriors per a escriure la funció següent. Tingueu en compte que cada aposta costa un euro.

    porra.premis(nomf, res)

    Calcula la recaptació total, i com i a qui cal repartir-la a partir de les dades d’un fitxer d’apostes i del resultat del partit.

    Paràmetres:
    • nomf (str) – Nom del fitxer d’apostes. El fitxer contindrà una aposta com a mínim.

    • res (tuple) – Resultat del partit (una tupla amb els gols a favor i gols en contra).

    Retorna:

    Tupla amb sis valors:

    • la recaptació total;

    • la llista (que pot ser buida) amb els noms dels encertants del ple, ordenada alfabèticament;

    • la quantitat que cobra cada encertant del ple, tenint en compte que si ningú no ha encertat el ple, aquest valor serà zero;

    • la llista (que pot ser buida) amb els noms dels encertants de la diferència de gols, ordenada alfabèticament;

    • la quantitat que cobra cada encertant de la diferència de gols, tenint en compte que si ningú encerta la diferència de gols, aquest valor serà zero; i

    • els diners que es queda l’organitzador.

    Per exemple, amb el fitxer exemple1.txt proporcionat:

    
    >>> from porra import premis
    
    >>> premis('exemple1.txt', (1,2))
    (6, ['Joan C.', 'Marta'], 1.5, ['Joan P.'], 2.0, 1.0)
    >>> premis('exemple1.txt', (2,1))
    (6, ['Lola'], 3.0, [], 0.0, 3.0)
    >>> premis('exemple1.txt', (4,4))
    (6, [], 0.0, ['Ignasi'], 2.0, 4.0)
    
    

    Disposeu de jocs de prova al fitxer tests-premis.txt.

Solució

Disposeu d’una solució al fitxer porra.py. Us encoratgem a resoldre el problema abans de mirar la solució. Useu-la per comparar-la amb la vostra.