Übung: Decodieren eines Buchstabens mit einer Cäsar-Chiffre durch Umschließen des englischen Alphabets
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 dieord('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?