Расшифровщик Python. Ошибка индекса: индекс строки вне диапазона

#python-3.x #encryption #index-error

#python-3.x #шифрование #ошибка индекса

Вопрос:

Я изучал python в школе, и я решил выполнить задачу по созданию дешифратора, но вместо ввода суммы, в которой изменяется сообщение, он будет выполнять каждое из них, искать общие слова и выбирать наиболее вероятное дешифрование. Если это не то, что вам нужно, тогда они могут просмотреть каждый. Однако у меня возникла проблема с получением кода для его расшифровки с каждой суммой. Это ошибка, возвращаемая после нечетного возврата из части кода: IndexError: строковый индекс вне диапазона. Я не могу понять, почему он не работает. Это единственный язык программирования, который я знаю, поэтому это может быть очевидно, и я просто не понял. Я не смог найти ответ в Интернете, поэтому, если кто-нибудь найдет решение, я был бы очень благодарен. Заранее спасибо.

 import sys
import time
from time import sleep as s
import random
import collections

LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ'
LETTERS = LETTERS.lower()

global c1, message

c1=int(0)

message = input("Enter the thing you want to decrypt. ")

def decrypt():
    global c1, LETTERS, message
    decrypted = ''
    for counter in range(1,27):
        for chars in message:
            if chars in LETTERS:
                c1 = int(c1 counter)
                num = LETTERS.find(chars)
                num -= c1
                decrypted  =  LETTERS[num]
                s(1)

        print(decrypted)

decrypt()

  

Полная ошибка:

 Enter the thing you want to decrypt. ij
hh
hhed
hhedzx
hhedzxsp
hhedzxspjf
hhedzxspjfyt
hhedzxspjfytlf
Traceback (most recent call last):
  File "C:UsersTomHuDocumentsDocumentsTomSchoolHomeworkYear 8ComputingPythonEncrypter.py", line 30, in <module>
    decrypt()
  File "C:UsersTomHuDocumentsDocumentsTomSchoolHomeworkYear 8ComputingPythonEncrypter.py", line 25, in decrypt
    decrypted  =  LETTERS[num]
IndexError: string index out of range
  

Ответ №1:

В вашем примере длина букв равна 52.
Индексы, которые вы можете использовать с БУКВАМИ (num), должны быть в диапазоне от -52 до 51. Однако в вашем примере число равно -56 перед ошибкой.
Вы можете увидеть это, добавив print(num) перед decrypted = LETTERS[num] .
если вы хотите избежать этой проблемы, вы можете сделать по модулю len (БУКВЫ):

 import sys
import time
from time import sleep as s
import random
import collections

LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ'
LETTERS = LETTERS.lower()
length=len(LETTERS)

global c1, message

c1=int(0)

message = input("Enter the thing you want to decrypt. ")

def decrypt():
    global c1, LETTERS, message
    decrypted = ''
    for counter in range(1,27):
        for chars in message:
            if chars in LETTERS:
                c1 = int(c1 counter)
                num = LETTERS.find(chars)
                num -= c1
                num=num%length
                decrypted  =  LETTERS[num]
                s(1)

        print(decrypted)

decrypt()  
  

С помощью этой модификации вы обязательно будете постоянно указывать действительный индекс. После этого вы можете изменить свой алгоритм, чтобы получить ожидаемый результат.

Комментарии:

1. почему вы используете lower. и не дает непосредственно хорошую строку. экспериментирование?

2. Спасибо! Вы имеете в виду просто вставить его в нижний регистр? Назовите это экспериментированием, а не бесполезностью.