Übung: Decodieren eines Buchstabens mit einer Cäsar-Chiffre durch Umschließen des englischen Alphabets

Abgeschlossen

Um den tatsächlichen Buchstabencode herauszufinden, der mit dem decodierten Buchstaben übereinstimmt, müssen Sie das Alphabet in einer Schleife durchlaufen. Wenn Ihr Ergebnis aus letter_code + shift_amount größer oder gleich 123 ist, müssen Sie für das Weiterzählen zu 97 zurückspringen.

Warum gerade 123? Ganz einfach: 97 (Buchstabencode für das Zeichen „a“) plus 26 (Anzahl der Buchstaben im Alphabet). Der ASCII-Code für „z“ entspricht hierbei 122.

Sie könnten bedingte Anweisungen schreiben, um diesen Wert zu überprüfen, es gibt aber einen einfacheren Weg.

Operator Mod

Für eine einfache Schleife durch das Alphabet benötigen Sie den speziellen Operator mod, der durch das Prozentzeichen (%) dargestellt wird.

Der Operator mod dividiert zwei Zahlen und gibt den Rest zurück. Führen Sie den folgenden Code in Python aus, um drei Variablen mit mod festzulegen:

three_two = 3 % 2
eleven_four = 11 % 4 
five_ten = 5 % 10

print(three_two)
print(eleven_four)
print(five_ten)

Es wird folgendes Ergebnis ausgegeben:

Variable Formel Wert           
three_two 3 / 2 = 1, Rest 1 1
eleven_four 11 / 4 = 2, Rest 3 3
five_ten 5 / 10 = 0, Rest 5 5

Berechnen eines decodierten Zeichens: Der richtige Weg

Mit dem Operator mod benötigen Sie zwei neue Variablen:

  • a_ascii: enthält den ASCII-Codewert für den Buchstaben „a“. Sie erhalten diesen Wert, indem Sie die ord('a')-Funktion aufrufen und den Buchstaben übergeben.
  • alphabet_size: enthält die Anzahl der Buchstaben im Alphabet (26).

Mit dieser Formel können Sie den Wert von true_letter_code ermitteln:

a_ascii + (((letter_code - a_ascii) + shift_amount) % alphabet_size)

Sie können diese Formel anhand einiger Beispiele überprüfen.

Beispiel 1: Buchstabe „a“ und Verschiebung um 2

Beginnen Sie mit diesen beiden Werten:

  • letter = „a“
  • shift_amount = 2
Variable Formel Wert      
letter 'a'
shift_amount 2
letter_code ord('a') 97
a_ascii ord('a') 97
alphabet_size 26
true_letter_code 97 + (((97 - 97) + 2) % 26) 2
Hinweis: Eine ausführliche Erläuterung dieser Berechnung finden Sie unter der Tabelle.
decoded_letter chr(99) c

Sie können die Formel für true_letter_code wie jede andere mathematische Formel überprüfen. Halten Sie die Operatorrangfolge ein, nach der Sie einen mathematischen Ausdruck in der Reihenfolge Klammern > Exponenten > Multiplikation/Division > Addition/Subtraktion auswerten.

a_ascii + (((letter_code - a_ascii) + shift_amount) % alphabet_size)

97 + (((97 - 97) + 2) % 26)
97 + ((0 + 2) % 26)
97 + (2 % 26)
97 + 2
99

Beispiel 2: Buchstabe „N“ und Verschiebung um 13

Beginnen Sie mit diesen beiden Werten:

  • letter = „N“
  • shift_amount = 13
Variable Formel Wert      
letter „N“
shift_amount 13
letter_code ord('n') 110
a_ascii ord('a') 97
alphabet_size 26
true_letter_code 97 + (((110 - 97) + 13) % 26) 97
Hinweis: Eine ausführliche Erläuterung dieser Berechnung finden Sie unter der Tabelle.
decoded_letter chr(97) a

Sie können die Formel für true_letter_code wie jede andere mathematische Formel überprüfen (achten Sie auf die Operatorrangfolge):

a_ascii + (((letter_code - a_ascii) + shift_amount) % alphabet_size)

97 + (((110 - 97) + 13) % 26)
97 + ((13 + 13) % 26)
97 + (26 % 26)
97 + 0
97

Endgültiger Code

Sie verfügen damit über eine Decoderformel und können alles in Ihrer Funktion zusammenfassen.

Tipp

Ergänzen Sie Ihren Code unbedingt um nützliche Kommentare, damit Sie sich merken können, was passiert!

# Define a function to find the truth by shifting the letter by the specified amount
def lasso_letter( letter, shift_amount ):
    # Invoke the ord function to translate the letter to its ASCII code 
    # Save the code to the letter_code variable
    letter_code = ord(letter.lower())
    
    # The ASCII number representation of lowercase letter 'a'
    a_ascii = ord('a')

    # The number of letters in the alphabet
    alphabet_size = 26

    # The formula to calculate the ASCII number for the decoded letter
    # Take into account looping around the alphabet
    true_letter_code = a_ascii + (((letter_code - a_ascii) + shift_amount) % alphabet_size)

    # Convert the ASCII number to the character or letter
    decoded_letter = chr(true_letter_code)

    # Send the decoded letter back
    return decoded_letter

Sie können Ihre lasso_letter()-Funktion nun für jeden Buchstaben in der geheimen Nachricht aufrufen.

Sie verwenden diese Funktion in der nächsten Lerneinheit, aber Sie können diesen Schritt jetzt schon ausprobieren, indem Sie die lasso_letter()-Funktion wie folgt innerhalb einer print()-Funktion aufrufen:

print(lasso_letter('a', 2))

Welche Ausgabe wird im Terminal angezeigt?