4108 morsen Entschlusseln von Morsecode
Kategorie:Kryptologie
Klasse:leicht
Eingabe:Siehe Spezifikation
Ausgabe:Siehe Spezifikation
Abzugebende Files: morsen.txt, Main.java, morsen/*.java , 2991.txt, 3007.txt

Kurzbeschreibung:

Ein Morsecode soll in Plain-Text (unverschlüsselten Text) zurückverwandelt werden.

Allgemeine Hinweise:

Aufgabenbeschreibung:

Die Aufgabe besteht darin, einen Morsecode zurückzuverwandeln in lesbare Form. Das Alphabet des Morsecodes umfasst drei Zeichen. Ein kurzes und ein langes Signal sowie ein Pausezeichen um die einzelnen Zeichen voneinander unterscheiden zu können. Im Programm werden die drei Zeichen repräsentiert durch "." (Punkt für kurzes Signal) "-" (Strich für langes Signal) und "!" (Rufezeichen für Pause).

Das Programm soll mit dem Standardalphabet, Ziffern und einige Satzzeichen umgehen können. Im folgenden eine Auflistung des zu verwendenden Alphabets:

Alphabet... (max. 4 codierte Zeichen)
.- A --. G -- M ... S -.-- Y
-... B .... H -. N - T --.. Z
-.-. C .. I --- O ..- U    
-.. D .--- J .--. P ...- V    
. E -.- K --.- Q .-- W    
..-. F .-.. L .-. R -..- X    

Ziffern... (5 Zeichen)
.---- 1 -.... 6
..--- 2 --... 7
...-- 3 ---.. 8
....- 4 ----. 9
..... 5 ----- 0

Satzzeichen... (6 Zeichen, bestehen aus mehreren Buchstaben)
Punkt (.) .-.-.- (AAA)
Beistrich (,) --..-- (MIM)
Fragezeichen (?) ..--.. (IMI)
Doppelpunkt (:) ---... (OS)

Eingabedaten:

Eingelesen wird ein Morsecode, dieser umfasst ausschliesslich die erlaubten Zeichen des Morsecodes (".","-","!"). Sämtliche andere Zeichen (auch Spaces) sind nicht erlaubt und sollen mit einer Fehlermeldung quitiert werden (Siehe Fehlerbehandlung). Die Eingabe soll mit einem Pausezeichen beginnen, dann folgt das erste Zeichen in codierter Form, gefolgt wiederum von einem Pausezeichen. Zu beachten ist, dass die Zeichenfolge eine Länge von 100 Zeichen nicht überschreitet.

Ausgabedaten:

Das Programm muss nun den Morsecode in Plain-Text umwandeln. Der Morsecode wurde unter den Gesichtspunkten möglichst hoher Performance erstellt. Die einzelnen Zeichen sind dabei so codiert, dass Zeichen mit hoher Auftretenswahrscheinlichkeit entsprechend wenige Zeichen für die Übertragung brauchen. In die Überlegungen miteinbezogen wurde dabei auch die Tatsache, dass die Übertragung eines langen Signals drei mal länger benötigt, als die Übertragung eines kurzens. Der Code ist also darauf ausgelegt ein Maximum an Informationen zu übertragen. Um nun diese Eigenschaften des Morsecodes auch bei der Decodierung auszunützen ist ein Codebaum, ausgehend vom Pausezeichen zu erstellen, der sich in "-" und "." Äste verzweigt. Aus dem Eingabestring ist sodann die Zeichenfolge bis zum ersten Pausezeichen zu extrahieren. Nun kann der Codebaum entsprechend abgegangen werden. Man beginnt bei der Wurzel, dem Pausezeichen. Tritt als erstes codiertes Zeichen ein Punkt auf, so wendet man sich dem Punkt-Teil des Baumes zu, andernfalls dem Strichteil. Mit dem zweiten codierten Zeichen wird ebenso verfahren. Dies wird solange ausgeführt bis das erste Zeichenfolge vollständig abgearbeitet wurde. Nun hat man das entsprechende Zeichen im Plaintext gefunden. Es ist die Stelle im Baum wo man sich gerade befindet. Ist der Baum allerdings zu Ende, bevor alle Zeichen abgearbeitet wurden, so handelt es sich um eine fehlerhafte Codierung (siehe Fehlerbehandlung). Dieser Vorgang wird solange ausgeführt, bis sämtliche codierte Zeichen abgearbeitet sind. Die eleganteste Art dies zu lösen ist eine rekursive Programmierung. Ausgeben werden soll die Plaintext-Messages als String, gefolgt von einem Zeilenvorschub.

Fehlerbehandlung:

Als fehlerhafte Eingabe sind sämtliche Zeichen aufzufassen, die nicht aus dem Morsecode-Alphabeth entstammen. Ebenso kann als Fehler auftreten, dass eine (Teil-)Zeichenfolge des Codes keine Entsprechung im Plaintext-Alphabet hat. Tritt ein solcher Fall auf, so ist die Meldung "FALSCHE EINGABE" gefolgt von einem Zeilenvorschub auszugeben.

Beispiele:

Eingabedaten
!....!.!.-..!.-..!---!.--!---!.-.!.-..!-..

..........

Ausgabedaten
HELLOWORLD

FALSCHE EINGABE


Testen:

Diese Beispiele dienen nur zur Verdeutlichung der Spezifikation und müssen nicht korrekt formatiert sein. Die korrekte Formatierung entnehmen Sie bitte dem mitgelieferten Outputfile. Zum Testen Ihrer Lösung können Sie aus den mitgelieferten Eingabedaten wie folgt eine Ausgabedatei erzeugen:

java Main < morsen.i1 > morsen.out1

Das erzeugte File morsen.out1 können Sie dann mit dem mitgelieferten Outputfile morsen.o1 vergleichen.