Voor deze opgave moet je gebruikmaken van de gegevenstypes date en timedelta die gedefinieerd worden in de module datetime. Deze module maakt deel uit van de Python Standard Library1. Voor je aan de eigenlijke opgave begint, kan je best eerst nagaan hoe Python reageert als je achtereenvolgens de volgende instructies uitvoert binnen een interactieve Python sessie:
>>> from datetime import date
>>> geboortedatum = date(1983, 1, 14)
>>> d = date.today() - geboortedatum
>>> type(d)
>>> d.days
>>> from datetime import timedelta
>>> geboortedatum + timedelta(1)
>>> dag1 = geboortedatum + timedelta(1)
>>> dag1
>>> dag2 = dag1 + timedelta(1)
>>> dag2
>>> vandaag = date.today()
>>> vandaag
>>> vandaag.weekday()
>>> morgen = vandaag + timedelta(1)
>>> morgen.weekday()
>>> morgen.day
Zorg er zeker voor dat je begrijpt waarom de verschillende resultaten gegeneerd worden.
Volgens zij die in bioritmes geloven, wordt de levenscyclus beïnvloed door drie ritmische cycli die elk een verschillende periode hebben. De bioritmiek gaat er immers van uit dat een persoon niet op elk ogenblik in dezelfde mate de beschikking heeft over zijn vermogens en dat deze beschikbaarheid cyclisch verloopt zoals de meeste processen in de natuur. De beschikbaarheid van een vermogen neemt geleidelijk toe, bereikt een maximum, neemt dan weer af, bereikt een minimum en gaat dan weer toenemen. Als men dit cyclisch proces projecteert op een voortlopende lijn dan krijgt men een aaneenschakeling van sinusoïden. De drie cycli van het bioritme zijn:
cyclus | periode (dagen) | vergelijking |
---|---|---|
fysiek | 23 | $$\sin(\frac{2 \pi t}{23})$$ |
emotioneel | 28 | $$\sin(\frac{2 \pi t}{28})$$ |
intellectueel | 33 | $$\sin(\frac{2 \pi t}{33})$$ |
De vergelijking $$\sin(\frac{2 \pi t}{a})$$ vormt een sinuscurve met een periode $$a$$, waarbij de sinusfunctie $$\sin$$ enkel waarden aanneemt in het interval $$[-1,1]$$. Bij de toepassing van deze vergelijking voor de berekening van het bioritme wordt $$t$$ opgevat als het aantal dagen sinds de geboorte van een persoon. Bij de geboorte ($$t = 0$$) starten alle cycli van een persoon met waarde 0, zodat iedereen bij geboorte een fysieke, emotionele en intellectuele score heeft van 0%. Na één jaar ($$t = 365$$) heeft een persoon een fysieke score van -73%, een emotionele score van 22%, en een intellectuele score van 37%. De bioritmehypothese ontstond omstreeks het begin van de 20e eeuw en was heel populair in de jaren '70. Men is er echter nooit in geslaagd om een goede statistische onderbouw op te stellen waarmee deze hypothese kon bevestigd worden. Bioritmes vind je daarom vandaag de dag voornamelijk op websites waarop je jezelf ook kan testen op paranormale gaven.
Schrijf een functie bioritme
die de fysieke, emotionele en
intellectuele score teruggeeft voor een persoon met een gegeven
geboortedatum (verplicht eerste argument) op een bepaalde datum (optioneel
tweede argument). Indien er aan deze functie geen datum wordt doorgegeven
waarop de scores moeten worden berekend, dan moet de datum van vandaag
gebruikt worden. Een datum wordt opgegeven als string van de vorm dd-mm-jjjj.
Voor 26 september 2013 wordt dit dan de string 26-09-2013.
De functie moet de scores als een tuple van drie getallen teruggeven,
waarbij de scores uitgedrukt worden als een percentage dat wordt afgerond
naar het dichtsbijzijnde gehele getal.
>>> bioritme('08-02-2007', '08-02-2008') # 365 dagen
(-73, 22, 37)
>>> bioritme('26-03-1985', '14-08-2009')
(100, 62, -54)
>>> bioritme('06-08-1945', '14-11-2013')
(98, -62, -87)
>>> bioritme('09-08-1945') # berekend op 12-11-2013
(0, 43, -10) # niet opnemen in doctest !!
Let op! De waarde die wordt teruggegeven na evaluatie van bioritme('09-08-1945')
is afhankelijk van de huidige dag. De waarde die vandaag wordt
teruggegeven zal dus niet dezelfde zijn als de waarde die morgen wordt
teruggegeven. We kunnen dit testgeval dus niet zomaar opnemen in een
doctest. Het testgeval kan wel als volgt herschreven worden zodat het in
een doctest kan gebruikt worden:
>>> from datetime import date
>>> vandaag = '{v.day}-{v.month}-{v.year}'.format(v=date.today())
>>> bioritme('09-08-1945') == bioritme('09-08-1945', vandaag)
True
>>> bioritme('18-03-1994') == bioritme('18-03-1994', vandaag)
True