Hier geht es um Strings, Bits, Streams und Verschlüsselung.
Bei der Cäsar-Verschlüsselung wird jeder Buchstabe einer Nachricht einfach immer um eine bestimmte Entfernung k nach rechts „verschoben“. Ist z. B. k = 3, so würde aus dem Wort „CAESAR“ das Wort „FDHVDU“ werden, da C zu F wird, A zu D und immer so weiter. Es wird also gewissermaßen auf jeden Buchstaben eine Zahl k „addiert“. Dabei handelt es sich um eine zyklische Addition. Das heisst, dass man wieder bei A beginnt, wenn man über den Buchstaben Z hinauskommt.
Um einen so verschlüsselten Geheimtext zu entschlüsseln, wendet man dasselbe Verfahren an, nur dass man nicht k addiert, sondern k subtrahiert (im Spezialfall k = 13 erhält man so das ROT13-Verfahren, bei es egal ist, ob man addiert oder subtrahiert).
Schreibe eine Funktion, die ein mit dem Cäsar-Verfahren verschlüsseltes Wort wieder entschlüsselt und das entschlüsselte Wort zurückgibt. Das verschlüsselte Wort wird als Parameter s
in die Funktion übergeben, der zur Verschlüsselung verwendete Wert k
ebenfalls.
Hinweise: Das Argument, das in s
übergeben wird, enthält ausschließlich Großbuchstaben von A bis Z (es enthält keine Leerzeichen oder sonstigen Sonderzeichen). Für den Wert k
gilt: 0 < k
< 26.
Beispiel
Eingabe:
k = 3
s = "WRSVHFUHW"
Ausgabe:
"TOPSECRET"
Erklärung: Alle Buchstaben werden um 3 Positionen im Alphabet nach links verschoben (da wir entschlüsseln) und so entsteht das Lösungswort.
Gegeben ist ein Datenstrom (also ein Text) unbekannter Länge, der von dir gefiltert werden soll. Ein bestimmtes Wort, das vorher definiert wird, soll durch dein Programm im Datenstrom immer durch ein anderes Wort ersetzt werden.
Implementiere die Methode receive
in der Klasse Filter
, die immer ein oder mehrere Zeichen dieses Datenstroms erhält und die Aufgabe hat, sie mit Hilfe der Methode send
wieder auszugeben. Achte aber darauf, dass du das Suchwort niemals ausgibst, sondern immer durch das Ersatzwort ersetzst.
Das Suchwort findest du in self.search
, das Ersatzwort in self.replace
(es handelt sich um Strings, es können also genaugenommen beliebige Zeichenketten sein, nicht nur Wörter).
Hinweis: du kannst bei der Lösung dieser Aufgabe nicht warten, bis du „alle“ Zeichen empfangen hast, um dann einfach alle Vorkommen von search
durch replace
zu ersetzen, weil du nie weißt, wann der Datenstrom zuende ist. Auch falls eine Weile lang kein Zeichen mehr kommt, heisst das nicht, dass der Datenstrom zuende ist. Sorge dafür, dass jedes Zeichen, das du ausgibst, so früh wie möglich gesendet wird.
Beispiel (für search
= "Alice"
und replace
= "Mallory"
)
Eingabestrom:
Alles deutet darauf hin: Alice hat den Keks aus der Dose geklaut.
Ausgabestrom:
Alles deutet darauf hin: Mallory hat den Keks aus der Dose geklaut.
Beispiel (für search
= "Euler"
und replace
= "Gauß"
)
Eingabestrom:
Showdown: Euler vs. 100 Eulen
Ausgabestrom:
Showdown: Gauß vs. 100 Eulen