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 | ·-- ·· -· - · ·-· - ·· -- · |
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:
Een methode morse waaraan een string moet doorgegeven worden. De methode moet de vertaling van de gegeven string naar morsecode teruggeven. Hierbij moet elk karakter van de string omgezet worden naar de corresponderende voorstelling van het symbool in morsecode uit het bestand dat als eerste werd opgegeven bij het instantiëren van het object. Deze voorstellingen in morsecode van de individuele karakters moeten dan samengevoegd worden, telkens van elkaar gescheiden door één enkele spatie. Indien de gegeven string karakters bevat die niet als symbool voorkomen in het bestand dat als eerste werd opgegeven bij het instantiëren van het object, dan moet de functie een AssertionError opwerpen met de boodschap ongeldig woord.
Een methode homoniemen waaraan een voorstelling in morsecode moet doorgeven worden. De methode moet een verzameling teruggeven met alle woorden uit het bestand dat als tweede werd opgegeven bij het instantiëren van het object, waarvan de voorstelling in morsecode overeenkomt met de gegeven voorstelling in morsecode. Hierbij mag geen rekening gehouden worden met eventuele spaties in deze voorstellingen in morsecode.
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:
De ingebouwde functies repr en str moeten kunnen gebruikt worden om stringvoorstellingen van de objecten op te vragen. Bekijk onderstaande voorbeeldsessie om de opmaak van deze stringvoorstellingen te achterhalen.
De operator == moet kunnen gebruikt worden om na te gaan of twee morsewoorden gelijk zijn. Twee morsewoorden zijn gelijk als en slechts als ze homoniemen zijn.
De unaire operator - moet kunnen gebruikt worden om het inverse morsewoord (een object van de klasse Morsewoord) te bepalen, dat als volgt bekomen wordt:
bepaal de voorstelling in morsecode van het morsewoord
wissel in deze morsecode alle punten en streepjes om: punten worden streepjes en streepjes worden punten
bepaal alle homoniemen die overeenkomen met deze nieuwe morsecode
het inverse morsewoord is het lexicografisch eerste van deze homoniemen
Indien dit niet resulteert in een woord met een geldige voorstelling in morsecode, dan moet een AssertionError opgeworpen worden met de boodschap ongeldige bewerking.
De binaire operator + moet kunnen gebruikt worden om twee morsewoorden bij elkaar op te tellen. Het resultaat is een nieuw morsewoord (een object van de klasse Morsewoord) dat als volgt bekomen wordt:
bepaal de voorstelling in morsecode van de twee morsewoorden die bij elkaar opgeteld worden
voeg deze twee voorstellingen samen tot een nieuwe voorstelling in morsecode
bepaal alle homoniemen die overeenkomen met deze nieuwe morsecode
het resultaat is het lexicografisch eerste van deze homoniemen
Indien dit niet resulteert in een woord met een geldige voorstelling in morsecode, dan moet een AssertionError opgeworpen worden met de boodschap ongeldige bewerking.
De klasse ondersteunt een methode isPalinmorse waaraan geen argumenten moeten doorgegeven worden. Deze methode moet een Booleaanse waarde teruggeven, die aangeeft of het morsewoord al dan niet palinmorse is.
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
Hoe toevallig: In het Engels is OBSESSIVE het woord met de langste reeks opeenvolgende punten (18) in zijn vertaling in morsecode:
--- -··· ··· · ··· ··· ·· ···- ·