Porra ===== .. py:module:: 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 :download:`exemple1.txt` que mostrem a continuació: .. include:: exemple1.txt :literal: 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 :file:`porra.py`. 1. Dissenyeu la funció següent: .. py:function:: crea_dic_apostes(nomf) Calcula un diccionari d'apostes a partir de les apostes contingudes al fitxer d'apostes. :param str nomf: Nom del fitxer d'apostes. El fitxer contindrà una aposta com a mínim. :return: Diccionari d'apostes. :rtype: dict Amb el fitxer :download:`exemple1.txt` proporcionat: .. literalinclude:: tests-crea.txt :language: pycon :start-after: --ini-enunciat :end-before: --fi-enunciat Disposeu de jocs de prova al fitxer :download:`tests-crea.txt`, que depèn del fitxer :download:`exemple1.txt` amb el contingut anterior. 2. Dissenyeu la funció següent: .. py:function:: num_apostes(dic) Calcula el nombre d'apostes que conté el diccionari d'apostes. :param dict dic: Diccionari d'apostes. :return: Nombre d'apostes que conté el diccionari d'apostes *dic*. :rtype: int Per exemple: .. literalinclude:: tests-num.txt :language: pycon :start-after: --ini-enunciat :end-before: --fi-enunciat Disposeu de jocs de prova al fitxer :download:`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: .. py:function:: encerts_ple(da, res) Calcula la llista amb el nom dels encertants a partir del diccionari d'apostes i del resultat del partit. :param dict da: Diccionari d'apostes. :param tuple res: Resultat del partit (una tupla amb els gols a favor i gols en contra). :return: 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. :rtype: list Per exemple, .. literalinclude:: tests-ple.txt :language: pycon :start-after: --ini-enunciat :end-before: --fi-enunciat Disposeu de jocs de prova al fitxer :download:`tests-ple.txt`. 4. Dissenyeu la funció següent: .. py:function:: 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. :param dict da: Diccionari d'apostes. :param tuple res: Resultat del partit (una tupla amb els gols a favor i gols en contra). :return: 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. :rtype: list Per exemple, .. literalinclude:: tests-dif.txt :language: pycon :start-after: --ini-enunciat :end-before: --fi-enunciat Disposeu de jocs de prova al fitxer :download:`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. .. py:function:: 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. :param str nomf: Nom del fitxer d'apostes. El fitxer contindrà una aposta com a mínim. :param tuple res: Resultat del partit (una tupla amb els gols a favor i gols en contra). :return: 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 :download:`exemple1.txt` proporcionat: .. literalinclude:: tests-premis.txt :language: pycon :start-after: --ini-enunciat :end-before: --fi-enunciat Disposeu de jocs de prova al fitxer :download:`tests-premis.txt`. .. rubric:: Solució Disposeu d'una solució al fitxer :download:`porra.py`. Us encoratgem a resoldre el problema abans de mirar la solució. Useu-la per comparar-la amb la vostra.