1. Seqüències d’enters (5 punts)

Avís

Per a resoldre aquest exercici no es poden fer servir llistes, tuples, diccionaris ni cap altra estructura de dades per a desar els elements d’un iterador.

En aquest exercici treballarem un iterador que lliura enters que estan organitzats com a subseqüencies de xifres (enters entre 0 i 9) i que acaben en -1. És a dir, totes les xifres lliurades abans d’arribar al valor -1 formen una subseqüència de xifres. Per exemple, un iterador que lliuri la següent seqüència o seguit d’enters:

6 3 -1 1 2 3 4 5 -1 -1

té tres subseqüències de xifres. La darrera és buida, i les dues primeres són:

6 3
1 2 3 4 5

La funció que demanem a continuació agafarà com a paràmetre un iterador com el que hem descrit, i tornarà un generador que lliurarà un enter per cada subseqüència de xifres donada pel paràmetre iterador. En l’exemple anterior de les tres subseqüències, el generador resultant lliurarà els tres enters:

63 12345 0

L’enter 63 s’ha determinat fent:

n=0 abans de començar l'obtenció de xifres,
n=6 aplicant 10*n+6 quan obtenim 6,
n=63 aplicant 10*n+3 quan obtenim 3,
podem dir que el nombre calculat és 63 (darrer valor de n) quan obtenim -1.

Es demana que, en un fitxer anomenat seqint.py, hi deseu la funció generadora especificada a continuació:

seqint.seqint(it)
Paràmetres:

it – iterador sobre una seqüència d’enters organitzada com a subseqüències s_i de xifres (0\ldots 9) finalitzades cadascuna amb l’enter -1 (i\ge 0). Com a mínim la seqüència té l’enter -1

Retorna:

iterador que genera un enter e_i per cada subseqüència s_i de xifres d”it. Si la subsequència s_i està formada per la seqüència de xifres x_0x_1\ldots x_{f-1} acabada amb x_f = -1, el valor de l’enter e_i s’obté aplicant el següent càlcul sobre les xifres x_0x_1\ldots x_{f-1} de la subseqüència s_i:

n_0 = 0

n_j = n_{j - 1} \times 10 + x_j \quad\forall j: 0 \le j \le f - 1

e_i = n_{f-1}

Per exemple:


Cas mínim (subseqüència buida o sense xifres):

>>> for n in seqint(iter([-1])):
...     print(repr(n), end='-')
0-

Una subseqüència amb les xifres 1 i 3:

>>> for n in seqint(iter([ 1, 3, -1 ])):
...     print(repr(n), end='-')
13-

Tres subseqüències:

>>> for n in seqint(iter([ 1, 2, 3, -1, 9, 8, -1, -1])):
...     print(repr(n), end='-')
123-98-0-


Disposeu d’un joc de proves més complet en el fitxer tests-seqint.txt