61 lines
2.9 KiB
Python
61 lines
2.9 KiB
Python
''' ****** Задание 10 из 20 *********
|
||
* Частотный анализ — это метод подсчёта, какие символы (или слова) чаще всего встречаются в тексте.
|
||
Это важнейший инструмент взлома многих классических шифров — от шифра Цезаря и до шифровальной машины «Энигма».
|
||
|
||
В этой задаче вы реализуете простейшую версию частотного анализа:
|
||
выясните, какая буква встречается чаще других в тексте.
|
||
|
||
Напишите программу, которая читает строки до тех пор, пока не встретится строка 'ФИНИШ', и выводит наиболее часто встречающуюся букву (в нижнем регистре).
|
||
|
||
Формат ввода
|
||
Вводятся строки, пока не будет введена строка «ФИНИШ».
|
||
|
||
Формат вывода
|
||
Выводится один символ в нижнем регистре — наиболее часто встречающийся во введённой строке.
|
||
|
||
Примечания
|
||
Пробелы в анализе не участвуют.
|
||
Если в результате анализа получено несколько ответов, следует вывести первый по алфавиту.
|
||
|
||
У данной задачи множество "быстрых" способов решения, но в этом параграфе мы просим вас сосредоточиться на использовании строк и списков.
|
||
|
||
|
||
Подсказка
|
||
Организуйте два списка:
|
||
|
||
|
||
letters = [] # для хранения букв
|
||
counts = [] # для хранения количеств
|
||
Организовав цикл по строкам, можете обработать каждую из них следующим образом:
|
||
|
||
|
||
for letter in row:
|
||
letter = letter.lower()
|
||
if (index := letters.index(letter)) != -1: # значит буква уже встречалась
|
||
counts[index] += 1
|
||
else: # буква встретилась в первый раз
|
||
letters.append(letter)
|
||
counts.append(1)
|
||
После формирования данных, остаётся найти максимум в списке counts и вывести букву, которая ему соответствует.
|
||
|
||
Пример 1
|
||
Ввод
|
||
|
||
Баобаб
|
||
Белка
|
||
Бобы
|
||
ФИНИШ
|
||
Вывод
|
||
|
||
б
|
||
'''
|
||
|
||
|
||
if __name__ == "__main__":
|
||
data = []
|
||
while (n := input()) != 'ФИНИШ':
|
||
data.extend(n.lower().split())
|
||
max_count, data = 0, ''.join(data)
|
||
for symbol in set(data):
|
||
max_count = max(max_count, data.count(symbol))
|
||
print(min([i for i in set(data) if data.count(i) == max_count])) |