Außerdem solltest du dir die folgenden Unterschiede klar machen:
Code: Alles auswählen
>>> str(range(10))
'[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]'
>>> map(str, range(10))
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
>>> string.digits
'0123456789'
Code: Alles auswählen
>>> str(range(10))
'[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]'
>>> map(str, range(10))
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
>>> string.digits
'0123456789'
Hm, ich hab ``str(range(9))`` einfach ausprobiert, und es hat geklappt, also hab ich mir da keine weiteren Gedanken gemacht. Vielen vielen Dank Es ist dann wohl logischer string.digits oder die Methode mit ``map()`` zu verwenden.EyDu hat geschrieben:Du hast auch nicht an die neun gedacht
Außerdem solltest du dir die folgenden Unterschiede klar machen:Code: Alles auswählen
>>> str(range(10)) '[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]' >>> map(str, range(10)) ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] >>> string.digits '0123456789'
Code: Alles auswählen
>>> alpha = string.ascii_lowercase
>>> offset = 3
>>> dict(zip(alpha, alpha[offset:]+alpha[:offset]))
{'a': 'd', 'c': 'f', 'b': 'e', 'e': 'h', 'd': 'g', 'g': 'j', 'f': 'i', 'i': 'l', 'h': 'k', 'k': 'n', 'j': 'm', 'm': 'p', 'l': 'o', 'o': 'r', 'n': 'q', 'q': 't', 'p': 's', 's': 'v', 'r': 'u', 'u': 'x', 't': 'w', 'w': 'z', 'v': 'y', 'y': 'b', 'x': 'a', 'z': 'c'}
>>>
Code: Alles auswählen
>>> import string
>>> string.printable
'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c'
>>> string.printable.encode('rot13')
'0123456789nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c'
Okay, ich werde dann mal überlegen.EyDu hat geschrieben:[…], aber warum machst du eine Unterscheidung zwischen Groß- und Kleinbuchstaben. Das kann man alles in einem Rutsch erledigen, auch wenn das Ergebnis dann eventuell ein wenig anders ist. […]
Was hat das mit Codierung zu tun?Möchtest du deine Codierung beibehalten, dann solltest du doppelten Code in Funktionen auslagen.
`enumerate` habe ich kurz nachdem ich das Programm am Anfang geschrieben habe kennengelernt, und habe danach nicht daran gedacht, da es ja so schon gut ist.Und die ganzen "j" wirst du durch die enumerate-Funktion los.
Wieso? Ist das etwa bei anderen möglicherweise anders? In der Doku steht:Und natürlich möchtest du nicht 26 als magische Zahl benutzen, sonder die Länge der Strings.
The lowercase letters 'abcdefghijklmnopqrstuvwxyz'. This value is not locale-dependent and will not change.
Habe ich auch heute erst kennen gelernt, beim Lesen des Tutorials. Interessant, danke.Außerdem hätte ich noch etwas zum Nachdenken:Code: Alles auswählen
>>> alpha = string.ascii_lowercase >>> offset = 3 >>> dict(zip(alpha, alpha[offset:]+alpha[:offset])) {'a': 'd', 'c': 'f', 'b': 'e', 'e': 'h', 'd': 'g', 'g': 'j', 'f': 'i', 'i': 'l', 'h': 'k', 'k': 'n', 'j': 'm', 'm': 'p', 'l': 'o', 'o': 'r', 'n': 'q', 'q': 't', 'p': 's', 's': 'v', 'r': 'u', 'u': 'x', 't': 'w', 'w': 'z', 'v': 'y', 'y': 'b', 'x': 'a', 'z': 'c'} >>>
Danke, aber ich krieg es nicht hin, damit umzugehenIm string-Modul gibt es übrigens auch eine translate-Funktion.
JakobSebastian
Super, nur irgendwie ein bisschen unnütze, wenn man nicht nur Rot13 machen willderdon hat geschrieben:Am einfachsten bleibt aber immer noch str.encodeCode: Alles auswählen
>>> import string >>> string.printable '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c' >>> string.printable.encode('rot13') '0123456789nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c'
ROT-13 ist mir eigentlich zu unsicher. Ich hatte eher an die doppelte Verschlüsselungsstärke gedacht. Hat schon mal jemand ROT-26 implementiert?derdon hat geschrieben:Code: Alles auswählen
>>> import string >>> string.printable '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c' >>> string.printable.encode('rot13') '0123456789nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c'
Viel zu unsicher! Ich nehm 2 Mal ROT13./me hat geschrieben:Hat schon mal jemand ROT-26 implementiert?
Code: Alles auswählen
def encrypt_caesar(shift, plain, alpha=string.ascii_letters):
cipher = []
for char in plain:
for i, element in enumerate(alpha):
if char == element:
charnumber = (i + shift) % len(alpha)
chipher.append(string.ascii_letters[charnumber]
break
else:
cipher.append(char)
return "".join(cipher)
Code: Alles auswählen
>>> translation = string.maketrans("abcdefghij", "0123456789")
>>> string.translate("Spam and Eggs", translation)
'Sp0m 0n3 E66s'
Hm, ich denke da an sowas:/me hat geschrieben:ROT-13 ist mir eigentlich zu unsicher. Ich hatte eher an die doppelte Verschlüsselungsstärke gedacht. Hat schon mal jemand ROT-26 implementiert?derdon hat geschrieben:Code: Alles auswählen
>>> import string >>> string.printable '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c' >>> string.printable.encode('rot13') '0123456789nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c'
Code: Alles auswählen
def encrypt(plain_text):
cipher = plain_text
return cipher
def decrypt(cipher):
plain_text = cipher
return plain_text
text = raw_input('Type in your text! ')
while text != '':
text += raw_input('> ')
print "Encrypted:", encrypt(text)
print "Decrypted:", decrypt(text)
Das möchte ich aber auf keinen Fall :/EyDu hat geschrieben: Dabei ändert sich dann natürlich die Codierung, da, bei einer Verschiebung von 1, das "z" nicht mehr auf das "a" fällt, sondern auf das "A".
Oh, ja, stimmt!Das du "len" statt einer magischen Zahlen benutzen solltest hat ganz einfache Gründe: Die 26 sagt erstmal gar nichts aus und bei etwas komplexeren Programmen wirst du in zwei Wochen nicht mehr wissen, für was die Zahl steht […]
Ich habe mal das Programm umgeschrieben, dass es ``str.find()`` benutzt:Der nächste Schritt bei dir ist, von der for-Schleife weg zu kommen und ein Dictionary einzusetzen (oder zunächst einmal die find-Methode auf Strings).
Das kommt später dann, muss jetzt losDann solltest du dir noch die get-Methode auf Dictionaries anschauen, mit etwas Überlegung kannst du dir auch den Sonderfall für nicht zu kodierende Zeichen einsparen.
Und zum translate:Code: Alles auswählen
>>> translation = string.maketrans("abcdefghij", "0123456789") >>> string.translate("Spam and Eggs", translation) 'Sp0m 0n3 E66s'
Code: Alles auswählen
translation = dict(zip(l+u, l[shift:]+l[:shift]+u[shift:]+u[:shift]))
AaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEyDu hat geschrieben:Code: Alles auswählen
translation = dict(zip(l+u, l[shift:]+l[:shift]+u[shift:]+u[:shift]))