2. Concerts musicals¶
L’ajuntament d’una ciutat vol programar una sèrie de concerts musicals al llarg d’un any. Com que vol que els concerts estiguin ben distribuïts al llarg de l’any, ha decidit fer-ho de la següent manera: el primer concert es farà el primer dia de l’any (1 de gener), el darrer concert es farà l’últim dia de l’any (31 de desembre) i la resta de concerts es programaran de manera que hi hagi el mateix període temporal entre ells, tant aproximadament com sigui possible.
Es demana que, en un fitxer anomenat concerts.py, hi deseu les funcions especificades a continuació.
2.1. Funció interval (3 punts)¶
En primer lloc caldrà calcular l’interval temporal entre concerts. Tingueu en compte que la duració d’un any és variable perquè hi ha anys de traspàs; per tant caldrà que feu servir el mòdul datetime. A tal fi, dissenyeu la funció següent:
- concerts.interval(a, n)¶
- Paràmetres:
a – any en què es volen programar els concerts (enter)
n – nombre de concerts que es volen programar (enter més gran o igual que 2)
- Retorna:
interval de temps entre concerts (instància de la classe
datetime.timedelta)
Per exemple:
>>> import concerts
>>> concerts.interval(2024, 5)
datetime.timedelta(days=91, seconds=21600)
>>> concerts.interval(2023, 8)
datetime.timedelta(days=52)
Disposeu d’un joc de proves més complet en el fitxer tests-interval.txt
2.2. Funció distribueix_concerts (3 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 tots els elements d’un iterador.
Un cop calculat l’interval de temps entre concerts, n’hi ha prou amb distribuir els concerts al llarg de l’any equiespaiats, començant pel primer dia de l’any. Dissenyeu la funció següent, que podeu implementar bé com a generador o bé utilitzant les funcions predefinides de python i el mòdul itertools:
- concerts.distribueix_concerts(a, n, interval)¶
- Paràmetres:
a – any en què es volen programar els concerts (enter)
n – nombre de concerts que es volen programar (enter més gran o igual que 2)
interval – interval de temps entre concerts (instància de la classe
datetime.timedelta)
- Retorna:
iterador sobre la seqüència de tuples (dia, mes) amb els dies de l’any en què es programaran els concerts, en ordre cronològic. El primer concert es programa el dia 1 de gener a les 12 del migdia.
Per exemple:
>>> import concerts
>>> import datetime
>>> it = concerts.distribueix_concerts(2024, 5, datetime.timedelta(days=91, seconds=21600))
>>> next(it)
(1, 1)
>>> next(it)
(1, 4)
>>> for dm in it:
... print(dm, end="-")
(2, 7)-(1, 10)-(31, 12)-
>>> it = concerts.distribueix_concerts(2023, 8, datetime.timedelta(days=52))
>>> list(it)
[(1, 1), (22, 2), (15, 4), (6, 6), (28, 7), (18, 9), (9, 11), (31, 12)]
Disposeu d’un joc de proves més complet en el fitxer tests-concerts.txt