Daus¶
Avís
Per a resoldre aquest exercici no es poden fer servir
iteracions (ni for
ni while
), només les
funcions predefinides de Python i les dels
mòduls itertools
, functools
i
operator
. Tampoc es poden fer servir llistes, tuples,
diccionaris ni cap altra estructura de dades per a desar tots els
elements dels iterables.
El professorat del seminari de matemàtiques d’un institut de secundària vol disposar de programes que ajudin als estudiants de ESO a entendre el càlcul de probabilitats.
Deseu les dues funcions següents al fitxer daus.py
.
En primer lloc, volen mostrar tots els resultats possibles quan es llença a l’aire un nombre donat d’objectes idèntics, com ara monedes o daus. Per això cal que dissenyeu la funció següent:
- daus.llista_casos(nobjectes, valors)¶
Donat el nombre d’objectes que es llencen, nobjectes i donada una llista, valors, que conté tots els valors possibles que poden tenir els objectes (p.e. [“CARA”, “CREU”] per les monedes, [1, 2, 3, 4, 5, 6] pels daus cúbics, [1, 2, 3, 4] pels daus tetraèdrics, etc), retorni una llista de llistes amb totes les combinacions de resultats possibles. L’ordre en què s’han de retornar les combinacions de la llista és l’ordre lexicogràfic induït per la relació:
valors[0] < valors[1] < valors[2] < … < valors[len(valors)-1]
essent valors[i] la llista de valors d’entrada. Aquest és l’ordre per defecte que utilitzen tant la funció
sorted()
com el mètodelist.sort()
del tipuslist
.>>> from daus import llista_casos >>> llista_casos(1, ['CREU', 'CARA']) [['CARA'], ['CREU']] >>> llista_casos(3, ['CARA', 'CREU']) [['CARA', 'CARA', 'CARA'], ['CARA', 'CARA', 'CREU'], ['CARA', 'CREU', 'CARA'], ['CARA', 'CREU', 'CREU'], ['CREU', 'CARA', 'CARA'], ['CREU', 'CARA', 'CREU'], ['CREU', 'CREU', 'CARA'], ['CREU', 'CREU', 'CREU']] >>> llista_casos(2, [1, 2, 3, 4]) [[1, 1], [1, 2], [1, 3], [1, 4], [2, 1], [2, 2], [2, 3], [2, 4], [3, 1], [3, 2], [3, 3], [3, 4], [4, 1], [4, 2], [4, 3], [4, 4]] >>> llista_casos(2, [4, 3, 1, 2]) [[1, 1], [1, 2], [1, 3], [1, 4], [2, 1], [2, 2], [2, 3], [2, 4], [3, 1], [3, 2], [3, 3], [3, 4], [4, 1], [4, 2], [4, 3], [4, 4]]
Per resoldre la funció
llista_casos()
podeu utilitzaritertools.product()
imap()
.En segon lloc, volen saber totes les possibles sumes de tirar n daus amb les cares numerades de forma no habitual. Per això cal que dissenyeu la funció següent:
- daus.conjunt_sumes(n, lc)¶
Donat n, el nombre de daus i lc, una llista amb els sis valors numèrics de les cares dels daus, retorna el conjunt (un set de Python) de possibles sumes resultants.
>>> from daus import conjunt_sumes >>> conjunt_sumes(2, [1,1,2,2,3,5]) == set([2,3,4,5,6,7,8,10]) True >>> conjunt_sumes(3, [0,2,4,6,8,9]) == set([0,2,4,6,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27]) True
Per resoldre la funció
conjunt_sumes()
podeu utilitzarmap()
isum()
.
Disposeu de jocs de prova al fitxer daus.txt
i d’una solució a daus.py
.