В моем уроке мне было поручено создать декодер Caesar Cipher, который берет строку ввода и находит наилучшую возможную строку, используя частоты букв. Если не уверен, сколько смысла это сделало, но позвольте задать вопрос:Python Caesar Cipher Decoder
Напишите программу, которая выполняет следующие действия. Во-первых, он должен прочитать одну строку ввода, которая является закодированным сообщением, и будет состоять из заглавных букв и пробелов. Ваша программа должна попробовать декодировать сообщение со всеми 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)
EDIT: внесенные изменения, предложенные Cristian Ciupitu Пожалуйста, проигнорируйте ошибки отступов, они, вероятно, возникли, когда я скопировал код.
Программа работает следующим образом:
- Возьмите вход и разделить его в список
- Для каждого значения списка я кормлю его в благости искателем.
- Он берет доброту струны и сравнивает все остальное, и когда есть более высокая доброта, она делает более высокую ценность для сравнения.
- Затем он сдвигает эту строку текста, я количество, чтобы увидеть, если благость выше или ниже
Я не совсем уверен, где проблема есть, первый тест: LQKP OG CV GKIJV DA VJG BQQ
Печати правильное сообщения: JOIN ME AT AT зоопарк
Однако следующий тест: UIJT JT B TBNQMF MJOF PG UFYU GPS EFDSZQUJOH
дает нежелательную строку: SGHR HR Z RZLOKD KHMD NE SDWS ENQ CDBQXOSHMF
Когда это должно быть: ЭТО ЛИНИЯ ОБРАЗЦОВ ТЕКСТА ДЛЯ ДЕКРИПТИНА G
Я знаю, что я должен:
Попробуйте значение каждой смены
Получить «добро» слова
возвращают строку с наибольшей благостью.
Надеюсь, что мое объяснение имеет смысл, поскольку я в настоящий момент смущен.
Если вы добавите 1 к каждому символу в мусорной строке «SGHR HR Z RZLOKD ...», вы получите «ЭТО ОБРАЗЕЦ ...», так что это почти правильно. –
Вам следует попробовать заменить некоторые магические числа значимыми константами, например. 65 с 'ord ('A')', 26 с 'NUM_LETTERS'. Кстати, в 'GoodnessComparer' у вас есть' range (0, 25) 'вместо' (0, 26) '; это опечатка или нет? И еще: в 'GoodnessFinder' вам не нужно делать' ord (i) 'каждый раз, только когда' i' является пространством ('' ''). –
[input()] (http://docs.python.org/library/functions.html#input) эквивалентно 'eval (raw_input())', что не имеет смысла, поэтому замените его на простой ' вызов raw_input() '. –