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:
-
Das Beispiel dieser Runde ist objektorientiert und als package zu lösen. Nachdem Sie das Programm mittels Dialogprogramm abgegeben haben, gehen Sie zu einem Tutor. Der Tutor überprüft, ob Sie Ihr Programm spezifikationsgemäß programmiert haben.
-
Unmittelbar nach der erfolgreichen Abgabe am Dialogprogramm können sie bereits die nächste Runde abholen.
-
Sie haben Lösungen (und Spezifikationen) aus der 3. Runde von anderen Studenten erhalten. Testen Sie alle mitgelieferten Lösungen und wählen Sie eine Lösung aus, die Ihnen hinsichtlich Lesbarkeit, Programmierstil,
Korrektheit und Verwendbarkeit am besten erscheint.
- Merken Sie sich die Lösungsnummer des ausgewählten Beispieles für die Abgabe. Diese Nummer müssen Sie bei der Abgabe angeben. Geben Sie nur jene Lösungsnummer an, die Sie auch wirklich ausgewählt haben.
-
Erstellen Sie für alle Lösungen zu diesem Beispiel (siehe: "Abzugebende Files") ein File mit dem Namen <number>.txt. und schreiben in dieses File ein Review (=Kritik) zu der Lösung. Diese Reviews erhalten dann die TeilnehmerIn von dem/der die Lösung stammt. Beachten Sie das bitte bei der Form Ihrer Kritik.
-
Sie können für die Lösung der gewählten Aufgabe eine oder mehrere Klassen programmieren. Die Klasse main.java muß aber die Methode main enthalten. Weiters müssen alle anderen abgegebenen Klassenfiles in Verzeichnis morsen vorliegen, Pfadangaben sind nicht gestattet.
-
Achten Sie auf die korrekten Konventionen der Groß/Kleinschreibung bei
Klassen und Methoden!
-
Falls Ihre Lösung einen Exit Code zurueckliefert, so
achten Sie darauf, dass dieser den Wert 0 hat.
Bei allen anderen Werten können Probleme bei der Bewertung und in weiterer
Folge unbeabsichtigte Punkteabzüge auftreten.
- Ihre Lösung darf nur genau jene Ausgabedaten liefern, die in der
Spezifikation verlangt werden. Die Ausgaben Ihrer Lösung werden automatisch mit Referenzdaten verglichen; etwaige Abweichungen führen zu Punkteabzügen!
- Testen Sie Ihre Lösung vor der Abgabe mit der mitgelieferten Eingabedatei. Geben Sie Ihre Lösung erst ab, wenn die Ausgaben Ihrer Lösung mit der ebenfalls mitgelieferten Ausgabedatei übereinstimmen! Testen Sie Ihre Lösung auch mit anderen Eingabedaten.
-
Verwenden Sie nur das von uns mitgelieferten Package eprog
für Ihre Ein/Ausgaben. Klassen, die Packages oder Klassen ausserhalb der verwendeten Übungsumgebung (Java2, Standard Edition, Version 1.3.1_1) verwenden, können von uns
nicht getestet werden und werden daher mit 0 Punkten bewertet!
- Schreiben Sie Ihre Klasse(n) möglichst allgemein und kommentieren
Sie diese gut. Erstellen Sie weiters eine übersichtliche und
verständliche Dokumentation. Damit erhöhen Sie Ihre Chancen,
daß andere Studenten in der nächsten Runde Ihre Lösung
wählen und Ihnen damit zu Zusatzpunkten verhelfen!
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.