PROG0352 - Biorhythm

no tags 

Preparation

In this exercise you can make use of the data types date and timedelta that are defined in the datetime module. This module is part of the Python Standard Library. Before working on the actual assignment, you may first have a look at how Python responds when you successively enter the following instructions in an interactive Python session:

  1. >>> from datetime import date
    >>> birthday = date(1983, 1, 14)
    >>> d = date.today() - birthday
    >>> type(d)
    >>> d.days
    
  2. >>> from datetime import timedelta
    >>> birthday + timedelta(1)
    >>> day1 = birthday + timedelta(1)
    >>> day1
    >>> day2 = day1 + timedelta(1)
    >>> day2
    
  3. >>> today = date.today()
    >>> today
    >>> today.weekday()
    >>> tomorrow = today + timedelta(1)
    >>> tomorrow.weekday()
    >>> tomorrow.day
    

Make sure you understand why a particular result is generated.

Description

According to believers in biorhythms, a person's life is influenced by rhythmic biological cycles that affect one's ability in various domains, such as mental, physical and emotional activity. These cycles begin at birth and oscillate in a steady (sine wave) fashion throughout life. By modeling the cycles mathematically, a person's level of ability in each of these domains can be predicted from day to day. All three cycles have a different period, as biorhythmics assumes that a person does not have 100% all of his abilities at every moment. Instead, his availabilities fluctuate in a cyclic manner similar to most natural processes. The availability of a particular ability increases, reaches a maximum, and then again declines until a minimum is reached. When this cyclic process is projected onto a continuous line, a chain of sinusoids is obtained. The three biorhythmic cycles are: 

cycle period (days) function
physical 23 $\sin(\frac{2 \pi t}{23})$
emotional 28 $\sin(\frac{2 \pi t}{28})$
intellectual 33 $\sin(\frac{2 \pi t}{33})$
The expression $\sin(\frac{2 \pi t}{a})$ represents a sine wave with period $a$, where the sine function $\sin$ only takes values in the interval $[-1,1]$. In applying this expression for the calculation of the biorhythm, $t$ indicates the age of a person expressed as a given number of days. At birth ($t = 0$) all three cycles of a person start at value 0. As such, the score for someone's physical, emotional and intellectual cycle is initially 0%. After one year ($t = 365$) the same person has a physical score of -73%, an emotional score of 22%, and an intellectual score of 37%. The biorhythm hypotheses originates from the beginning of the 20th century and was very popular during the seventies. As this theory never has been proven statistically, these days it is most popular on websites that also test your paranormal abilities.
Bioritme
The physical, emotional and intellectual cycles that determine the biorhythm of a person born at the 13th of May, 2012. All curves start at the day of birth ($t = 0$) with an initial value of 0.

Assignment

Write a function biorhythm that returns the physical, emotional and intellectual score of a person with a given birthday (mandatory first parameter) at a particular date (optional second parameter). In case no value is explicitly passed to the second parameter, the function must compute the biorhythm scores for the current day. Dates are passed to the function in string representation of the format dd-mm-yyyy. As such, the date September 26, 2013 is passed as the string 26-09-2013. The scores must be returned as a tuple containing three integers, where each score is expressed as a percentage that is rounded to the nearest integer.

Example

>>> biorhythm('08-02-2007', '08-02-2008')  # 365 days
(-73, 22, 37)

>>> biorhythm('26-03-1985', '14-08-2009')
(100, 62, -54)

>>> biorhythm('06-08-1945', '14-11-2013')
(98, -62, -87)

>>> biorhythm('09-08-1945')                # calculated at 12-11-2013
(0, 43, -10)                               # do not include in doctest !!

Pay attention! The value returned by evaluating biorhythm('09-08-1945') is dependent on the current day. Today's result will thus be different from tomorrow's result. As such, we cannot include this test case directly into a doctest. The following rewritten version of the test case however can be used in a doctest:

>>> from datetime import date
>>> today = '{t.day}-{t.month}-{t.year}'.format(t=date.today())
>>> biorhythm('09-08-1945') == biorhythm('09-08-1945', today)
True
>>> biorhythm('18-03-1994') == biorhythm('18-03-1994', today)
True

Epilogue

stop sine
A sine function that stops after one period is called a stop sine.

Voorbereiding

Voor deze opgave moet je gebruik maken van de gegevenstypes date en timedelta die gedefinieerd worden in de module datetime. Deze module maakt deel uit van de Python Standard Library. 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.


Added by:Peter Dawyndt
Date:2013-03-30
Time limit:10s
Source limit:50000B
Memory limit:1536MB
Cluster: Cube (Intel G860)
Languages:PY_NBC
Resource:None