Vierkantsworteldag is een officieuze feestdag die gevierd wordt op datums waarop zowel de dag van de maand als de maand zelf de vierkantswortel zijn van de laatste twee cijfers van het jaar. Zo vielen de laatste vierkantsworteldagen bijvoorbeeld op 3 maart 2009 (3/3/2009) en 4 april 2016 (4/4/2016). De volgende vierkantsworteldag wordt gevierd op 5 mei 2025 (5/5/2025). De laatste vierkantsworteldag van deze eeuw valt op 9 september 2081 (9/9/2081).

De eerste vierkantsworteldag werd op 9 september 1981 (9/9/1981) in het leven geroepen door Ron Gordon, een leraar uit Redwood City (Californië) in de Verenigde Staten van Amerika. Gordon blijft tot op vandaag deze feestdag promoten door persberichten te versturen naar allerlei media. De dochter van Gordon heeft een Facebookgroep1 opgericht waarop mensen kunnen delen hoe ze vierkantsworteldag gevierd hebben. Een aanbevolen manier om de feestdag te vieren is trouwens door het eten van vierkante radijzen of andere wortelgroenten die in vierkante stukken gesneden zijn en zo dus "vierkante wortels" vormen.

vierkantsworteldag
De laatste vierkantsworteldag werd gevierd op 3 maart 2009 (3/3/2009).

Maar vierkantsworteldag is zeker niet de enige obscure feestdag. Pi-dag ($$\pi$$-dag) is een feestdag die gewijd is aan de wiskundige constante $$\pi$$. Deze feestdag wordt wereldwijd op 14 maart gevierd, omdat deze datum in de Amerikaanse notatie geschreven wordt als 3/14 wat overeenkomt met de driecijferige benadering voor $$\pi$$. De viering begint gewoonlijk om 13:59 (1:59 PM) omdat 3,14159 de zescijferige benadering van $$\pi$$ is.

Het ultieme $$\pi$$-moment viel te beleven op 14 maart 1592 om 6:53 en 58 seconden, wat overeenkomt met 3/14/1592 6:53:58 in de Amerikaanse notatie voor datums. Dit correspondeert met de eerste 12 cijfers van $$\pi$$ (3,14159265358). Op scholen en universiteiten in Amerika begon men een aantal jaren geleden $$\pi$$-dag te vieren met het eten van taart (in het Engels pie; ook $$\pi$$ wordt door Engelstaligen zo uitgesproken) of $$\pi$$-zza, worden er etenswaren gemaakt in de vorm van $$\pi$$, en organiseert men Einstein look-alike wedstrijden (Albert Einstein werd geboren op 14 maart 1879).

pi pie
Pi pie ofwel $$\pi$$-taart zoals die typisch gebakken wordt op $$\pi$$-dag.

En wat dacht je van de feestdag die jaarlijks gevierd wordt op de laatste vrijdag van juli. Krijg je het steeds benauwd als je in een overvolle lift staat waarin niemand iets zegt? Vind je het ook prettig als iemand in een dergelijke situatie een poging doet om de stilte te doorbreken? Op de Talk In Elevator Day wordt iedereen aangespoord de moed bijeen te rapen om een vriendelijk woord te richten aan zijn of haar medepassagiers tijdens het nemen van een lift.

Opgave

Bepaal de eerste feestdag die volgt op een gegeven datum. Hiervoor moet je eerst de volgende drie functies schrijven waaraan telkens een datum (datetime.date) moet doorgegeven worden. Elke functie moet een Booleaanse waarde (bool) teruggeven die aangeeft of de gegeven datum op een bepaalde (officieuze) feestdag valt.

Schrijf nu ook een functie volgende_feestdag met de volgende parameters:

De functie moet de datum (datetime.date) teruggeven van de eerste feestdag die volgt op de gegeven datum. Als er geen datum opgegeven wordt, dan moet de eerste feestdag teruggegeven worden die volgt op de datum van vandaag. Feestdagen worden bepaald als datums waarvoor de gegeven functie de waarde True teruggeeft. Als aan de parameter zelf de waarde True wordt doorgegeven, dan moet de gegeven datum zelf ook in rekening gebracht worden als potentieel volgende feestdag. Anders wordt de gegeven datum buiten beschouwing gelaten bij het bepalen van de volgende feestdag.

Voorbereiding

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

Voorbeeld

>>> import datetime

>>> pidag(datetime.date(2014, 3, 14))
True
>>> pidag(datetime.date(2021, 5, 24))
False

>>> vierkantsworteldag(datetime.date(2016, 4, 4))
True
>>> vierkantsworteldag(datetime.date(2081, 9, 9))
True
>>> vierkantsworteldag(datetime.date(2014, 4, 5))
False

>>> liftdag(datetime.date(2014, 7, 25))
True
>>> liftdag(datetime.date(2015, 7, 21))
False

>>> volgende_feestdag(feestdag=vierkantsworteldag)
datetime.date(?, ?, ?)
>>> volgende_feestdag(feestdag=pidag)
datetime.date(?, ?, ?)
>>> volgende_feestdag(liftdag, datum=datetime.date(2014, 10, 12))
datetime.date(2015, 7, 31)
>>> volgende_feestdag(pidag, datum=datetime.date(2015, 3, 14), zelf=True)
datetime.date(2015, 3, 14)
>>> volgende_feestdag(datum=datetime.date(2081, 9, 9), feestdag=vierkantsworteldag)
datetime.date(2101, 1, 1)

Epiloog

Normaal gezien valt Nieuwjaar één week na Kerstmis: als Kerstmis bijvoorbeeld op een donderdag valt, dan valt Nieuwjaar ook op een donderdag. Wat was het laatste jaar waarin Kerstmis en Nieuwjaar op verschillende weekdagen vielen?

Strikvraagje. Binnen hetzelfde kalenderjaar vallen Kerstmis en Nieuwjaar altijd op verschillende weekdagen:

kalender
Binnen hetzelfde kalenderjaar vallen Kerstmis en Nieuwjaar altijd op verschillende weekdagen.