Een halsketting bestaat uit een snoer waaraan kralen hangen. Op elke kraal staat één letter van het alfabet. Hieronder zie je bijvoorbeeld een halsketting waarvan de kralen het woord JESSICA spellen.
De kralen kunnen langs het snoer van de halsketting geschoven worden. Als we in de halsketting uit het voorbeeld de kraal met de letter J naar het andere uiteinde schuiven, dan spellen we op die manier het woord ESSICAJ. We kunnen ook de laatste twee kralen CA nemen en naar het andere uiteinde schuiven, om zo het woord CAJESSI te spellen.
Definieer een klasse Halsketting waarmee halskettingen kunnen voorgesteld worden. Bij het aanmaken van een halsketting (Halsketting) moet een string (str) met de letters op de kralen van de halsketting doorgegeven worden.
Als er een halsketting (Halsketting) wordt doorgegeven aan de ingebouwde functie str, dan moet een string (str) met de letters op de kralen van de halsketting teruggeven worden. Als er een halsketting (Halsketting) wordt doorgegeven aan de ingebouwde functie repr, dan moet een stringvoorstelling (str) teruggegeven worden die leest als een Python expressie waarmee een nieuwe halsketing (Halsketting) aangemaakt wordt met dezelfde letters op de kralen als de halsketting die aan de functie repr werd doorgegeven. Als er een halsketting (Halsketting) wordt doorgegeven aan de ingebouwde functie len, dan moet het aantal kralen (int) aan het snoer van de halsketting teruggegeven worden.
Op een halsketting $$h$$ (Halsketting) moeten minstens de volgende methoden kunnen aangeroepen worden:
Een methode schuif waaraan een getal $$m \in \mathbb{Z}$$ (int) moet doorgegeven worden. Als $$m \geq 0$$ dan moet de methode $$m$$ keer een kraal aan de linkerkant naar het andere uiteinde van de halsketting $$h$$ schuiven. Als $$m < 0$$ dan moet de methode $$|m|$$ keer een kraal aan de rechterkant naar het andere uiteinde van de halsketting schuiven. Hierbij staat $$|m|$$ voor de absolute waarde van $$m$$. De methode moet een verwijzing naar de halsketting $$h$$ teruggeven.
Een methode vormen waaraan geen argumenten moeten doorgegeven worden. De methode moet een verzameling (set) teruggeven met alle woorden (str) die zouden kunnen gespeld worden door letters van het ene naar het andere uiteinde van halsketting $$h$$ te schuiven. Al deze woorden moeten in hoofdletters gespeld worden, ongeacht het gebruik van hoofdletters en kleine letters op de kralen van halsketting $$h$$. Deze methode mag de volgorde van de kralen aan het snoer van halsketting $$h$$ niet wijzigen.
Een methode normaalvorm waaraan geen argumenten moeten doorgegeven worden. De methode moet het alfabetisch eerst gerangschikte woord (str, in hoofdletters) teruggeven van alle woorden die zouden kunnen gespeld worden door letters van het ene naar het andere uiteinde van halsketting $$h$$ te schuiven. Dit woord wordt de normaalvorm van halsketting $$h$$ genoemd. Deze methode mag de volgorde van de kralen aan het snoer van halsketting $$h$$ niet wijzigen.
Zorg ervoor dat de ingebouwde operator == kan gebruikt worden om te bepalen of twee halskettingen $$h_1$$ en $$h_2$$ (Halsketting) gelijk zijn. Dat is het geval als halsketting $$h_1$$ zou kunnen omgevormd worden tot halsketting $$h_2$$ door enkele kralen van het ene uiteinde naar het andere uiteinde te schuiven. Bij het vergelijken van de twee halskettingen mag de volgorde van de kralen aan de snoeren van $$h_1$$ en $$h_2$$ echter niet wijzigen en mag geen onderscheid gemaakt worden tussen hoofdletters en kleine letters.
Zorg ervoor dat de ingebouwde operator + kan gebruikt worden om een halsketting $$h$$ (Halsketting) en een getal $$m \in \mathbb{Z}$$ (int) met elkaar op te tellen ($$h + m$$ en $$m + h$$). Het resultaat is een nieuwe halsketting (Halsketting) die men bekomt door net zoals bij de methode schuif $$|m|$$ keer een kraal van het ene uiteinde naar het andere uiteinde van de halsketting te verschuiven. Bij het optellen van $$h$$ en $$m$$ mag de volgorde van de kralen aan het snoer van $$h$$ echter niet wijzigen. Als de ingebouwde operator + gebruikt wordt om een halsketting (Halsketting) op te tellen bij een object dat geen int is, dan moet een AssertionError opgeworpen worden met de boodschap ongeldige bewerking.
>>> ketting = Halsketting('Jessica')
>>> ketting
Halsketting('Jessica')
>>> print(ketting)
Jessica
>>> len(ketting)
7
>>> ketting.schuif(1)
Halsketting('essicaJ')
>>> ketting
Halsketting('essicaJ')
>>> ketting.schuif(-2)
Halsketting('aJessic')
>>> ketting.schuif(11)
Halsketting('sicaJes')
>>> ketting.vormen() # doctest: +SKIP
{'SICAJES', 'ESSICAJ', 'AJESSIC', 'JESSICA', 'CAJESSI', 'SSICAJE', 'ICAJESS'}
>>> ketting
Halsketting('sicaJes')
>>> ketting.normaalvorm()
'AJESSIC'
>>> ketting == Halsketting('Louise')
False
>>> Halsketting('Louise') == Halsketting('Elouis')
True
>>> ketting = Halsketting('Emily')
>>> ketting
Halsketting('Emily')
>>> ketting + 1
Halsketting('milyE')
>>> ketting
Halsketting('Emily')
>>> -2 + ketting
Halsketting('lyEmi')
>>> ketting + 9
Halsketting('yEmil')
>>> ketting + 'spam'
Traceback (most recent call last):
AssertionError: ongeldige bewerking
Volgens de overlevering zou piraat Olivier Levasseur1 — vlak voor hij in 1730 werd opgehangen — een halsketting in de menigte gegooid hebben met de woorden:
Aan diegene die het begrijpt: vind mijn schat!
Naar verluidt zou de halsketting dit cryptogram bevat hebben, dat velen sindsdien tevergeefs hebben proberen ontcijferen. Het testament van zijn compagnon de route Bernardin Nageon de L'Estang zou (naar men zegt) verwijzen naar
een aanzienlijke schat … die begraven ligt op mijn geliefde Île de France (nu Mauritius)
en het raadsel kan al dan niet verband houden met gravures die in 1923 in de rotsen op het strand van Bel Ombre2 op de Seychellen zijn gevonden door de Rose Savy, een afstammeling van L'Estang.
Zit hier iets van waarheid in? Wie weet? Nick Pelling schreef hierover alvast een skeptische discussie3 met een mogelijke interpretatie van het cryptogram volgens het rozenkruisersgeheimschrift4.