In morsecode wordt elk karakter van een woord vertaald naar een unieke opeenvolging van punten (.) en streepjes (-), en worden de vertalingen van de individuele karakters telkens van elkaar gescheiden door één enkele spatie. Als we in deze voorstelling even alle spaties wegdenken, dan kunnen we enkele nieuwe definities bedenken.

We zeggen dat woorden homoniemen zijn, indien ze dezelfde voorstelling in morsecode hebben als we daarin de spaties wegdenken. De volgende drie woorden zijn bijvoorbeeld homoniemen:

woord morsecode
ADMITTED .- -.. -- .. - - . -..
EMIGATED . -- .. --. .- - . -..
PANACE .--. .- -. .- -.-. .

Het inverse van een woord bekomen we door in de voorstelling in morsecode alle punten en streepjes om te wisselen: punten worden streepjes en streepjes worden punten. Uiteraard heeft niet elk woord een bestaand inverse, terwijl andere woorden dan weer meerdere homoniemen als inverse kunnen hebben. Hier zijn alvast enkele voorbeelden:

woord morsecode inverse morsecode invers woord
ADMITTED .- -.. -- .. - - . -.. - ·· --·· --·· -·-- TIZZY
DEMENTED -·· · -- · -· - · -·· ·--- ··- ·-· -·-- JURY
FINNIEST ··-· ·· -· -· ·· · ··· - - -·-- -·-· --- --- -· TYCOON
NINETEEN -· ·· -· · - · · -· ·- - - · -- ·--· - ATTEMPT
NOSTALGIA -· --- ··· - ·- ·-·· --· ·· ·- ·-·· ·- -- · -· - ·- - ·· --- -· LAMENTATION

We zeggen dat een woord palinmorse is, als de voorstelling in morsecode van het woord palindromisch is. Hierbij laten we de spaties in die voorstelling buiten beschouwing. Hier zijn alvast enkele voorbeelden van palinmorse woorden:

woord morsecode
ANNEXING ·- -· -· · -··- ·· -· --·
INTERNAL ·· -· - · ·-· -· ·- ·-··
PROTECTORATE ·--· ·-· --- - · -·-· - --- ·-· ·- - ·
SOPRANOS ··· --- ·--· ·-· ·- -· --- ···
WINTERTIME ·-- ·· -· - · ·-· - ·· -- ·

Opgave

In deze opgave maken we gebruik van de tekstbestanden morsecode.txt1 en woorden.txt2 om gegeven woorden om te zetten naar hun voorstelling in morsecode, en om alle homoniemen op te zoeken die corresponderen met een gegeven voorstelling in morsecode. Hierbij mag je er altijd van uitgaan dat deze bestanden zich in de huidige directory bevinden. Elke regel van het tekstbestand morsecode.txt3 bevat een symbool bestaande uit één enkel karakter, gevolgd door een tab en de voorstelling van het symbool in morsecode. Alle symbolen die voorkomen in het bestand zijn verschillend. Het tekstbestand woorden.txt4 bevat een lijst van woorden, die elk op een afzonderlijke regel staan.

Definieer een klasse Morsecode die kan gebruikt worden voor het omzetten van woorden naar morsecode en het opvragen van alle homoniemen die corresponderen met een gegeven voorstelling in morsecode.  Bij het instantiëren van objecten van de klasse Morsecode moeten de locaties van twee tekstbestanden doorgegeven worden: i) een bestand dat opgemaakt is volgens het formaat van het bestand morsecode.txt5 en ii) een bestand dat opgemaakt is volgens het formaat van het bestand woorden.txt6. Voorts moet de klasse Morsecode de volgende methoden ondersteunen:

Definieer ook nog een klasse Morsewoord waarmee alle woorden met een geldige voorstelling in morsecode kunnen voorgesteld worden (de zogenaamde morsewoorden). Dit zijn de woorden die voorkomen in het bestand woorden.txt7 én waarvan alle karakters als symbool voorkomen in het bestand morsecode.txt8. Bij het instantiëren van objecten van de klasse Morsewoord moet een woord met een geldige voorstelling in morsecode doorgegeven worden. Indien dit niet het geval is, dan moet een AssertionError opgeworpen worden met de boodschap ongeldig morsewoord. Voorts moet de klasse Morsewoord het volgende gedrag ondersteunen:

Voorbeeld

In deze opgave gaan we er altijd van uit dat de huidige directory de tekstbestanden morsecode.txt9 en woorden.txt10 bevat.

>>> code = Morsecode('morsecode.txt', 'woorden.txt')
>>> code.morse('ADMITTED')
'.- -.. -- .. - - . -..'
>>> code.morse('EMIGATED')
'. -- .. --. .- - . -..'
>>> code.morse('PANACE')
'.--. .- -. .- -.-. .'
>>> code.homoniemen('.- -.. -- .. - - . -..')
{'ADMITTED', 'EMIGATED', 'PANACE'}

>>> woord = Morsewoord('ADMITTED')
>>> woord
Morsewoord('ADMITTED')
>>> print(woord)
.- -.. -- .. - - . -..
>>> Morsewoord('ADMITTED') == Morsewoord('PANACE')
True
>>> -woord
Morsewoord('TIZZY')
>>> woord.isPalinmorse()
False
>>> Morsewoord('SOPRANOS').isPalinmorse()
True
>>> Morsewoord('ABIDE') + Morsewoord('AMASS')
Morsewoord('PESTHOLES')

>>> Morsewoord('PANIC!')          # uitroepteken heeft geen voorstelling in morse
Traceback (most recent call last):
AssertionError: ongeldig morsewoord

>>> Morsewoord('FACEBOOK')        # woord komt niet voor in woordenlijst
Traceback (most recent call last):
AssertionError: ongeldig morsewoord

>>> -Morsewoord('ANDROID')        # geen woord met inverse morsecode in woordenlijst
Traceback (most recent call last):
AssertionError: ongeldige bewerking

Epiloog

Hoe toevallig: In het Engels is OBSESSIVE het woord met de langste reeks opeenvolgende punten (18) in zijn vertaling in morsecode:

 --- -··· ··· · ··· ··· ·· ···- ·