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.