Выяснить разницу между буквами python

было дано задание, и оно почти завершено. Просто борюсь с последним битом. Программе дается текст шифра Цезаря, затем она определяет, какая буква является наиболее частой, и печатает ее обратно на терминал. (Там, где я работаю.) Затем он предложит смещение клавиш на основе наиболее часто встречающейся буквы, и затем пользователь может вручную ввести это смещение клавиш или свое собственное смещение клавиш, и текст будет расшифрован.

Мне нужно, чтобы программа взяла наиболее часто встречающуюся букву в тексте Цезаря и сравнила ее с буквой «Е», которая является наиболее часто встречающейся буквой в английском языке, а затем вычислила, на сколько клавиш она уходит...

например если самая распространенная буква цезаря в тексте — n, то n-e = 9.

Код пока:

    import sys 

def decrypt(plain, key):
"returns a Caesar cipher text given plain text and a key"
   cipher = ""
for index in range(len(plain)):
 if plain[index].isalpha():    
   if plain[index].islower():
    cipher = cipher + chr((ord(plain[index]) -101- key+26) % 26+ 101)
   else:
    cipher = cipher + chr((ord(plain[index]) -65- key+26) % 26+ 65)
 else:
   cipher = cipher + plain[index]


  return cipher            #do nothing here 

  #main program 

key = int(sys.argv[4])
action = sys.argv[2]

try:
   in_file = open(sys.argv[1], "r")
except:
sys.exit("There was an error opening the file: {}".format(sys.argv[1]))

 try:
  out_file = open(sys.argv[3], "w")

except:
sys.exit("There was an error opening the file: {}".format(sys.argv[3]))

line = in_file.readline()

freq_dict = { }#letter : 0 for letter in LETTERS }



while len(line) != 0:
for letter in line.replace(" ",""):
    if letter in freq_dict:
        freq_dict[letter] += 1
    else:
        freq_dict[letter] = 1 
line = in_file.readline()


cipher = decrypt(line, key)
out_file.write(cipher)



in_file.close()
out_file.close()

for letter in freq_dict:
print(letter, "times", freq_dict[letter])

Заранее спасибо.


person helpme123    schedule 24.11.2016    source источник
comment
Что вы используете для базовой (нулевого сдвига) ссылки? Строка, список, словарь всех букв? string.ascii_letters может быть удобным — тогда вы можете использовать str.find.   -  person wwii    schedule 24.11.2016
comment
Привет, спасибо за ваш ответ. Я собираюсь использовать E в качестве базовой ссылки, а затем я хотел бы выяснить, сколько букв сдвигается наиболее часто встречающаяся буква текста цезаря. Спасибо еще раз   -  person helpme123    schedule 24.11.2016
comment
Вы решаете эту проблему из курса edx от MIT?   -  person sid597    schedule 24.11.2016
comment
Привет, я не знаю, что это такое, Джон, так что нет. Благодарность   -  person helpme123    schedule 24.11.2016


Ответы (1)


Таким образом, кажется, что ваша функция decrypt по существу генерирует вывод, который представляет собой входную текстовую строку, сдвинутую клавишей прямо сейчас.

Насколько я понимаю, вам нужно найти наиболее часто встречающуюся букву в этой строке.

Для этого вы можете использовать модуль collections.

import collections
most_freq = collections.Counter(cipher).most_common(1)[0]

Теперь все, что вам осталось, это найти сдвиг между буквой most_freq и буквой e.

Возможно, самый простой способ — просто перечислить алфавит в списке, а затем найти различия в индексах между ними.

alphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']

shift = alphabet.index(most_freq) - alphabet.index('e')

Помните, что этот сдвиг переводит вас с e на букву most_freq, поэтому, когда вы применяете сдвиг к своему тексту, вам нужно применить противоположное ( -1 * shift ), чтобы получить правильный результат.

Надеюсь это поможет.

person Qichao Zhao    schedule 25.11.2016