С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/240: Рейтинг темы: голосов - 240, средняя оценка - 4.50
-16 / 3 / 0
Регистрация: 15.12.2018
Сообщений: 82

Маленький частотный анализ 1

06.01.2019, 16:20. Показов 45616. Ответов 14
Метки нет (Все метки)

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

Формат ввода
Вводится одна строка.

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

Пример
Ввод
Баобаб
Вывод
б
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.01.2019, 16:20
Ответы с готовыми решениями:

Частотный анализ
Есть файл text.txt, который содержит текст. Напишите программу, которая выполняет частотный анализ, определяя долю каждой буквы английского...

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

Задача: Частотный анализ
Доброго времени суток. Мне нужно сделать задание, в питоне почти 0. Год назад еще что-то умел, сейчас вообще не соображаю. Находил уже...

14
 Аватар для deathly_hallows
10 / 9 / 2
Регистрация: 23.04.2014
Сообщений: 83
06.01.2019, 19:09
Конечно, не совсем корректно. Но все же
Python
1
2
3
4
5
from collections import Counter
s = input('something:  ')
 
for c, n in Counter(s).most_common(1):
    print(c)
1
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
06.01.2019, 19:33
deathly_hallows, Ваше решение не учитывает наличие прописных букв

something: Баобаб
а
0
 Аватар для deathly_hallows
10 / 9 / 2
Регистрация: 23.04.2014
Сообщений: 83
06.01.2019, 19:52
Viktorrus, Небольшой косяк Надо было, по-хорошему, еще и замутить проверку, если вдруг там есть одинаковое количество букв. Но... лень

Добавлено через 3 минуты
Подправленный вариант. Спасибо Viktorrus.
Python
1
2
3
4
5
from collections import Counter
s = input('something:  ').lower()
 
for c, n in Counter(s).most_common(1):
    print(c)
1
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
07.01.2019, 04:27
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from collections import Counter
s = input('Введите строку: ').lower()
L = Counter(s).most_common()
maxNminS = ['я', 0]
for i in range(len(L)):
    if L[i][1] > maxNminS[1]:
        maxNminS = L[i]
    elif L[i][1] == maxNminS[1]:
        if ord(L[i][0]) < ord(maxNminS[0]):
            maxNminS = L[i]
if ord(maxNminS[0]) == 32:
    print('символ пробела')
else:
    print(maxNminS[0])
пример 1:
Введите строку: Баобаб
б

пример 2:
Введите строку: Баобаб абракадабра
а

пример 3:
Введите строку: Б а л а б о л
символ пробела

пример 4:
Введите строку: баабаб
а

При желании символ пробела можно игнорировать, но это нужна небольшая доработка кода.
Так же можно ограничиться только буквами или выводить только русские буквы.
Для этого нужно при сравнении символов учитывать , что бы они находились в определенном диапазоне.

Добавлено через 28 минут
Я не внимательно прочитал условие. Вот вариант, где игнорируются пробелы.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from collections import Counter
s = input('Введите строку: ').lower()
L = Counter(s).most_common()
maxNminS = ['я', 0]
for i in range(len(L)):
    if ord(L[i][0]) == 32:
        continue
    elif L[i][1] > maxNminS[1]:
        maxNminS = L[i]
    elif L[i][1] == maxNminS[1]:
        if (ord(L[i][0]) < ord(maxNminS[0])):
            maxNminS = L[i]
 
print(maxNminS[0])
пример:

Введите строку: Б а о б а б
б

Добавлено через 3 часа 42 минуты
Небольшая доработка для увеличения скорости при обработке текстов больших объемов, что бы в цикле for не было перебора всех букв присутствующих в тексте.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from collections import Counter
s = input('Введите строку: ').lower()
L = Counter(s).most_common()
 
maxNminS = ['я', 0]
for i in range(len(L)):
    if ord(L[i][0]) == 32:
        continue
    elif L[i][1] > maxNminS[1]:
        maxNminS = L[i]
        if (i < len(L)-1) and (L[i+1][1] < L[i][1]):
            break
    elif L[i][1] == maxNminS[1]:
        if (ord(L[i][0]) < ord(maxNminS[0])):
            maxNminS = L[i]
            if (i < len(L)-1) and (L[i+1][1] < L[i][1]):
                break
 
 
print(maxNminS[0])
2
 Аватар для Semen-Semenich
5222 / 3469 / 1173
Регистрация: 21.03.2016
Сообщений: 8,295
07.01.2019, 11:43
Python
1
2
3
4
5
6
dct = {}
for sumb in input():
    if sumb.isalpha():
        sumb = sumb.lower()
        dct[sumb] = dct.get(sumb,0)+1
print(max(sorted(dct),key = lambda x : dct[x]))
1
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
07.01.2019, 22:48
Semen-Semenich, Ваш код конечно компактнее, но основной его недостаток, что на текстах большого объема он будет работать медленно, так как обрабатывает каждый символ с помощью цикла for, вместо использования встроенного средства Counter(s).most_common(), которое написано на языке С и работает на порядок быстрее. Что и будет проявляться именно на текстах большого объема. Мой же код циклом for обрабатывает только те несколько символов в списке, у которых окажется одинаковое количество вхождений в заданном большом тексте. Поэтому средство предложенное deathly_hallows, более эффективно, просто он поленился обработать получаемый с помощью Counter(s).most_common() список. А я просто развил его идею, доведя до конца.

