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.

halsketting
Halsketting met kralen die de naam 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.

Opgave

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:

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.

Voorbeeld

>>> 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

Epiloog

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.

cryptogram
Het cryptogram van Olivier Levasseur.

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.