Anagrames

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 així com els mètodes d’strings i llistes (tots exepte l’apartat 3). Tampoc es poden fer servir llistes, tuples, diccionaris ni cap altra estructura de dades per a desar tots els elements dels iterables (tots excepte apartats 1 i 5).

Una estudiant d’Enginyeria Industrial, aspirant a poetessa, vol signar la seva obra literària amb un nom fals que sigui un anagrama del seu nom vertader. Per triar el seudònim adient, decideix utilitzar les itertools de python per generar tots els possibles anagrames i filtrar-los d’acord amb una sèrie de criteris.

  1. Dissenyeu la funció:

    anagrames.obteLletres(s)

    que donat un string format per un nom i un cognom separats per un o més espais, retorna un iterador dels caràcters de l’string ordenats alfabèticament i eliminant els espais en blanc. Els caràcters generats han d’estar en minúscules. A l’string donat només hi ha caràcters alfabètics i espais. Exemples:

    >>> s = 'Anna Monles'
    >>> it = obteLletres(s)
    >>> for c in it:
    ...     print (c, end=' ')
    a a e l m n n n o s 
    >>> next(it)
    Traceback (most recent call last):
      ...
    StopIteration
    

    Disposeu de més jocs de proves al fitxer test-obteLletres.txt.

  2. Dissenyeu la funció:

    anagrames.obteAnagrames(iterable)

    que donat un iterable de caràcters, retorna un iterador de totes les possibles combinacions de tots els caràcters de l’iterable. Per resoldre aquesta funció podeu utilitzar itertools.permutations() i map(). Exemples:

    >>> s = 'avui'
    >>> it = obteAnagrames(s)
    >>> for c in it:
    ...     print (c, end = ' ')
    avui aviu auvi auiv aivu aiuv vaui vaiu vuai vuia viau viua uavi uaiv uvai uvia uiav uiva iavu iauv ivau ivua iuav iuva 
    >>> next(it)
    Traceback (most recent call last):
      ...
    StopIteration
    

    Disposeu de més jocs de proves al fitxer test-obteAnagrames.txt.

    Aplicant la funció anterior per a llistar els anagrames del seu nom, la nostra poetessa aviat s’adona que hi ha massa anagrames possibles, així que decideix concentrar-se primer en escollir un nom. Per això, decideix generar tots els noms d’un nombre de caràcters donat que es poden formar amb les lletres del seu nom i en els que hi hagi una alternança regular de vocal i consonant.

  3. Dissenyeu la funció booleana:

    anagrames.esValid(s)

    que donat un string, amb només caràcters alfabètics determina si conté una alternança regular de vocals i consonants. En aquesta funció sí que es pot usar for o while. Exemples:

    >>> esValid('tomas')
    True
    >>> esValid('anna')
    False
    

    Disposeu de més jocs de proves al fitxer test-esValid.txt.

  4. Dissenyeu la funció:

    anagrames.obteNoms(s)

    que, donat un iterable d”strings i un enter nc, retorna un iterador amb substrings formats pels nc primers caràcters dels strings de l’iterable i tals que tinguin una alternança regular de vocals i consonants. Per resoldre aquesta funció podeu utilitzar filter() i map(). Exemples:

    >>> it = obteNoms(['tomasnenan', 'staanmonen','satanmonen','tomasnenna'], 5)
    >>> next(it)
    'tomas'
    >>> next(it)
    'satan'
    >>> next(it)
    'tomas'
    >>> next(it)
    Traceback (most recent call last):
      ...
    StopIteration
    

    Disposeu de més jocs de proves al fitxer test-obteNoms.txt.

  5. Dissenyeu la funció:

    anagrames.crearLlista(it)

    que donat un iterable de noms, retorni la llista dels noms de l’iterable, ordenada alfabèticament i sense repeticions. Exemples:

    >>> crearLlista(['tomas', 'satan','tomas', 'nenas', 'nenas'])
    ['nenas', 'satan', 'tomas']
    

    Disposeu de més jocs de proves al fitxer test-crearLlista.txt.

Un cop generada la llista de noms, la poetessa n’escull un i genera tots els cognoms que es poden formar amb les lletres restants del nom per tal de triar el que més li agrada. Fixeu un criteri que hagin de complir els cognoms per filtrar la llista i implementeu la funció corresponent.

Solució

Disposeu d’una solució a anagrames.py.