De verjaardagsparadox1 stelt dat er meer dan 50% kans is dat in een groep van 23 personen, minstens twee personen dezelfde verjaardag hebben. Het gaat hierbij niet om een logische paradox — er valt nergens een tegenstrijdigheid te bespeuren — maar de observatie op zichzelf is contra-intuïtief.
Denk bijvoorbeeld aan een klas van 30 studenten. De meeste mensen denken dat het eerder toeval is als twee studenten van die klas op dezelfde dag jarig zijn. Maar dat is het allerminst. De kans dat het gebeurt is zelfs meer dan 70%.
De beste dataset om de verjaardagsparadox te testen, was deze zomer wellicht te vinden op de wereldbeker voetbal in Brazilië. Aan de eindronde van dit toernooi namen 32 landenploegen deel, die elk bestonden uit 23 spelers. Als de verjaardagsparadox waar is, dan verwachten we dat ongeveer 50% van de landenploegen minstens twee spelers hebben die op dezelfde dag jarig zijn.
Om dat te testen, hebben we uit de officiële ploegenlijst van de FIFA enkele gegevens over de spelers verzameld. We hebben daarbij de gegevens van alle spelers van een ploeg opgeslagen in een tekstbestand. Elke regel van zo een bestand bevat de volgende gegevens van een speler: i) naam, ii) landenploeg, iii) rugnummer, iv) positie op het veld (GK=doelman, DF=verdediger, MF=middenvelder, FW=aanvaller), v) geboortedatum (JJJJ-MM-DD), vi) aantal caps en vii) ploeg. Deze informatievelden worden telkens van elkaar gescheiden door een komma (,). Bij wijze van voorbeeld staan hieronder de eerste regels van het bestand france.txt2 dat informatie bevat over de spelers van het Franse elftal.
Hugo Lloris,France,1,GK,1986-12-26,57,Tottenham Hotspur
Mathieu Debuchy,France,2,DF,1985-07-28,21,Newcastle United
Patrice Evra,France,3,DF,1981-05-15,58,Manchester United
Raphaël Varane,France,4,DF,1993-04-25,6,Real Madrid
Mamadou Sakho,France,5,DF,1990-02-13,19,Liverpool
Yohan Cabaye,France,6,MF,1986-01-14,30,Paris Saint-Germain
In deze opgave werken we steeds met tekstbestanden die informatie bevatten over alle spelers van een voetbalelftal op het wereldkampioenschap voetbal. Deze informatie over de spelers is opgemaakt volgens het formaat dat werd beschreven in de inleiding. Alle tekstbestanden gebruiken UTF-8 codering (zie hieronder). Gevraagd wordt:
Schrijf een functie verjaardagen waaraan de locatie van een tekstbestand moet doorgegeven worden. De functie moet een dictionary teruggeven, die alle dagen in het jaar waarop minstens één speler van het elftal jarig is, afbeeldt op de verzameling van spelers die op die dag jarig zijn. Merk dus op dat de sleutels gevormd worden door dagen in het jaar (in het formaat MM-DD) die afgeleid moeten worden van de geboortedatums van de spelers uit het gegeven bestand.
Gebruik de functie verjaardagen om een functie verjaardagsparadox te schrijven. Aan deze functie moet de locatie van een tekstbestand doorgegeven worden. De functie moet een Booleaanse waarde teruggeven die aangeeft of er een dag is waarop minstens twee spelers van het elftal jarig zijn.
Gebruik de functie verjaardagsparadox om een functie testparadox te schrijven. Aan deze functie moet een lijst van landenploegen doorgegeven worden. Elke landenploeg wordt hierbij voorgesteld door een tuple met twee strings: de naam van het land en de locatie van een tekstbestand dat informatie over de spelers van de landenploeg bevat. De functie moet een verzameling teruggeven met de namen van alle landen die minstens twee spelers hebben die op dezelfde dag jarig zijn.
Unicode is een internationale standaard voor de codering van binaire codes naar grafische tekens en symbolen, vergelijkbaar met de ASCII-standaard. De Unicode tekenset is echter veel uitgebreider dan de 256 symbolen van de ASCII-tekenset. Unicode ondersteunt een aantal mogelijke coderingen voor de tekenset, die aangeven hoe de symbolen binair voorgesteld worden. Als je in Python een Unicode bestand wilt openen, dan kan de gebruikte codering doorgegeven worden aan de parameter encoding van de ingebouwde functie open. Om bijvoorbeeld informatie te lezen uit het Unicode bestand france.txt3 dat gebruikt maakt van UTF-8 codering, kan het bestand als volgt geopend worden:
>>> open('france.txt', 'r', encoding='utf-8')
Bij onderstaande voorbeeldsessie gaan we ervan uit dat de tekstbestanden algeria.txt4, belgium.txt5 en france.txt6 zich in de huidige directory bevinden.
>>> jarigen = verjaardagen('france.txt')
>>> jarigen['02-13']
{'Mamadou Sakho', 'Eliaquim Mangala'}
>>> jarigen['03-08']
{'Rio Mavuba', 'Rémy Cabella'}
>>> verjaardagsparadox('france.txt')
True
>>> verjaardagsparadox('belgium.txt')
False
>>> testparadox([('Algerije', 'algeria.txt'), ('België', 'belgium.txt'), ('Frankrijk', 'france.txt')])
{'Algerije', 'Frankrijk'}
J. Fletcher (2014). The birtday paradox at the World Cup. BBC News Magazine. 7