Вы можете использовать оператор по модулю ('%'), чтобы получить остаток после деления, т. Е. 10%3
будет равно 1. Вы можете использовать это, чтобы сделать ваши значения "развернутыми" в указанной точке c.
Я переместил ваши вычисления в два отдельных утверждения, чтобы прояснить, что происходит - сначала мы находим значение для фактического символа (a => 0, b => 1, c => 2, et c) путем вычитания 97 из значения char. Затем мы добавляем ключ и проверяем, что он оборачивается на 26 (поскольку в алфавите engli sh только 26 строчных букв). Затем мы снова добавляем 97, чтобы снова получить правильное значение ascii для этой буквы.
'z' сначала будет 122, вычитание 97 дает нам 25, добавление 1 дает нам 26. Используя оператор по модулю, это говорит нам остальное было бы 0 - фактически снова обернулось бы до a
. Мы возвращаем символ, добавляя 97 к 0 - получая 97 - что является значением ascii a
.
Чтобы вернуть полную строку, мы добавляем каждый символ к результату, используя +=
. Таким образом, мы можем добавить каждую букву к предыдущей последовательности букв перед их возвратом.
def encrypt(message, key):
message = message.lower().replace(" ", "")
print("lower case message: " + message)
result = ""
for i in message:
offset_from_a = (ord(i) - 97) + key
chr_value = 97 + (offset_from_a % 26)
result += chr(chr_value)
return result
encrypt('abc', 1) => 'bcd'
encrypt('zbc', 1) => 'acd'