Шифровальщик · Шаг 3 из 4
Подобрать сдвиг
Команда перехватила записку, зашифрованную Цезарем: все буквы сдвинуты на одно и то же число. Сдвигов всего 33 — можно перебрать все и посмотреть, при каком текст больше всего похож на русский. А похожесть можно посчитать: у частых букв языка большой вес, у редких маленький.
Что сделать
Найдите, на сколько сдвинули буквы шифровки: переберите все сдвиги и выберите тот, при котором расшифровка набирает больше всего очков.
Что приходит
shifrovka— текст, где все русские буквы сдвинуты вперёд на одно числоchastoty_yazyka— словарь «буква → вес»: насколько буква частая в языке; каких букв нет — у тех вес 0
Что вернуть
Сдвиг от 0 до 32, при котором очков больше всего; при равенстве — меньший.
Допишите функцию podobrat_sdvig в редакторе справа.
Результат верните через return — то, что
напечатано, на проверку не влияет.
В проекте
Утилита передаёт podobrat_sdvig в шаг 4: каждый столбец шифровки Виженера — это Цезарь, и его сдвиг ищет ваша функция. Решите шаг — и утилита начнёт взламывать.
Шифровка «кхйхихч х цхшщжисл» — это «договор о поставке», сдвинутый на 7. Сдвиг 7 возвращает буквы на место, и «о», «а», «е», «т» набирают очки по таблице; у любого другого сдвига очков меньше — ответ 7.
chastoty = {"о": 11, "е": 8, "а": 8, "и": 7, "н": 7, "т": 6}
podobrat_sdvig("кхйхихч х цхшщжисл", chastoty)
7
Алфавит — 33 буквы абвгдеёжзийклмнопрстуфхцчшщъыьэюя, номера с нуля. Шифровка получена так: каждая русская буква сдвинута вперёд на одно и то же число (за «я» идёт «а»). Регистр не важен; всё, что не русская буква, не считается.
Для каждого сдвига s от 0 до 32 посчитайте очки: сдвиньте каждую букву шифровки на s назад и сложите веса получившихся букв из chastoty_yazyka (буквы, которой в словаре нет, — вес 0).
Верните сдвиг с наибольшими очками. Если таких несколько — меньший из них; если букв в шифровке нет вовсе, у всех сдвигов по нулю очков, и ответ — 0.
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.