Morsecode
Was dich erwartet
Erklärung
Der Morsecode ist ein Code, der im 19. Jahrhundert erfunden wurde. Zunächst von Samuel Morse in unvollständiger Form aufgeschrieben, wurde er später standardisiert.
Das Codierungsverfahren wurde zur Kommunikation über Telegrafen, aber auch über Funk eingesetzt. Die verschiedenen Codewörter bestehen aus kurzen und langen Signalen, die beispielsweise optisch oder auch akkustisch übertragen werden können.
Mit einem Telegraphen (auch Telegraf geschrieben) können Nachrichten, sogenannte Telegramme, übertragen werden. Es gibt sehr unterschiedliche Arten von Telegraphen, wie den elektrischen Telegraphen, mit dem Nachrichten durch elektrische Impulse übertragen werden.
Als Darstellung werden häufig Punkte für kurze Signale, und Striche für lange Signale verwendet. Unten ist eine Liste mit häufig gebrauchten Codewörtern abgebildet.
A → •– B → –••• C → –•–• D → –•• E → • F → ••–• G → ––• H → •••• I → •• J → •––– K → –•– L → •–•• M → –– N → –• O → ––– P → •––• Q → ––•– R → •–• S → ••• T → – U → ••– V → •••– W → •–– X → –••– Y → –•–– Z → ––••
Häufig wird behauptet der Morsecode sei nicht präfixfrei. Belegt wird diese Behauptung damit, dass ein Codewort der Beginn eines anderen sein kann. Das codierte "e" sei beispielsweise der Beginn des codierten "a". Tatsächlich ist der Morsecode jedoch präfixfrei, da theoretisch ein Codewort immer mit einer Pause beendet wird, die nicht innerhalb eines Codeworts vorkommen kann.
Ein Code gilt als präfixfrei, wenn kein Codewort der Beginn eines anderen Codeworts ist. Gibt es in einem Code beispielsweise die Codewörter apfel und apfelbaum, so ist er nicht präfixfrei, da apfel der Beginn von apfelbaum ist.
Der Morsecode verwendet tatsächlich drei unterschiedliche Pausen: eine zwischen kurzen bzw. langen Signalen, eine längere zwischen Codewörtern, und die längste als Signal zum Ende eines Wortes. Damit kommt der Morsecode auf insgesamt 5 eingesetzte Elemente.
Testen
Hier kannst du, wenn du magst, weitere Codewörter des Morsecodes einfügen, oder auch deinen eigenen Code mit kurzen und langen Signalen definieren. Pausen musst du nicht hinzufügen, das machen wir automatisch.
Code
Erstellen wir zuerst ein Objekt mit dem Namen Morse, das all die wichtigen Funktionen bündelt.
Dieses Objekt soll eine Funktion zum Codieren und eine zum Decodieren umfassen. Fügen wir diese mal hinzu.
Sie brauchen als Parameter die Nachricht, ein Array mit Codewörtern, und einen Wahrheitswert, der angibt, was mit Buchstaben passiert, die kein passendes Codewort haben.
Das gilt für beide Funktionen. Das Array mit Codewörtern besteht dabei selbst aus Arrays, die an Index 0 das Codewort und an Index 1 den dazugehörigen Buchstaben als Strings definieren. (z.B. ["•", "e"])
Schauen wir uns zunächst die Funktion zum Codieren an. Wir definieren eine Variable output, die später die codierte Nachricht beinhalten soll. Somit soll sie am Ende der Funktion auch wieder zurückgegeben werden.
Nun iterieren wir über jeden Buchstaben der Nachricht.
Ist der betrachtete Buchstabe ein Leerzeichen, fügen wir die passende Darstellung im Morsecode output an, und gehen zum nächsten Buchstaben über.
Andernfalls gehen wir durch jedes Codewort und schauen, ob es zu dem betrachteten Buchstaben passt.
Falls das passende Codewort gefunden wurde, wird es in einer Variable gespeichert und wir gehen zum nächsten Schritt. Andernfalls bleibt die Variable leer.
Diese Variable müssen wir natürlich zunächst vor der Schleife initialisieren.
Ist die Variable nach der Schleife immer noch leer, wurde kein passendes Codewort zum Buchstaben gefunden. Nun wird abhängig vom Parameter skip der betrachtete Buchstabe selbst mit einem Leerzeichen, oder gar nichts an den output angehängt, bevor zum nächsten Buchstaben übergangen wird.
Wurde allerdings ein passendes Codewort gefunden, wird das Codewort an output angehängt, gefolgt von einem Leerzeichen, um das Ende des Morsesignals zu signalisieren.
Ähnliches passiert in der Methode zum Decodieren. Hier wird aber statt durch jeden Buchstaben, durch jedes Signal iteriert. Diese werden immer durch Leerzeichen getrennt, sodass die Nachricht, die als Parameter übergeben wurde, an den Leerzeichen aufgeteilt wird.
Zwei Leerzeichen im Morsecode signalisieren in dieser Implementation ein Lerrzeichen im Decodierten (also einen leeren String nach der Aufteilung bei Leerzeichen), sodass dieser Fall zuerst abgefangen wird.
Es wird ähnlich wie bei der Funktion zum Codieren hier der passende Buchstabe zum Codewort gesucht.
Und auf dem Ergebnis beruhend entsprechend der output ergänzt.
Fertig! 🎉