Een organisatie laat haar leden zelf een gebruikersnaam kiezen. Om wildgroei van onzinnige gebruikersnamen tegen te gaan, legt de organisatie wel volgende beperkingen op:
gebruikersnamen mogen enkel bestaan uit letters
gebruikersnamen moet kunnen gevormd worden door het schrappen van letters uit de naam van de gebruiker (voornaam + familienaam)
De gebruikers van de organisatie hebben er echter een sport van gemaakt om op zoek te gaan naar bestaande woorden die zo lang mogelijk zijn, en die toch aan de opgelegde beperkingen voldoen. Als je naam Danny Kyung of Matthew Emes is, dan bieden deze regels immers alsnog de mogelijkheid om gebruikersnamen zoals dank1 (Danny Kyung) of memes2 (Matthey Emes) te rechtvaardigen.
Voortaan kunnen we dus ook spreken van Donald "Donut" Knuth (Donald Knuth) en Richard "Catalan" Stallman (Richard Stallman).
Schrijf een functie isgeldig waaraan twee argumenten moeten doorgegeven worden: een gebruikersnaam (str) en de naam van een gebruiker (str) bestaande uit de voornaam, een spatie en de familienaam. De functie heeft ook nog een optionele derde parameter lengte waaraan een natuurlijk getal (int) kan doorgegeven worden. De functie moet een Booleaanse waarde (bool) teruggeven, die aangeeft of de gegeven gebruikersnaam geldig is voor een gebruiker met de gegeven naam. Dit is het geval als de gebruikersnaam voldoet aan de twee voorwaarden die door de organisatie uit de inleiding opgelegd worden. Hierbij mag geen onderscheid gemaakt worden tussen hoofdletters en kleine letters. Als er een waarde $$n \in \mathbb{N}$$ wordt doorgegeven aan de parameter lengte, dan moet een gebruikersnaam ook minstens $$n$$ letters hebben om geldig te zijn.
Schrijf een functie gebruikersnamen waaraan twee argumenten moeten doorgegeven worden: i) een collectie (list, tuple of set) namen van gebruikers en ii) de locatie (str) van een tekstbestand dat een woordenlijst bevat, waarbij elk woord op een afzonderlijke regel staat. De functie heeft ook nog een optionele derde parameter lengte waaraan een natuurlijk getal kan doorgegeven worden. Deze parameter heeft dezelfde betekenis als bij de functie isgeldig. De functie moet een dictionary (dict) teruggeven waarvan de sleutels gevormd worden door alle namen (str) van gebruikers in de gegeven collectie. Elke naam moet door de dictionary afgebeeld worden op de verzameling (set) van alle woorden (str) in de gegeven woordenlijst die geldige gebruikersnamen zijn voor een gebruiker met die naam (conform de definitie van geldigheid zoals vastgelegd door de functie isgeldig).
In onderstaande voorbeeldsessie gaan we ervan uit dat de tekstbestanden gebruikersnamen01.txt3 en gebruikersnamen02.txt4 zich in de huidige directory bevinden.
>>> isgeldig('donut', 'Donald Knuth')
True
>>> isgeldig('Aladin', 'Alan Turing')
False
>>> isgeldig('Cannon', 'Claude Shannon', lengte=8)
False
>>> gebruikersnamen(['Donald Knuth', 'Alan Turing', 'Claude Shannon'], 'gebruikersnamen01.txt')
{'Donald Knuth': {'Donut'}, 'Alan Turing': {'Alanin', 'Anting'}, 'Claude Shannon': {'Cannon'}}
>>> gebruikersnamen(['Ada Lovelace', 'Konrad Zuse', 'Grace Hopper'], 'gebruikersnamen02.txt')
{'Ada Lovelace': {'dolce', 'adel', 'doel'}, 'Konrad Zuse': {'kade', 'knus', 'kous', 'oase'}, 'Grace Hopper': {'racer', 'chopper', 'rapper'}}
>>> gebruikersnamen(['Ada Lovelace', 'Konrad Zuse', 'Grace Hopper'], 'gebruikersnamen02.txt', lengte=5)
{'Konrad Zuse': set(), 'Ada Lovelace': {'dolce'}, 'Grace Hopper': {'rapper', 'chopper', 'racer'}}