J. Частотный анализ на минималках

Частотный анализ — подсчёт, какие символы чаще всего встречаются в тексте. Это важнейший инструмент взлома многих классических шифров — от шифра Цезаря и до шифровальной машины «Энигма». Выполним простой частотный анализ: выясним, какой символ встречается в тексте чаще всего.

Формат ввода

Вводятся строки, пока не будет введена строка «ФИНИШ».

Формат вывода:

Выводится один символ в нижнем регистре — наиболее часто встречающийся.

Примечания

Пробелы в анализе не участвуют.
Если в результате анализа получено несколько ответов, следует вывести первый по алфавиту.

Пример

Ввод

Баобаб
Белка
Бобы
ФИНИШ

Вывод

б

Ввод

Финики Фокачча Зайка
Филин Фосфор Светофор
Фехтовальщик Форма
ФИНИШ

Вывод

ф

Решение

Задача вызывает достаточно много затруднений.

Чаще всего, это связано с тем, что по логике курса, первое что приходит на ум – перебрать все буквы и посчитать сколько раз каждая из них встречается. Потом найти ту, которая встречается чаще всех. Это приводит к мысли создать один список из элементов [буква, счетчик] или два списка, где на соответствующих позициях будут находиться буквы и счетчики по отдельности. Все это сильно усложняет код и часто приводит к тому, что его сложность начинает превосходить возможности писателя.
Пример реализации подобного кода с двумя списками, будет приведен самым последним.

На самом деле дела обстоят сильно проще. Нас просят найти наиболее часто встречающийся символ, исключая пробелы. А это значит, что нам в любой момент времени нужно хранить только один единственный “символ-победитель” и количество его появлений.

Таким образом код сильно упрощается:
Получаем строки до тех пор, пока не встретим слово ФИНИШ. Полученные строки дописываем в одну большую строку, которую мы будем дальше анализировать.
Полученную строку приводим к нижнему регистру, и удаляем из нее пробелы. Это можно делать в том числе и на этапе ввода.
Пробегаемся по полученной строке и с помощью метода count() считаем сколько раз встречается этот символ. Если у нас есть новый победитель, то просто запоминаем его и его “частоту”. Если “частота” совпала, то сравниваем победителя и претендента. Если претендент расположен раньше по алфавиту, то меняем победителя.
Выводим победителя.

Этот код можно улучшить, если ввести дополнительную строку, куда мы будем добавлять символы, для которых мы уже посчитали частоту.

Посмотреть код

Решение

Python
# простой код

text = ''

while (string := input()) != 'ФИНИШ':
    text += string.lower()

text = text.replace(' ', '')

maximum = 0
most_frequent_char = ''

for char in text:
    count = text.count(char)
    if count > maximum:
        maximum = count
        most_frequent_char = char
    elif count == maximum:
        if char < most_frequent_char:
            most_frequent_char = char

print(most_frequent_char.lower())

Решение

Python
# оптимизированный код. 

text = ''

while (string := input()) != 'ФИНИШ':
    text += string.lower()

text = text.replace(' ', '')
seen = ''

maximum = 0
most_frequent_char = ''

for char in text:
    if char not in seen:
        seen += char
        count = text.count(char)
        if count > maximum:
            maximum = count
            most_frequent_char = char
        elif count == maximum:
            if char < most_frequent_char:
                most_frequent_char = char

print(most_frequent_char.lower())

Решение

Python
# код со списками. 

chars = []
count = []

while (string := input()) != 'ФИНИШ':
    string = string.lower().replace(' ', '')
    for char in string:
        if char in chars:
            count[chars.index(char)] += 1
        else:
            chars.append(char)
            count.append(1)

max = 0
frequencies = []

for pos in range(len(chars)):
    if count[pos] > max:
        max = count[pos]
        frequencies = [chars[pos]]
    elif count[pos] == max:
        frequencies.append(chars[pos])

frequencies.sort()
if len(frequencies) != 0:
    print(frequencies[0])
Подписаться
Уведомить о
guest
2 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии