Sehr geehrtes Python Forum,
ich versuche gerade eine CaesarCode Variante zu Programmieren, die man z.B. mit "abcdefg"(ord("a"),ord("b")...) verschlüsseln kann, damit man nicht nur 26 mal ausprobieren muss.
Leider gelingt mir das nicht so ganz, da ich immer irgenteinen Zahlenwirrwar herausbekomme.
Kann mir jemand weiterhelfen?
Danke für Antworten.
MfG Robin
Caesar Code Variante
Wenn du mit Caesar Code ROT13 meinst, dann ist das in Python ganz einfach:
Zum selber implementieren die Suche benutzen oder einfach recherchieren/nachdenken.
Code: Alles auswählen
In [313]: import string
In [314]: string.ascii_letters
Out[314]: 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
In [315]: string.ascii_letters.encode('rot13')
Out[315]: 'nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM'
In [316]: string.ascii_letters.encode('rot13').encode('rot13')
Out[316]: 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
So verschiebe ich das aber immer um 13 Stellen.
Ich möchte es aber so haben, dass man es mehrmals um verschiedene Stellen verschiebt
Ich möchte es aber so haben, dass man es mehrmals um verschiedene Stellen verschiebt
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
;-)
@INFACT: Wie meinst Du das genau? Wenn Du einmal um `a` Stellen verschiebst und dann noch einmal um `b` Stellen, ist das das gleiche wie *einmal* um `a+b` Stellen zu verschieben. Damit hast Du also nichts gewonnen.
Kann sein, dass das ich das nicht richtig erkärt habe, ich meine ich, verschlüssele das um "a" und dann verschiebe ich das um a, also, wenn a=1 ist verschiebe ich das so:
"abcd"
"bcde" und dann verschieben
"cdeb"
"abcd"
"bcde" und dann verschieben
"cdeb"
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
;-)
Du suchst wohl einfach nur das hier:
yipyip
Code: Alles auswählen
def rotate(seq, n):
m = n % len(seq)
return seq[m:] + seq[:m]
print rotate('abcd', -1)
ls = [rotate('abcdefg', i) for i in range(9)]
for i in ls:
print i
yipyip
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Was nun folgt kann gar nicht "richtiger" seinINFACT hat geschrieben:Kann sein, dass das ich das nicht richtig erkärt habe,
Was meint "verschlüsseln"?ich meine ich, verschlüssele das um "a"
Ok, das war einleuchtend.und dann verschiebe ich das um a
Ich dachte erst wird "verschlüsselt"? Oder ist "verschlüsseln" nun doch einfach "verschieben"?, also, wenn a=1 ist verschiebe ich das so:
Ok, daran kann man erkennen, was Du willst ... wenn man scharf hinguckt"abcd"
"bcde" und dann verschieben
"cdeb"
Du meinst folgendes:
1.) Verschiebe jeden Buchstaben des Inputs um x Stellen im gegebenen Ausgangsalphabet.
2.) Rotiere den verschlüsselten Text um y Stellen.
So richtig?
T'schuldigung ich kann nicht so richtig erklären
Ja das ist richtig *gins*
Aber mein eigentliches Problem ist das hier:
eigentlich sollte da jetzt bcd stehen...
Ja das ist richtig *gins*
Aber mein eigentliches Problem ist das hier:
Code: Alles auswählen
def turn(seq, i):
end=""
for j in seq:
code=(ord(j)+ord(i))
if code>255:
code-=255
end=end+chr(code)
return end
>>> turn("abc","a")
'\xc2\xc3\xc4'
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
;-)
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Daran solltest Du arbeiten! (Das meine ich ernst!)INFACT hat geschrieben:T'schuldigung ich kann nicht so richtig erklären
Nein! Du verschiebst ja nicht um "1", sondern um 97! Und 97+97 ist eben nicht 98eigentlich sollte da jetzt bcd stehen...Code: Alles auswählen
>>> turn("abc","a") '\xc2\xc3\xc4'
Denk mal drüber nach!
Zeile 5 und 6 machen etwas falsches. Setze Dich mal mit dem Modulo-Operator auseinander. yipyip benutzt den z.B. ja auch in seinem Code.
Ok ich habe es jetzt geschafft:
Hier noch ein beispiel:
Code: Alles auswählen
def rotate(seq, n):
m = n % len(seq)
return seq[m:] + seq[:m]
def turn(seq, i):
end=""
for j in seq:
code=(ord(j)+ord(i))
if code>255:
code-=255
end=end+chr(code)
return end
def ccaesar(seq, i):
ch=""
for j in seq:
end=turn(j, i)
end=rotate(end, ord(i))
ch=ch+str(end)
return ch
def encodepw(pwd):
i=""
for j in pwd:
jep=ord(j)
jep=255-jep
i=i+str(chr(jep))
return i
def codecaesar(seq, i):
"""Codes the text seq with the password i"""
ch=seq
for j in i:
ch=ccaesar(ch,j)
return ch
def encodecaesar(seq, i):
"""Encodes the text seq with the password i"""
i=encodepw(i)
ch=seq
for j in i:
ch=ccaesar(ch,j)
return ch
Code: Alles auswählen
>>> codecaesar("abcd","password")
'\xd7\xd8\xd9\xda'
>>> encodecaesar('\xd7\xd8\xd9\xda',"password")
'abcd'
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
;-)
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Und hier mit einer itertools Lösung:yipyip hat geschrieben:Du suchst wohl einfach nur das hier:Code: Alles auswählen
def rotate(seq, n): m = n % len(seq) return seq[m:] + seq[:m] print rotate('abcd', -1) ls = [rotate('abcdefg', i) for i in range(9)] for i in ls: print i
yipyip
Code: Alles auswählen
from itertools import islice, chain
def shift(iterable, offset=1):
offset = offset % len(iterable)
return chain(islice(iterable, offset, None), islice(iterable, offset))
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
ok, mal einige Kommentare im Quellcode:
Die Variablen sind teilweise wenig aussagekräftig! was ist ein "i"? Damit kann man wenig anfangenINFACT hat geschrieben:Ok ich habe es jetzt geschafft:Code: Alles auswählen
def turn(seq, i): end="" for j in seq: code=(ord(j)+ord(i)) # # das folgende ist immer noch falsch # if code>255: code-=255 end=end+chr(code) return end def encodepw(pwd): i="" for j in pwd: jep=ord(j) # das sieht mir auch falsch aus! jep=255-jep i=i+str(chr(jep)) return i # besser encode_caesar() def codecaesar(seq, i): """Codes the text seq with the password i""" ch=seq for j in i: ch=ccaesar(ch,j) return ch # Du meinst decode_caesar() def encodecaesar(seq, i): """Encodes the text seq with the password i""" i=encodepw(i) ch=seq for j in i: ch=ccaesar(ch,j) return ch
@Hyperion:
Nicht optimiert, aber eine Variante:
yipyip
Nicht optimiert, aber eine Variante:
Code: Alles auswählen
In [159]: rot = lambda s, n: (lambda k: (2 * s)[n%k:n%k+k])(len(s))
In [160]: rot('abcdefg', 1)
Out[160]: 'bcdefga'
In [161]: rot('abcdefg', -1)
Out[161]: 'gabcdef'
yipyip
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Jein - hier im Kontext ging es um das Verschieben von Zeichenketten, wie das Shiften in Assembler z.B..Leonidas hat geschrieben:Ist ``a`` um -1 verschoben nicht ``z``?
Der OP hat ja beides in seiner "Verschlüsselung", also das shiften bezüglich eines Alphabets und das Shiften des Inputs in eine bestimmte Richtung.
Ich verstehe nicht was daran falsch ist, bei mir geht das einwandfrei!Hyperion hat geschrieben:ok, mal einige Kommentare im Quellcode:INFACT hat geschrieben:Code: Alles auswählen
def turn(seq, i): end="" for j in seq: code=(ord(j)+ord(i)) # # das folgende ist immer noch falsch # if code>255: code-=255 end=end+chr(code) return end def encodepw(pwd): i="" for j in pwd: jep=ord(j) # das sieht mir auch falsch aus! jep=255-jep i=i+str(chr(jep)) return i
MfG Robin
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
;-)