Добавлено через 49 минут
Да и кстати в условии говорится о рассмотрении всех символов, кроме пробела, Вы же отсекли все символы, которые не являются буквами, что не соответствует условию (это так, небольшое замечание )

Добавлено через 2 часа 12 минут
Вот тоже быстрый код, но более простой алгоритм. Можно сделать его более компактным, сгруппировав некоторые инструкции, но я предпочитаю более простои и более доступный для понимания, хотя и с большим количеством строк. По скорости развернутый и скомпонованный одинаковы, так как выполняется одно и то же количество инструкций, просто запись может быть более компактная и менее наглядная для понимания.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from collections import Counter
s = input('Введите строку: ').lower()
L = Counter(s).most_common()
 
l = []
if ord(L[0][0]) != 32:
    n = L[0][1]
else:
    n = L[1][1]
for p in L:
    if ord(p[0]) == 32:
        continue
    elif p[1] == n:
        l.append(p[0])
    else:
        break
l.sort()
print(l[0])
1
 Аватар для Semen-Semenich
5222 / 3469 / 1173
Регистрация: 21.03.2016
Сообщений: 8,295
08.01.2019, 10:59
Viktorrus, насчет скорости обработки согласен
0
208 / 95 / 15
Регистрация: 27.07.2018
Сообщений: 323
08.01.2019, 18:58
Что так сложно
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
string = input()
letter = []
letterM = []
big = 0
let = ''
for i in string:
    if i != ' ':
        letter.append(i.lower())
        letterM.append(i.lower())
letterM.sort()
for i in letterM:
    if letter.count(i) > big:
        big = letter.count(i)
        let = i
print(let)
2
2 / 2 / 0
Регистрация: 26.11.2019
Сообщений: 3
04.12.2019, 21:11
Код CyberGame, но немного короче

Python
1
2
3
4
5
6
7
8
9
10
11
string = ''.join(input().lower().split())
letter = list()
big = 0
for x in string:
    letter.append(x)
letter.sort()
for y in letter:
    if letter.count(y) > big:
        big = letter.count(y)
        let = y
print(let)
2
5 / 5 / 0
Регистрация: 05.02.2021
Сообщений: 4
15.02.2021, 14:40
Python
1
2
3
4
5
6
7
8
9
10
11
12
text = input().lower().replace(' ', '')
qq = list(text)
qq.sort()
index = str()
a = 0
b = 0
for w in qq:
    a = qq.count(w)
    if a > b:
        index = w
        b = a
print(index)
1
3 / 3 / 0
Регистрация: 09.01.2022
Сообщений: 4
09.01.2022, 21:45
1 text = input().lower()
2 max_c = 0
3 max_t = ''
4 for t in set(text) - set(' '):
5 count = text.count(t)
6 if count > max_c:
7 max_c = count
8 max_t = t
9 elif max_c == count:
10 if t < max_t:
11 max_t = t
13
12 print(max_t)
1
1 / 1 / 0
Регистрация: 05.12.2022
Сообщений: 7
05.12.2022, 11:38
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
a = input().lower()
b = 0
d = ''
for i in a:
    if i != ' ':
        if a.count(i) != b:
            if a.count(i) > b:
                b = a.count(i)
                d = i
        else:
            if i < d:
                d = i
print(d)
вроде все понятно
1
 Аватар для tigertv_ru
141 / 90 / 13
Регистрация: 09.01.2018
Сообщений: 321
Записей в блоге: 2
05.12.2022, 23:00
Python
1
2
3
4
5
from collections import Counter
 
s = input()
res = Counter(filter(str.isalpha, map(str.lower, s))).most_common()[0][0]
print(res)
0
0 / 0 / 0
Регистрация: 11.11.2024
Сообщений: 4
16.12.2024, 18:36
Добавлено через 43 секунды
Python
1
2
3
4
5
6
7
8
9
10
11
12
a = input()
a = a.lower()
a = list(a)
a = ' '.join(a)
a = a.split()
for j in range(0, len(a) - 1):
    for i in range(0, len(a) - 1 - j):
        if a[i] > a[i + 1]:
            a[i], a[i + 1] = a[i + 1], a[i]
        if a.count(a[i]) < a.count(a[i + 1]):
            a[i], a[i + 1] = a[i + 1], a[i]
print(a[0])
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.12.2024, 18:36
Помогаю со студенческими работами здесь

Простой частотный анализ текста, записанного в известном алфавите
Помогите!!!! При решении задач криптографии и лингвистики часто обращаются к методу частотного анализа. С помощью данного метода,...

Провести частотный анализ числа и найти наиболее часто встречающуюся цифру
Провести частотный анализ числа и найти наиболее часто встречающуюся цифру. Ввод - стандартный ввод или input.txt Вывод -...

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

Маленький частотный анализ
Помогите исправить код. Условие задачи: Частотный анализ — это подсчёт, какие символы чаще встречаются в тексте. Это важнейший инструмент...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru