На моем уроке мне поручили создать декодер шифра Цезаря, который принимает входную строку и находит наилучшую возможную строку, используя частоты букв. Если вы не уверены, насколько это разумно, но позвольте задать вопрос:
Напишите программу, которая делает следующее. Во-первых, он должен прочитать одну строку ввода, которая является закодированным сообщением и будет состоять из заглавных букв и пробелов. Ваша программа должна попытаться декодировать сообщение со всеми 26 возможными значениями сдвига S; из этих 26 возможных исходных сообщений напечатайте то, которое имеет наивысшее качество. Для вашего удобства мы предварительно определим для вас переменную letterGoodness, список длиной 26, который равен значениям в приведенной выше таблице частот
. Пока у меня есть этот код:
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)
РЕДАКТИРОВАТЬ: внесены изменения, предложенные Кристианом Чиупиту. Пожалуйста, не обращайте внимания на ошибки отступов, они, вероятно, возникли, когда я скопировал свой код.
Программа работает следующим образом:
Я не совсем уверен, в чем проблема, первый тест: 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
Когда это должно быть: ЭТО ПРИМЕРНАЯ СТРОКА ТЕКСТА ДЛЯ РАСШИФРОВКИ
Я знаю, что должен:
Попробуйте каждое значение сдвига
Получите «доброту» слова
Верните строку с наивысшим качеством.
Я надеюсь, что мое объяснение имело смысл, так как в данный момент я совершенно сбит с толку.