Solució del lliurament 1 G30 d’Ampliació d’Informàtica

Organització:

Secció ETSEIB, Departament de Ciències de la Computació, UPC

Data:

2 d’octubre de 2024

Durada:

30 minuts

Copyright:

Reconeixement-CompartirIgual 3.0 No adaptada de Creative Commons

Jocs de proves

>>> from itertools import islice

Test nombres Catalan

Els exemples que compten per la nota són només els que van seguits de # doctesttag: +TAG=1_catalan

>>> from catalan import catalan
>>> it = catalan(13)
>>> for i in range(13): # doctesttag: +TAG=1_catalan
...     print(i, ' - ', next(it))
...
0  -  1
1  -  1
2  -  2
3  -  5
4  -  14
5  -  42
6  -  132
7  -  429
8  -  1430
9  -  4862
10  -  16796
11  -  58786
12  -  208012
>>> for c in catalan(16):  # doctesttag: +TAG=1_catalan
...     print(c, end='-')
1-1-2-5-14-42-132-429-1430-4862-16796-58786-208012-742900-2674440-9694845-
>>> for i, c in islice(enumerate(catalan(21)), 17, 20) :   # doctesttag: +TAG=1_catalan
...     print('{} -- {}'.format(i,c))
17 -- 129644790
18 -- 477638700
19 -- 1767263190
>>> it = map(int, catalan(16))
>>> for i in range(16):  # doctesttag: +TAG=1_catalan
...     print(i, ' - ', next(it))
...
0  -  1
1  -  1
2  -  2
3  -  5
4  -  14
5  -  42
6  -  132
7  -  429
8  -  1430
9  -  4862
10  -  16796
11  -  58786
12  -  208012
13  -  742900
14  -  2674440
15  -  9694845
>>> for c in map(int, catalan(12)):  # doctesttag: +TAG=1_catalan
...     print(c, end='-')
1-1-2-5-14-42-132-429-1430-4862-16796-58786-
>>> for i, c in islice(enumerate(map(int, catalan(21))), 18, 21) :   # doctesttag: +TAG=1_catalan
...     print('{} -- {}'.format(i,c))
18 -- 477638700
19 -- 1767263190
20 -- 6564120420

Test dies

Els exemples que compten per la nota són només els que van seguits de # doctesttag: +TAG=2_dies

>>> from dies import dies_setmana
>>> ndies= ['dilluns','dimarts','dimecres','dijous','divendres',
...         'dissabte','diumenge']
>>> dies = [28, 29, 30, 1, 2]
>>> it = dies_setmana(ndies, 4, dies)
>>> next(it)  # doctesttag: +TAG=2_dies
('divendres', 28)
>>> next(it)  # doctesttag: +TAG=2_dies
('dissabte', 29)
>>> next(it)  # doctesttag: +TAG=2_dies
('diumenge', 30)
>>> next(it)  # doctesttag: +TAG=2_dies
('dilluns', 1)
>>> next(it)  # doctesttag: +TAG=2_dies
('dimarts', 2)
>>> next(it,'final')
'final'
>>> import itertools
>>> dies = itertools.chain(range(3, 32), range(1, 26))
>>> it = dies_setmana(ndies, 4, dies)
>>> next(it)
('divendres', 3)
>>> next(it)
('dissabte', 4)
>>> next(it)
('diumenge', 5)
>>> next(it)
('dilluns', 6)
>>> it2 = itertools.islice(it, 22, 28)
>>> for d in it2:     # doctesttag: +TAG=2_dies
...     print(d, end='-')
('dimecres', 29)-('dijous', 30)-('divendres', 31)-('dissabte', 1)-('diumenge', 2)-('dilluns', 3)-
>>> for d in  itertools.islice(it, 20, None):    # doctesttag: +TAG=2_dies
...     print(d, end='-')
('dilluns', 24)-('dimarts', 25)-

Fem un calendari a partir de l’iterador.

>>> from functools import reduce
>>> import operator
>>> n_set = {'dilluns': 0,'dimarts': 1,'dimecres': 2,'dijous': 3,
...          'divendres': 4,'dissabte':5 ,'diumenge': 6}
>>> def calendari(it):
...     def str_dia(dia):
...         dset, dmes = dia
...         return '{:2d} '.format(dmes) + ('\n' if dset == 'diumenge' else '')
...     s = 'dl dt dc dj dv ds dd \n'
...     dia = next(it)
...     s +=  '   ' * n_set[dia[0]] + str_dia(dia)
...     s += reduce(operator.add, map(str_dia, it))
...     return s
>>>
>>> dies = itertools.chain(range(1, 32), range(1, 31))
>>> it = dies_setmana(ndies, 3, dies)
>>> print(calendari(it))    # doctesttag: +TAG=2_dies
dl dt dc dj dv ds dd
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30