PROG0352 - Biorhythm
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:
-
>>> from datetime import date >>> birthday = date(1983, 1, 14) >>> d = date.today() - birthday >>> type(d) >>> d.days
-
>>> from datetime import timedelta >>> birthday + timedelta(1) >>> day1 = birthday + timedelta(1) >>> day1 >>> day2 = day1 + timedelta(1) >>> day2
-
>>> 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})$ |
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
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:
-
>>> 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.
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})$ |
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
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 |