Voorbereiding

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:

  1. >>> from datetime import date
    >>> geboortedatum = date(1983, 1, 14)
    >>> d = date.today() - geboortedatum
    >>> type(d)
    >>> d.days
  2. >>> from datetime import timedelta
    >>> geboortedatum + timedelta(1)
    >>> dag1 = geboortedatum + timedelta(1)
    >>> dag1
    >>> dag2 = dag1 + timedelta(1)
    >>> dag2
  3. >>> 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.

Omschrijving

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.

Bioritme
De fysieke, emotionele en intellectuele cycli die het bioritme bepalen van een persoon die geboren is op 13 mei 2012. De drie curves hebben waarde nul op de geboortedag van die persoon ($$t = 0$$).

Opgave

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.

Voorbeeld

>>> 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

Epiloog

stop sine
Een sinusfunctie wordt in het Engels een sine function genoemd. Daarom noemt men sinusfunctie die stopt na één periode in het Engels een stop sine.