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.

  1. 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ètode list.sort() del tipus list.

    >>> 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 utilitzar itertools.product() i map().

  2. 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 utilitzar map() i sum().

Disposeu de jocs de prova al fitxer daus.txt i d’una solució a daus.py.