Voorbereiding

Voor deze opgave moet je gebruikmaken van de gegevenstypes date en timedelta die gedefinieerd worden in de module datetime 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 gegenereerd worden.

Omschrijving

Vrijdag de dertiende wordt in onze cultuur algemeen gezien als een ongeluksdag. Vanwaar dit bijgeloof komt, is niet direct geweten en hoewel er allerlei verklaringen zijn in verschillende godsdiensten en gebruiken, lijkt het er op dat dit bijgeloof nog maar hooguit een dikke 100 jaar oud is.

Ook is de combinatie van vrijdag en het getal dertien niet zo universieel als je wel zou denken. In ondere andere België, Nederland en Engeland wordt inderdaad vrijdag de dertiende als ongeluksdag gezien. In Griekenland, Spanje en Latijns-Amerika is het echter dinsdag de dertiende dat een ongeluksdag zou moeten zijn. In Italië is iedereen dan weer extra voorzichtig op vrijdag de zeventiende.

Opgave

Schrijf een functie geluksperiode die één verplicht argument heeft en drie optionele argumenten. Het verplichte argument geeft een startdatum en de optionele argumenten geven respectievelijk een einddatum, een dagnummer en een weekdagnummer. De functie moet als resultaat het maximaal aantal opeenvolgende dagen zonder "ongeluksdag" tussen de begindatum en de einddatum (inclusief de eindpunten) teruggeven. De ongeluksdag wordt bepaald door het opgegeven dagnummer en de opgegeven weekdag. Als het dagnummer 13 is en het weekdagnummer is 1 dan wordt dinsdag de dertiende als ongeluksdag beschouwd. Als enkel het verplichte argument wordt meegegeven, wordt het aantal dagen in de langste periode zonder vrijdag de dertiende tussen de begindatum en vandaag berekend. Indien de begindatum recenter is dan de einddatum, dan liggen er geen dagen tussen de begindatum en de einddatum, en moet de functie logischerwijs de waarde 0 als resultaat teruggeven.

Voorbeeld

>>> from datetime import date
>>> geluksperiode(date(2012, 1, 1), date(2012, 12, 31))
171
>>> geluksperiode(date(2012, 1, 1), date(2012, 12, 31), 14, 5)
170
>>> geluksperiode(date(2012, 1, 1), date(2012, 12, 31), 17, 4)
181
>>> geluksperiode(date(2012, 1, 1), date(2012, 12, 31), 13, 1)
244
>>> geluksperiode(
...     date(2012, 1, 1),
...     dagnummer = 1, 
...     weekdagnummer = 0, 
...     einddatum = date(2012, 12, 31)
... )
274