@ice2k3: Warum das so aussieht? Na weil Du's so geschrieben hast.
Du verwendest ``for``-Schleifen über `range()` um Indexe zu generieren, Zähler die "manuell" hochgezählt werden, umständliches ``if``\s statt Modulo-Arithmetik, und geschachteltes Indexing auf `words`.
Der Name `encrypt` ist genau falsch, die Funktion müsste `decrypt` heissen. Das die einfach nur die Nachricht, und keinen Schlüssel als Argument benötigt, macht das Ganze komplett sinnlos. Wenn man eine verschlüsselte Nachricht, völlig ohne "geheimes" Wissen entschlüsseln kann, braucht man ja gar nicht erst verschlüsseln.
Mein Versuch:
Code: Alles auswählen
from functools import partial
def crypt(message, key, encrypt=True):
if key < 2:
raise ValueError('key must be >= 2')
message += ' ' * (-len(message) % key)
step = key if encrypt else len(message) // key
return ''.join(message[i::step] for i in xrange(step)).rstrip()
encrypt = crypt
decrypt = partial(crypt, encrypt=False)
def main():
message = 'Das ist eine lange Zeichenkette.'
for i in xrange(2, 10):
crypted = encrypt(message, i)
print '%d) %-38r %-38r' % (i, crypted, decrypt(crypted, i))