Как мне увеличить позицию буквы в списке на позицию буквы?

#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. о боже, спасибо! я пробовал ранее, и я продолжал получать код ошибки, и теперь это работает!