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.