Декодер шифра Цезаря Python

На моем уроке мне поручили создать декодер шифра Цезаря, который принимает входную строку и находит наилучшую возможную строку, используя частоты букв. Если вы не уверены, насколько это разумно, но позвольте задать вопрос:

Напишите программу, которая делает следующее. Во-первых, он должен прочитать одну строку ввода, которая является закодированным сообщением и будет состоять из заглавных букв и пробелов. Ваша программа должна попытаться декодировать сообщение со всеми 26 возможными значениями сдвига S; из этих 26 возможных исходных сообщений напечатайте то, которое имеет наивысшее качество. Для вашего удобства мы предварительно определим для вас переменную letterGoodness, список длиной 26, который равен значениям в приведенной выше таблице частот

Letter Frequencies

. Пока у меня есть этот код:

x = input()
NUM_LETTERS = 26 #Can't import modules I'm using a web based grader/compiler
def SpyCoder(S, N):
    y = ""
    for i in S:
        x = ord(i)
        x += N
        if x > ord('Z'):
            x -= NUM_LETTERS
        elif x < ord('A'):
            x += NUM_LETTERS
        y += chr(x)
    return y  

def GoodnessFinder(S):
    y = 0
    for i in S:
        if x != 32:
            x = ord(i)
            x -= ord('A')
            y += letterGoodness[x]
    return y 

def GoodnessComparer(S):
    goodnesstocompare = GoodnessFinder(S)
    goodness = 0
    v = ''
    for i in range(0, 26):
        v = SpyCoder(S, i)
        goodness = GoodnessFinder(v)
        if goodness > goodnesstocompare:
            goodnesstocompare = goodness
    return v

y = x.split()
z = ''
for i in range(0, len(y)):
    if i == len(y) - 1:
        z += GoodnessComparer(y[i])
print(z)

РЕДАКТИРОВАТЬ: внесены изменения, предложенные Кристианом Чиупиту. Пожалуйста, не обращайте внимания на ошибки отступов, они, вероятно, возникли, когда я скопировал свой код.

Программа работает следующим образом:

  • Беру входные данные и разбиваю их на список.
  • Для каждого значения списка я передаю его поисковику качества.
  • Он берет качество струны и сравнивает все остальное с ним, и когда есть более высокое качество, оно делает более высокое качество для сравнения.
  • Затем эта строка текста сдвигается на i, чтобы увидеть, выше или ниже качество

Я не совсем уверен, в чем проблема, первый тест: LQKP OG CV GKIJV DA VJG BQQ
Печатает правильное сообщение: ПРИСОЕДИНЯЙТЕСЬ КО МНЕ В В ЗООПАРКЕ

Однако следующий тест: UIJT JT B TBNQMF MJOF PG UFYU GPS EFDSZQUJOH
Выдает ненужную строку: SGHR HR Z RZLOKD KHMD NE SDWS ENQ CDBQXOSHMF
Когда это должно быть: ЭТО ПРИМЕРНАЯ СТРОКА ТЕКСТА ДЛЯ РАСШИФРОВКИ

Я знаю, что должен:
Попробуйте каждое значение сдвига
Получите «доброту» слова
Верните строку с наивысшим качеством.

Я надеюсь, что мое объяснение имело смысл, так как в данный момент я совершенно сбит с толку.

5
задан Bart 17 November 2012 в 22:38
поделиться