Op 20 januari 2017 werd Donald John Trump1 geïnaugureerd als vijfenveerstigste president van de Verenigde Staten. Sinds die dag zijn er tegelijkertijd vijf voormalige Amerikaanse presidenten nog in leven.
In de geschiedenis van Amerika zijn er slechts vier perioden geweest waarin dat het geval was:
4 maart 1861 - 18 januari 1862: Martin Van Buren, John Tyler, Millard Fillmore, Franklin Pierce, James Buchanan
20 januari 1993 - 22 april 1994: Richard Nixon, Gerald Ford, Jimmy Carter, Ronald Reagan, George H. W. Bush
20 januari 2001 - 5 juni 2004: Gerald Ford, Jimmy Carter, Ronald Reagan, George H. W. Bush, Bill Clinton
20 januari 2017 - 30 november 2018: Jimmy Carter, George H. W. Bush, Bill Clinton, George W. Bush, Barack Obama
Herbert Hoover leefde nog 11.553 dagen (31 jaar en 230 dagen) nadat hij zijn ambt had neergelegd. James Polk kon daarentegen slechts 3 maanden (103 dagen) van zijn pensioen genieten. In totaal zijn er acht presidenten geweest die nooit de status van "voormalig president" bereikten omdat ze overleden tijdens hun ambtstermijn: William H. Harrison (longontsteking), Zachary Taylor (buikgriep), Abraham Lincoln (vermoord), James A. Garfield (vermoord), William McKinley (vermoord), Warren G. Harding (hersenbloeding), Franklin D. Roosevelt (hersenbloeding) en John F. Kennedy (vermoord).
We werken met tekstbestanden die informatie bevatten over de levensduur en de ambtstermijn van de staatshoofden van een land. Elke regel bevat vijf informatievelden over een staatshoofd, die telkens van elkaar gescheiden worden door één enkele tab: i) naam van het staatshoofd, ii) geboortedatum, iii) begin van (eerste) ambtstermijn, iv) einde van (laatste) ambtstermijn en v) datum van overlijden. De vier datumvelden worden omschreven in het formaat dd/mm/jjjj, waarbij elk deel staat voor een natuurlijk getal zonder voorloopnullen: dd staat voor de dag, mm voor de maand en jjjj voor het jaartal. Hieronder staat een voorbeeld van zo een bestand met de informatie over de laatste tien presidenten van de Verenigde Staten.
Lyndon B. Johnson 27/8/1908 22/11/1963 20/1/1969 22/1/1973 Richard Nixon 9/1/1913 20/1/1969 9/8/1974 22/4/1994 Gerald Ford 14/7/1913 9/8/1974 20/1/1977 26/12/2006 Jimmy Carter 1/10/1924 20/1/1977 20/1/1981 Ronald Reagan 6/2/1911 20/1/1981 20/1/1989 5/6/2004 George H. W. Bush 12/6/1924 20/1/1989 20/1/1993 Bill Clinton 19/8/1946 20/1/1993 20/1/2001 George W. Bush 6/7/1946 20/1/2001 20/1/2009 Barack Obama 4/8/1961 20/1/2009 20/1/2017 Donald Trump 14/6/1946 20/1/2017
Als een staatshoofd tijdens meerdere onderbroken perioden zijn ambt heeft uitgeoefend, dan gaan we er gemakkelijkshalve van uit dat er slechts één ononderbroken ambtstermijn is die loopt van het begin van de eerste ambtstermijn tot het einde van de laatste ambtstermijn. Als het staatshoofd op vandaag nog in functie is, dan wordt het einde van zijn ambtstermijn voorgesteld door de lege string. Als het staatshoofd op vandaag nog in leven is, dan wordt de datum van zijn overlijden voorgesteld door de lege string. Gevraagd wordt:
Schrijf een functie staatshoofden waaraan de locatie van een tekstbestand moet doorgegeven worden dat informatie bevat over de levensduur en de ambtstermijn van de staatshoofden van een land. De functie moet een dictionary (dict) teruggeven die de namen (str) van alle staatshoofden in het bestand afbeeldt op een tuple met datums (datetime.date) van de vier gebeurtenissen uit het bestand, in dezelfde volgorde waarin ze als informatieveld voorkomen in het bestand. Als een gebeurtenis nog niet heeft plaatsgevonden, dan wordt die datum voorgesteld door de waarde None.
Schrijf een functie pensioen waaraan twee argumenten moeten doorgegeven worden: i) de naam (str) van een staatshoofd en ii) een dictionary (dict) die is opgebouwd zoals de dictionaries die teruggegeven worden door de functie staatshoofden. Als de gegeven naam niet als sleutel voorkomt in de gegeven dictionary, dan moet de functie een AssertionError opwerpen met de boodschap onbekend staatshoofd. Anders moet de functie moet een natuurlijk getal (int) teruggeven dat aangeeft hoeveel dagen het gegeven staatshoofd van zijn pensioen heeft kunnen genieten. Dit wordt berekend als het aantal dagen vanaf het einde van het ambtstermijn tot aan het overlijden (als het staatshoofd reeds gestorven is) of tot op vandaag (als het staatshoofd nog in leven is). Staatshoofden die op vandaag hun ambt nog aan het uitoefenen zijn, hebben per definitie nog geen dagen van hun pensioen kunnen genieten.
Schrijf een functie levend waaraan een dictionary (dict) moet doorgegeven worden die opgebouwd is zoals de dictionaries die teruggegeven worden door de functie staatshoofden. De functie heeft ook nog een optionele parameter referentie waaraan een referentiedatum (datetime.date) kan doorgegeven worden. Als niet expliciet een waarde wordt doorgegeven aan de parameter referentie, dan moet de datum van vandaag als referentiedatum gebruikt worden. De functie heeft ook nog een optionele parameter voormalig waaraan een Booleaanse waarde (bool) kan doorgegeven worden (standaardwaarde False). De functie moet een verzameling (set) teruggeven met de namen (str) van alle staatshoofden uit de gegeven dictionary die nog in leven waren/zijn op de gegeven referentiedatum. Als de waarde True wordt doorgegeven aan de parameter voormalig, dan moet deze verzameling beperkt worden tot de voormalige staatshoofden op de referentiedatum.
We beschouwen een persoon als president voor het leven (dus vanaf zijn geboorte tot aan zijn dood, of tot op heden als de persoon vandaag nog leeft) en als voormalig president vanaf het einde van zijn (laatste) ambtstermijn.
Alle vergelijkingsoperatoren (<, >, <=, >=, == en !=) werken probleemloos voor datetime.date objecten.
>>> import datetime >>> datetime.date(2016, 1, 25) < datetime.date(2017, 1, 25) True
In onderstaande voorbeeldsessie gaan we ervan uit dat het tekstbestand vs_presidenten.txt2 zich in de huidige directory bevindt.
>>> presidenten = staatshoofden('vs_presidenten.txt3')
>>> presidenten['George Washington']
(datetime.date(1732, 2, 22), datetime.date(1789, 4, 30), datetime.date(1797, 3, 4), datetime.date(1799, 12, 14))
>>> presidenten['Barack Obama']
(datetime.date(1961, 8, 4), datetime.date(2009, 1, 20), datetime.date(2017, 1, 20), None)
>>> presidenten['Donald Trump']
(datetime.date(1946, 6, 14), datetime.date(2017, 1, 20), None, None)
>>> pensioen('Herbert Hoover', presidenten)
11553
>>> pensioen('James K. Polk', presidenten)
103
>>> pensioen('Bill Clinton', presidenten)
>>> pensioen('Abraham Lincoln', presidenten)
0
>>> pensioen('Donald Trump', presidenten)
0
>>> pensioen('Donald Duck', presidenten)
Traceback (most recent call last):
AssertionError: onbekend staatshoofd
>>> import datetime
>>> levend(presidenten)
{'Donald Trump', 'Jimmy Carter', 'George H. W. Bush', 'Bill Clinton', 'Barack Obama', 'George W. Bush'}
>>> levend(presidenten, voormalig=True)
{'George H. W. Bush', 'George W. Bush', 'Jimmy Carter', 'Bill Clinton', 'Barack Obama'}
>>> levend(presidenten, voormalig=True, referentie=datetime.date(2016, 12, 31))
{'George W. Bush', 'George H. W. Bush', 'Bill Clinton', 'Jimmy Carter'}
>>> levend(presidenten, voormalig=True, referentie=datetime.date(1861, 12, 31))
{'Martin Van Buren', 'Franklin Pierce', 'Millard Fillmore', 'James Buchanan', 'John Tyler'}
>>> levend(presidenten, voormalig=True, referentie=datetime.date(1994, 3, 26))
{'Jimmy Carter', 'Ronald Reagan', 'Gerald Ford', 'Richard Nixon', 'George H. W. Bush'}
>>> levend(presidenten, voormalig=True, referentie=datetime.date(2003, 10, 12))
{'Gerald Ford', 'Jimmy Carter', 'George H. W. Bush', 'Bill Clinton', 'Ronald Reagan'}
Hieronder staat een grafische tijdslijn met de levensduur en de ambtstermijn van alle presidenten van de Verenigde Staten. Sinds het presidentschap in 1789 werd ingevoerd, zijn er vierenveertig personen president van de Verenigde Staten geweest. Ze worden opgelijst in chronologische volgorde van uitoefening van hun presidentschap (Grover Cleveland is de enige president die het ambt tijdens twee onderbroken perioden heeft uitgeoefend; hij werd opgenomen in de volgorde van zijn eerste presidentschap).
Het gebeurt zelden dat zoveel voormalige Amerikaanse presidenten samen te zien zijn. Meestal komen ze enkel samen voor officiële gebeurtenissen zoals de inauguratie van een nieuwe president, maar op 21 oktober 2017 waren de vijf voormalige presidenten Jimmy Carter, George H. W. Bush, Bill Clinton, George W. Bush en Barack Obama samen te zien op een benefietconcert dat geld inzamelde voor de slachtoffers van de orkanen Harvey, Irma en Maria. George H. W. Bush had op dat moment al een vorm van Parkinson, waardoor hij in een rolstoel zat.