Morse is een gecodeerde communicatievorm bestaande uit signalen die met tussenpozen worden uitgezonden. Vastgelegde combinaties van deze signalen stellen dan de verschillende letters, leestekens en cijfers voor. Deze morsecode werd in 1835 uitgevonden en ontwikkeld door Samuel Morse, met als doel ze te gebruiken voor het verzenden van telegrafische berichten. Met een telegraaf (zie figuur) kon men namelijk enkel kiezen tussen twee toestanden: sleutel naar beneden (= stroom) of sleutel naar boven (= geen stroom) en tijdsduur (kort of lang). Telegrafie wordt algemeen beschouwd als een voorloper van de latere digitale communicatie. Merk op dat in snelheidswedstrijden tussen ervaren morsecodeoperatoren en experts in het verzenden van SMS berichten, morsecode steevast als overwinnaar1 uit de bus komt.
In de internationale morsecode worden korte signalen genoteerd met een punt (.) en lange signalen met een koppelteken (-). Elk karakter wordt dan voorgesteld als een unieke opeenvolging van punten en koppeltekens. Zo wordt de letter S in morsecode voorgesteld als ... en de letter O als ---. Het is dan ook algemeen bekend dat ... --- ... de voorstelling in morsecode is van het SOS signaal.
Het tekstbestand morse.txt2 bevat een lijst van karakters (eerste kolom) en hun corresponderende voorstelling in morsecode (tweede kolom). De kolommen worden gescheiden door een tab. In dit bestand zie je bijvoorbeeld dat de letter C in morsecode wordt voorgesteld als -.-. en dat een komma wordt voorgesteld als --..--.
Bij het versturen van berichten in morsecode wordt tussen elke twee opeenvolgende karakters normaal gezien een korte pauze ingelast (letterspatie) die wordt genoteerd met een spatie, en wordt tussen verschillende woorden telkens een langere pauze ingelast (woordspatie) die wordt genoteerd met een slash (/). Zo wordt het woord EARN bijvoorbeeld voorgesteld als
. .- .-. -.
en het woord URN als
..- .-. -.
Als we de tussenpauzes (spaties) echter negeren, dan worden deze twee
woorden in morsecode voorgesteld door hetzelfde patroon.
We zeggen dan dat de twee woorden isomorse
zijn. Merk op dat deze twee woorden ook homofoon zijn: ze zijn opgebouwd uit
dezelfde klanken, maar hebben een verschillende betekenis. Gevraagd
wordt:
Schrijf een functie morsecodes waaraan de locatie van een tekstbestand moet doorgegeven worden. Elke regel van dit bestand moet een karakter bevatten, gevolgd door een tab en de voorstelling van het karakter in morsecode. De functie moet een dictionary teruggeven, die elk karakter uit het gegeven bestand afbeeldt op zijn corresponderende voorstelling in morsecode. Indien het karakter een letter is, dan moet bij de afbeelding gebruikgemaakt worden van zijn hoofdlettervariant.
Schrijf een functie patroon waaraan twee argumenten moeten doorgegeven worden: een woord en een dictionary die karakters afbeeldt op hun corresponderende voorstelling in morsecode. Je mag ervan uitgaan dat alle karakters in het gegeven woord als sleutel gebruikt worden in de gegeven dictionary, waarbij voor de afbeelding van letters gebruikgemaakt wordt van hun hoofdlettervariant. De functie heeft ook nog twee optionele parameters complement en spiegel, waaraan een Booleaanse waarde kan doorgegeven worden (standaardwaarde: False). De functie moet het patroon samenstellen waarmee het woord wordt voorgesteld in morsecode (dus zonder spaties tussen de voorstelling van opeenvolgende karakters). Daarna moet de functie het complement bepalen van het gevormde patroon door elk punt te vervangen door een koppelteken en vice versa, maar enkel indien de waarde True wordt doorgegeven aan de parameter complement. Daarna moet de functie het patroon spiegelen door de volgorde van de karakters om te keren, maar enkel indien de waarde True wordt doorgegeven aan de parameter spiegel. Het patroon dat op die manier verkregen wordt, moet door de functie als resultaat teruggegeven worden.
Schrijf een functie isomorse waaraan drie argumenten moeten doorgegeven worden: twee woorden en een dictionary die karakters afbeeldt op hun corresponderende voorstelling in morsecode. Je mag ervan uitgaan dat alle karakters in de gegeven woorden als sleutel gebruikt worden in de gegeven dictionary, waarbij voor de afbeelding van letters gebruikgemaakt wordt van hun hoofdlettervariant. De functie heeft ook nog twee optionele parameters complement en spiegel, waaraan een Booleaanse waarde kan doorgegeven worden (standaardwaarde: False). De functie moet een Booleaanse waarde teruggeven die aangeeft of de twee gegeven woorden isomorse zijn. Dit is het geval als de twee woorden in morsecode voorgesteld worden door hetzelfde patroon. Om het patroon in morsecode van een gegeven woord te bepalen, moet uiteraard gebruikgemaakt worden van de gegeven dictionary en de functie patroon. Voor de vergelijking van de twee woorden moet het patroon van het tweede woord eventueel nog omgekeerd en/of gespiegeld worden indien respectievelijk de waarde True wordt doorgegeven aan de parameters complement en spiegel.
Schrijf een functie groepen waaraan de locatie van twee tekstbestanden moet doorgegeven worden. Het eerste tekstbestand moeten een lijst van woorden bevatten, elk op een afzonderlijke regel. Elke regel van het tweede bestand moet een karakter bevatten, gevolgd door een tab en de voorstelling van het karakter in morsecode. Je mag ervan uitgaan dat alle karakters die voorkomen in de gegeven woorden, ook voorkomen in het tweede bestand. De functie moet een dictionary teruggeven die de gegeven woorden met eenzelfde patroon in morsecode groepeert, door elk patroon in morsecode dat correspondeert met een gegeven woord af te beelden op de verzameling van alle gegeven woorden met datzelfde patroon. In dit geval moeten dus nooit complementaire of gespiegelde patronen bepaald worden.
Bij onderstaande voorbeeldsessie gaan we ervan uit dat de tekstbestanden morse.txt3 en woorden.txt4 zich in de huidige directory bevinden.
>>> codes = morsecodes('morse.txt')
>>> codes['C']
'-.-.'
>>> codes['U']
'..-'
>>> codes['N']
'-.'
>>> patroon('TAIPAN', codes)
'-.-...--..--.'
>>> patroon('TAIPAN', codes, complement=True)
'.-.---..--..-'
>>> patroon('TAIPAN', codes, spiegel=True)
'.--..--...-.-'
>>> patroon('TAIPAN', codes, complement=True, spiegel=True)
'-..--..---.-.'
>>> isomorse('TAIPAN', 'CUNETTE', codes)
True
>>> isomorse('TAIPAN', 'PYTHON', codes)
False
>>> isomorse('TAIPAN', 'ROUX', codes, complement=True)
True
>>> isomorse('TAIPAN', 'PATIENT', codes, spiegel=True)
True
>>> isomorse('TAIPAN', 'TUDOR', codes, complement=True, spiegel=True)
True
>>> isomorse('EDOMITE', 'EDOMITE', codes, spiegel=True)
True
>>> groepen('woorden.txt', 'morse.txt')
{'.--...-...-..': {'WILL', 'PITIED', 'PERINE', 'ADENINE'}, '.--.-.---....----.': {'PYTHON'}, '-.-...--..--.': {'TREPAN', 'CUNETTE', 'TAIPAN'}}
De gepatenteerde uitvinder Thomas Alva Edison (1847-1931) had een kleine beroepsmisvorming: hij vroeg zijn vrouw ten huwelijk in morsecode en gaf twee van zijn kinderen Marion Estelle en Thomas Alva Jr. de troetelnaampjes Dot en Dash.