#python #encryption #caesar-cipher
#python #шифрование #caesar-cipher
Вопрос:
У меня есть программа, которая принимает позицию буквы и увеличивает позицию на величину сдвига, а затем выдает мне новую позицию букв, это функция списка цезаря. Однако мне нужно иметь возможность увеличивать позицию буквы на значение shift, а также на позицию буквы, поэтому, если у меня есть «привет», а сдвиг равен 15, h = 7, так что 7 15 0 = 22 и e будет 4 15 1 (позиция e) = 20 Однако я не уверен, как отредактировать мой код, чтобы я мог увеличить позицию каждой буквы на значение их позиции. Код работает нормально, мне просто нужна помощь в определении этого шага.
alphabet =['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
def caesar(plaintext,shift):
# initialize ciphertext as blank string
ciphertext = ""
# loop through the length of the plaintext
for i in range(len(plaintext)):
# get the ith letter from the plaintext
letter = plaintext[i]
# find the number position of the ith letter
num_in_alphabet = alphabet.index(letter)
print (num_in_alphabet)
# find the number position of the cipher by adding the shift
cipher_num = (num_in_alphabet shift 3) % len(alphabet)
# find the cipher letter for the cipher number you computed
cipher_letter = alphabet[cipher_num]
# add the cipher letter to the ciphertext
ciphertext = ciphertext cipher_letter
# return the computed ciphertext
return ciphertext
def main():
plaintext = ("hello")
shift = 16
text = caesar(plaintext,shift)
print (text)
main()
Комментарии:
1. На каждой итерации добавляйте
i
к своей букве2. я пытался добавлять i после каждой итерации, но я продолжаю получать сообщение об ошибке. Говорит, что i не является значением int.
3. Вы можете создать локальную переменную
pos=0
, добавлять ее и увеличивать в каждом цикле.
Ответ №1:
cipher_num = (num_in_alphabet shift i) % len(alphabet)
Или намного проще
shift = 16
chiper = ''.join([chr(((ord(c)-ord('a') shift i)%26) ord('a')) for i, c in enumerate("hellow")])
assert chiper == 'xvdeir'
Комментарии:
1. Я пытался использовать это, однако это возвращает мне неверный вывод. Например: если моя клавиша shift равна 16, то мой вывод для «hello» должен быть: «xvdei». однако попытка этого дала мне: aghl
2. это потому, что вы добавляете,
3
т.е. это должно быть(num_in_alphabet shift i)
не(num_in_alphabet shift 3 i)
3. о боже, спасибо! я пробовал ранее, и я продолжал получать код ошибки, и теперь это работает!