Частотность вхождения букв в текст — первый шаг в расшифровке сообщения

Автор Евгений К., 9 класс

Постановка задачи

Есть некоторое сообщение, закодированное простой заменой символов (один на один с помощью некоторой таблицы). Известно, что в различных языках частотность появления букв разная. Если отсортировать буквы по их частотности в тексте, то можно попробовать и расшифровать сообщение.

Решение

// Определить частотность букв (в %) в строке текста stroka, алфавит задан строкой buk.
using System;
namespace Частотность_Букв_в_тексте
{
    class Program
    {
        static void Main()
        {
            // ввод текста (любые символы)
            Console.WriteLine("Введите текст.");
            string stroka = Console.ReadLine().ToUpper(); // перевод в прописные
            long all = stroka.Length; // число символов
            // алфавит - русский. Можно изменять!
            string buk = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";
            int kol = buk.Length; // число букв          
            // массив счетчиков букв
            double[] m = new double[buk.Length];
            // Циклы для подсчетов
            for (int i = 0; i < all; i++)   // по тексту
                for (int j = 0; j < kol; j++)   // по буквам
                    if (stroka[i] == buk[j])
                    {
                        m[j]++;
                        break;  // досрочный выход, если найден
                    }
            // Число букв в тексте: n <= all
            double n = 0;
            for (int j = 0; j < kol; j++)
                n += m[j];
            // Парная сортировка массивов m[] и buk[]
            double c;
            char b1;
            char b2;
            char b3 = ' ';
            for (int i = 1; i < buk.Length - 1; i++)
                for (int j = 0; j < buk.Length - 1; j++)
                    if (m[j] < m[j + 1])
                    {
                        // перестановка в m[]
                        c = m[j];
                        m[j] = m[j + 1];
                        m[j + 1] = c;
                        // перестановка в buk[]
                        b1 = buk[j];
                        b2 = buk[j + 1];
                        buk=buk.Replace(b1, b3);    // важно buk=buk.Replace(), 
                        buk=buk.Replace(b2, b1);    // НО не buk.Replace();
                        buk =buk.Replace(b3, b2);   
                    }
            // Вывод результата
            if (n < 1)
                Console.WriteLine("Вы не ввели ни одну букву алфавита в Вашем тексте!");
            else
            {
                Console.WriteLine("Проценты содержания каждой из букв в тексте:");
                for (int i = 0; i < buk.Length; i++) { if (m[i] > 0)
                    {
                        m[i] = Math.Round(m[i] / n * 100, 2);
                        Console.WriteLine("{0}:\t{1}%", buk[i], m[i]);
                    }
                }
            }
            Console.ReadKey();
        }
    }
}

 

1 комментарий к “Частотность вхождения букв в текст — первый шаг в расшифровке сообщения”

  1. Вячеслав Рычков

    Спасибо, Евгений!
    Отмечу понятный и четкий алгоритм решения.
    Набор символов можно задавать произвольным.
    Полезен перевод символов в прописные буквы, проверена правильность перевода не только английских, но и русских букв алфавита, включая Ё (символы Unicode).
    Использована связанная сортировка массива m[] и символов в строке buk.

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

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Пролистать наверх