| Organització: | Secció ETSEIB, Departament de Ciències de la Computació, UPC |
|---|---|
| Data: | 7 de gener de 2015 |
| Copyright: | Reconeixement-CompartirIgual 3.0 No adaptada de Creative Commons |
| Durada: | 1 hora 30 minuts |
Volem enregistrar les dades dels números premiats de la grossa de Nadal en diferents anys. Amb aquesta finalitat, hem dissenyat la classe Premis_Loteria que només disposarà de l'atribut dic, un diccionari que associarà a cada any el número premiat (la grossa de l'any). Es demana que escriviu la classe, que ha de disposar dels mètodes següents:
Aquesta classe ha de respondre de la següent manera:
>>> import ex1
>>> p = ex1.Premis_Loteria()
>>> p.dic == {}
True
>>> p[2013] = 22142
>>> p[2001] = 93742
>>> p[2011] = 84653
>>> p[2014] = 14017
>>> p.dic == {2001: 93742, 2011: 84653, 2013: 22142, 2014: 14017}
True
>>> p[2001]
93742
>>> p[2002]
-1
>>> p.anys_terminacio(2)
[2001, 2013]
>>> p.anys_terminacio(7)
[2014]
>>> p.anys_terminacio(8)
[]
Deseu la classe al fitxer de nom ex1.py.
Dissenyeu el generador maxims(ita, itb) que, donat un primer iterable o iterador ita sobre la seqüencia \(a_1, a_2, a_3 \dots\) i un segon iterador o iterador itb sobre la seqüencia \(b_1, b_2, b_3 \dots\), produeix la seqüència \(max(a_1,b_1), max(a_2,b_2), max(a_3,b_3) \dots\). La nova seqüència produïda pel generador s'acaba quan una de les dues seqüències de ita o itb s'exhaureix. Per exemple,
>>> from ex2 import maxims
>>> it = maxims([1, 2, 3, 4, 5, 6], [4, 3, 2, 1])
>>> next(it)
4
>>> for m in it:
... print(m, end=',')
3,3,4,
>>> for m in maxims('abracadabra', 'passalacabra'):
... print(m, end='')
pbsscldcbrr
Tot i que no és indispensable, es recomana utilitzar la funció zip per a resoldre aquest problema.
El fitxer test2.txt conté d'altres casos de prova d'aquest generador. Deseu el generador al fitxer de nom ex2.py.
Hem utilitzat un graf dirigit de networkx (un DiGraph) per a representar les relacions familiars entre persones. En aquest graf, només hi ha desada la relació pare/mare-fill/a, és a dir, els nodes del graf són les persones, identificades pel nom (un string) i una aresta dirigida de x a y indica que x és progenitor de y.
Per exemple el graf següent,
creat amb la següent seqüència d'operacions en Python,
>>> import networkx as nx
>>> g = nx.DiGraph()
>>> gent = ['Joan','Anna','Pere','Josep','Maria','Carla','Rut','Gisela']
>>> fills = [ ('Joan','Anna'), ('Joan','Pere'), ('Joan','Josep'), ('Maria','Anna'), ('Maria','Pere'), ('Carla','Josep'), ('Pere','Rut'), ('Pere','Gisela') ]
>>> g.add_nodes_from(gent)
>>> g.add_edges_from(fills)
representa una família de 8 membres, en la qual en Joan té tres fills (Anna, Pere, Josep), la Maria dos (Anna, Pere), la Carla un (en Josep) i en Pere dues filles (Rut i Gisela).
Dissenyeu la funció descendents(g, nom) que, donat un digraf g com el descrit i el nom d'una persona, retorna un conjunt (un set de python) amb els noms dels descendents d'aquesta persona, és a dir, dels seus fills, néts, besnéts, etc. En el graf de l'exemple,
>>> import ex3
>>> ex3.descendents(g, 'Maria') == {'Pere', 'Gisela', 'Rut', 'Anna'}
True
>>> ex3.descendents(g, 'Pere') == {'Gisela', 'Rut'}
True
>>> ex3.descendents(g, 'Anna') == set()
True
Per a resoldre aquest exercici, es recomana utilitzar alguna de les funcions de recorreguts sobre grafs (vegeu traversal). Deseu la funció al fitxer ex3.py.
Utilitzeu la recursivitat per a definir la funció indexos(ln, x) que, donada una llista d'enters ln i un enter x, retorna una nova llista, ordenada ascendentment, amb els índexs de les posicions en què apareix x dins de ln. Per exemple,
>>> import ex4 >>> ex4.indexos([1, 0, 3, 4, 7, 1, 1, 2, 6], 1) [0, 5, 6] >>> ex4.indexos([1, 0, 3, 4, 7, 1, 1, 2, 6], 0) [1] >>> ex4.indexos([1, 0, 3, 4, 7, 1, 6, 6, 6], 666) [] >>> ex4.indexos([33, 33, 33, 71, 33, 33, 33], 33) [0, 1, 2, 4, 5, 6]
Deseu la funció al fitxer de nom ex4.py.
Es vol modificar el joc de tetris implementat a classe, fent que ara els blocs siguin rectangles bicolors (vegeu la figura adjunta). El bloc actiu ha de destruir el bloc sobre el que cau si la part superior d'aquest és del mateix color que la part inferior del bloc actiu.
Es dóna la classe NouBloc en el mòdul noubloc.py. Aquesta classe ja té dissenyat el mètode __init__ que crea la imatge i el rectangle. En el mòdul ex5.py, escriviu-hi la classe NouBloc2 que hereta de NouBloc i li afegeix el mètode update(self, parats). Aquest mètode aplica un desplaçament d'una unitat cap avall al bloc i si topa amb un altre bloc parat el color superior del qual coincideix amb el color inferior del bloc actiu, l'elimina del grup parats. No us preocupeu del límits del tauler; la funció update només s'ha d'ocupar de les col·lisions amb els blocs parats.
Disposeu del programa principal prova.py per a provar la classe NouBloc. Hauríeu de veure com el bloc actiu va baixant per tauler i, en xocar amb el bloc parat, el fa desaparèixer. El bloc actiu acaba sortint del tauler ja que no es comproven els límits.