Python Цезарь, как расшифровать конкретное c предложение? - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь расшифровать зашифрованное сообщение 'lmnopqrstuvwxyzabcdefghijk'. Я понял, что он сдвинут на 11, и я должен расшифровать 'I wtvp olel decfnefcpd lyo lwrzctesxd'.

Вот что я написал до сих пор:

#enciphered message = 'I wtvp olel decfnefcpd lyo lwrzctenter code hereesxd'

plain = 'abcdefghijklmnopqrstuvwxyz'
#plain Index= 0123456789........25 

cipher = 'lmnopqrstuvwxxyzabcdefghijk'
#11 12 13 14 15 16 17 18 19 20 21 22 23 24 25...12345678910

cipher_text = input('Enter enciphered message: ')
clean_text ='I '
for i in cipher_text:
    if cipher_text.index(i) != " ":
        clean_text = clean_text + plain.index(cipher[(ord(i)-ord('a'))])
    else:
        clean_text = clean_text + " "

print(clean_text)

Когда я его запустил:

Enter enciphered message: I wtvp olel decfnefcpd lyo lwrzctesxd
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-97-ac338a9d79fc> in <module>
     18 for i in cipher_text:
     19     if cipher_text.index(i) != " ":
---> 20         clean_text = clean_text + plain.index(cipher[(ord(i)-ord('a'))])
     21         #chr((cipher.index(cipher_text[i]))+ ord('a')) - 11)
     22     else:

TypeError: can only concatenate str (not "int") to str

Я очень новичок в Python и не знаю, как его решить.

добавить комментарий: зашифрованное сообщение, которое я хочу декодировать, имеет заглавную букву "I", а также пробел между словами, поэтому Я хочу знать, как декодировать прописные и строчные буквы одновременно

1 Ответ

1 голос
/ 03 апреля 2020

list.index() возвращает индекс первого вхождения этого элемента в список . Таким образом, выражение plain.index(cipher[(ord(i)-ord('a'))]) является целым числом, которое Python не позволит добавить в строку.

Что вам, вероятно, нужно для clean_text, это элемент в plain, который имеет этот индекс . Поэтому можно использовать стандартную запись list[index], чтобы получить элемент: plain[plain.index(...)]

Эта строка теперь будет выглядеть следующим образом:

clean_text = clean_text + plain[plain.index(cipher[(ord(i)-ord('a'))])]
>>> print(clean_text)
I wxxyzabcdefghhijlmnopqrstuv

Другие изменения / улучшения:

  1. Для строки if cipher_text.index(i) != " ": выражение никогда не будет истинным, поскольку list.index() возвращает целое число или значение ValueError, если не найдено, которое никогда не будет совпадать с пробелом " ". У вас также есть символ, который вы проверяете, в переменной l oop i. Так что это может быть:

    if i != " ":
    
  2. Возможные опечатки в cipher и cipher_text, буква x появляется дважды.

  3. Напишите ваш комментарий:

    В нем также есть заглавная буква "I" и пробел между словами. : (

    Это от строки clean_text ='I ' непосредственно перед l oop. Измените это на clean_text =''.

  4. Don ' • объединять строки с x = x + 'something new'. Продолжайте добавлять каждый элемент в список, а затем используйте str.join():

    # before the loop:
    clean_text = []  # empty list
    # inside the loop:
    clean_text.append(plain[plain.index(cipher[(ord(i)-ord('a'))])])
    # later, after the loop, put:
    ''.join(clean_text)
    
...