2 Stimmen

Caesars Chiffre mit Python, könnte ein wenig Hilfe gebrauchen

Ich versuche, eine "Caesar's Cipher" mit Python zu erstellen. Kann mir jemand sagen, wie das aussieht? Gehe ich in die richtige Richtung? Was fehlt mir noch? Wenn ich das Programm ausführe, um zum Beispiel (josh is cool) zu sagen, bekomme ich die Chiffre nicht in der gleichen Zeile. Es sieht so aus, wenn ich das tue main(3)

m
r
v
k
l
v
f
r
r
o

Allerdings wird jeder Buchstabe in eine neue Zeile gesetzt. Wie kann ich es so machen, dass es in einer Zeile steht?

def main(k):

    if k<0 or k>231:
        print "complaint"
        raise SystemExit

    Input = raw_input("Please enter Plaintext to Cipher")

    for x in range(len(Input)):
        letter=Input[x]
        if letter.islower():
            x=ord(letter)
            x=x+k
            if x>122:
                x=x-122+97
            print chr(x),
        if letter.isupper():
            x=ord(letter)
            x=x+k
            if x>90:
                x=x-90+65
            print chr(x),

6voto

Neil Vass Punkte 4901

Ich mag die Antwort von kaizer.se, aber ich denke, ich kann es vereinfachen, indem ich die string.maketrans Funktion:

import string

first = raw_input("Please enter Plaintext to Cipher: ")
k = int(raw_input("Please enter the shift: "))

shifted_lowercase = ascii_lowercase[k:] + ascii_lowercase[:k]

translation_table = maketrans(ascii_lowercase, shifted_lowercase)

print first.translate(translation_table)

2voto

Jeff B Punkte 29573

Dieser Code sollte ziemlich gut funktionieren. Er verarbeitet auch beliebige Offsets, einschließlich negativer.

phrase = raw_input("Please enter plaintext to Cipher: ")
shift = int(raw_input("Please enter shift: "))

result = ''
for char in phrase:
    x = ord(char)

    if char.isalpha():
        x = x + shift

        offset = 65
        if char.islower():
            offset = 97

        while x < offset:
            x += 26

        while x > offset+25:
            x -= 26

        result += chr(x)

print result

Die andere Möglichkeit, mit einer etwas anderen Chiffre, besteht darin, einfach durch alle Zeichen, ob groß oder klein, oder sogar durch alle ASCII-Zeichen > 0x20 zu rotieren.

phrase = raw_input("Please enter plaintext to Cipher: ")
shift = int(raw_input("Please enter shift: "))

result = ''
for char in phrase:
    x = ord(char)

    x = x + shift

    while x < 32:
        x += 96

    while x > 127:
        x -= 96

    result += chr(x)

print result

1voto

Mark Ransom Punkte 283960

Setzen Sie nach jeder Druckanweisung ein Komma; dadurch wird immer noch ein Leerzeichen zwischen die Zeichen gesetzt, aber sie stehen alle in derselben Zeile. Wenn Sie sie ohne die Leerzeichen ausgeben möchten, fügen Sie sie alle zu einer einzigen Zeichenkette zusammen und geben diese am Ende aus.

1voto

u0b34a0f6ae Punkte 45029

Hier ist eine andere Methode, um zu zeigen, wie wir dies auf eine sehr saubere Weise handhaben können. Wir definieren ein Eingabealphabet und ein Ausgabealphabet, dann eine Übersetzungstabelle und verwenden unicode.translate() um die eigentliche Verschlüsselung durchzuführen.

import string
# Blatantly steal Lennart's UI design
first = unicode(raw_input("Please enter Plaintext to Cipher: "), "UTF-8")
k = int(raw_input("Please enter the shift: "))

in_alphabet = unicode(string.ascii_lowercase)
out_alphabet = in_alphabet[k:] + in_alphabet[:k]

translation_table = dict((ord(ic), oc) for ic, oc in zip(in_alphabet, out_alphabet))

print first.translate(translation_table)

Sie kann bei Bedarf auf Großbuchstaben erweitert werden.

0voto

Lennart Regebro Punkte 157632

Abgesehen von den Syntaxfehlern scheint Ihr Code zu funktionieren.

Ich habe mir jedoch die Freiheit genommen, alle Duplikate zu entfernen und sie zu bereinigen:

first = raw_input("Please enter Plaintext to Cipher: ")
k = int(raw_input("Please enter the shift: "))

result = ''
for second in first:
    x=ord(second)
    x=x+k
    if x>90 and x<122:
        x=x-26
    elif x>122:
        x=x-26
    result += chr(x)

print first    
print result

Auch "first" und "second" sind wirklich schlechte Namen für diese Variablen. "Eingabe" und "Buchstabe" sind wahrscheinlich besser.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X