Fies an dieser Aufgabe ist, dass sie zwar auf der ctype-Folie steht, aber genau das nichts für ctype ist – rot13 basiert strikt auf ASCII und funktioniert nicht mit Umlauten und ähnlichem. Darum tut es folgendes:
#include <stdio.h>
int rotate13(int c)
{
if ('a'<=c && c<='z') {
c = ((c-'a')+13)%26+'a';
} else if ('A'<=c && c<='Z') {
c = ((c-'A')+13)%26+'A';
}
return c;
}
int main(void)
{
int c;
while ((c=fgetc(stdin))!=EOF) {
fputc(rotate13(c), stdout);
}
return 0;
}
In Python würde man das natürlich anders machen. Hier eine Lösung mit einem Dictionary. Für den Fall, dass es nicht offensichtlich ist: Die rot13-funktion ist transRot13:
def _mkRot13Dict(): return dict([(chr(65+i), chr(65+(i+13)%26)) for i in range(26)]+ [(chr(97+i), chr(97+(i+13)%26)) for i in range(26)]) _rot13Dict = _mkRot13Dict() transRot13 = lambda s: "".join([_rot13Dict.get(c, c) for c in s])
Die Inspiration dafür könnt ihr im Modul this nachlesen (importiert es mal versuchsweise).
Noch einfacher ist allerdings:
transRot13 = lambda s: s.decode("rot-13")
– und die Coolness von rot13 bringt es mit sich, dass auch
transRot13 = lambda s: s.encode("rot-13")
funktioniert. Ich gebe zu, dass das alles unter geek humor subsummiert werden kann.