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