Rotatie is een zwakke vorm van encryptie die erin bestaat om elke letter van een woord te 'roteren'. Een letter roteren is zoveel als het verschuiven van de letter over een vast aantal posities $$r \in \mathbb{N}$$ in het alfabet. Wanneer $$r > 0$$ dan spreekt men van een rotatie naar rechts, en voor $$r < 0$$ spreekt men van een rotatie naar links. Hierbij wordt het alfabet als een circulaire lijst beschouwd, wat erop neerkomt dat na de letter z terug de letter a volgt (bij schuiven naar rechts), en dat de letter a dus voorafgegaan wordt door de letter z (bij schuiven naar links).
De rotatie van het woord monty over drie posities levert het woord prqwb. Hierbij zie je bijvoorbeeld dat drie posities rechts van de letter m in het alfabet de letter p staat, en dat door het circulair beschouwen van de lijst de letter b drie posities rechts van de letter y staat. Twee woorden worden geroteerde woorden genoemd indien er een $$r$$-rotatie ($$r \in \mathbb{N}$$) bestaat die het eerste woord omzet in het tweede woord. Zo zijn cobra en freud voorbeelden van geroteerde woorden, omdat een 3-rotatie van het woord cobra het woord freud oplevert. Merk op dat ook een (-3)-rotatie of een 23-rotatie van het woord freud het woord cobra oplevert. De eigenschap van de geroteerde woorden is met andere woorden symmetrisch.
Voor deze opdracht werken we enkel met woorden die uitsluitend uit kleine letters bestaan. Je opdracht bestaat erin om uit een lijst van woorden alle geroteerde woorden te vissen. Hiervoor ga je als volgt te werk:
Schrijf een functie rotatie die de $$r$$-rotatie ($$r \in \mathbb{N}$$) van een gegeven woord als resultaat teruggeeft. Aan deze functie moeten twee parameters doorgegeven worden: het gegeven woord (een string die enkel bestaat uit kleine letters) en de waarde $$r$$.
De woordstam van een woord is het geroteerde woord dat start met een opgegeven beginletter. Gebruik de functie rotatie om een functie woordstam te schrijven die de woordstam van een gegeven woord teruggeeft die start met een opgegeven beginletter. Als eerste verplichte parameter woord moet aan de functie een woord doorgegeven worden dat enkel bestaat uit kleine letters. De functie heeft ook nog een tweede optionele parameter beginletter, waarmee de beginletter van het stamwoord kan opgegeven worden. Standaard wordt de letter a als beginletter gebruikt.
Gebruik de functie woordstam om een functie geroteerdeWoorden te schrijven. Aan deze functie moet een lijst van woorden (bestaande uit kleine letters) doorgegeven worden. De functie moet als resultaat een verzameling van tuples teruggeven, waarbij elk tuple alle woorden uit de gegeven woordenlijst bevat die geroteerde woorden van elkaar zijn. Elk tuple uit de verzameling bevat dus twee of meer woorden, die alfabetisch gerangschikt moeten worden.
>>> rotatie('hal', 1)
'ibm'
>>> rotatie('monty', 3)
'prqwb'
>>> rotatie('python', 33)
'wfaovu'
>>> rotatie('shrubbery', -3)
'peoryybov'
>>> woordstam('hal')
'ate'
>>> woordstam(woord='monty', beginletter='x')
'xzyej'
>>> woordstam('python')
'ajeszy'
>>> woordstam('shrubbery', beginletter='f')
'fuehoorel'
>>> geroteerdeWoorden(['bubba', 'primero', 'fyffe', 'pippo', 'sulphur'])
{('primero', 'sulphur'), ('bubba', 'fyffe', 'pippo')}
>>> geroteerdeWoorden(['beowulf', 'harahan', 'leveler', 'rhesian'])
{('harahan', 'leveler')}