Untitled
delphi
posted: Jun, 10th 2012 | jump to bottom
Функция ПрименитьВероятностныйАнализ(ВероятностноеСоответсвие) Экспорт // Собираем статистику по зашифрованным символам СчетчикиЗашифрованныхСимволов = Новый Соответствие(); ВсегоБукв = СтрДлина(ЗашифрованныйТекст); ТекНомерБуквы = 1; ИсходныйТекст = ""; Пока ТекНомерБуквы <= ВсегоБукв Цикл ЗашифрованныйСимвол = Сред(ЗашифрованныйТекст, ТекНомерБуквы, 2); Если СчетчикиЗашифрованныхСимволов[ЗашифрованныйСимвол] = Неопределено Тогда СчетчикиЗашифрованныхСимволов.Вставить(ЗашифрованныйСимвол, 1); Иначе Попытка СчетчикиЗашифрованныхСимволов[ЗашифрованныйСимвол] = СчетчикиЗашифрованныхСимволов[ЗашифрованныйСимвол] + 1; Исключение Сообщить(ЗашифрованныйСимвол + " номер символа" + ТекНомерБуквы); КонецПопытки; КонецЕсли; ТекНомерБуквы = ТекНомерБуквы + ?(РазделятьПробеламиЗашифрованныеЭлементы, 3, 2); КонецЦикла; РезультирующиеВероятности = Новый ТаблицаЗначений(); РезультирующиеВероятности.Колонки.Добавить("ЗашифрованныйСимвол"); РезультирующиеВероятности.Колонки.Добавить("КоличествоВстреч"); РезультирующиеВероятности.Колонки.Добавить("ДоляВстреч"); Для Каждого СчетчикСимвола Из СчетчикиЗашифрованныхСимволов Цикл НоваяСтрока = РезультирующиеВероятности.Добавить(); НоваяСтрока.ЗашифрованныйСимвол = СчетчикСимвола.Ключ; НоваяСтрока.КоличествоВстреч = СчетчикСимвола.Значение; КонецЦикла; // заполняем доли встреч ВстречВсехСимволов = РезультирующиеВероятности.Итог("КоличествоВстреч"); Для Каждого Стр Из РезультирующиеВероятности Цикл Стр.ДоляВстреч = Стр.КоличествоВстреч / ВстречВсехСимволов; КонецЦикла; Отчет = Новый ТабличныйДокумент(); ОтчетМакет = ПолучитьМакет("РезультирующиеВероятностиОтчет"); ОбластьШапка = ОтчетМакет.ПолучитьОбласть("Шапка"); ОбластьСтрокаОтчета = ОтчетМакет.ПолучитьОбласть("СтрокаОтчета"); Отчет.Вывести(ОбластьШапка); // Ищем наиболее похожие вероятности в ВероятностномСоответсвии (три наиболее близких пары) Для Каждого Стр Из РезультирующиеВероятности Цикл // Искомое - Стр.ДоляВстреч ОбластьСтрокаОтчета.Параметры.Код = Стр.ЗашифрованныйСимвол; ОбластьСтрокаОтчета.Параметры.ДоляВстреч = Стр.ДоляВстреч; РейтингВероятностей = Новый ТаблицаЗначений(); РейтингВероятностей.Колонки.Добавить("Символ"); РейтингВероятностей.Колонки.Добавить("ВероятностьПоТаблице"); РейтингВероятностей.Колонки.Добавить("ОтклонениеОтВероятности"); РейтингВероятностей.Колонки.Добавить("ОтклонениеОтВероятностиМодуль"); Для Каждого ВероятностьСимвола Из ВероятностноеСоответсвие Цикл НоваяСтрокаРейтинга = РейтингВероятностей.Добавить(); НоваяСтрокаРейтинга.Символ = ВероятностьСимвола.Значение; НоваяСтрокаРейтинга.ВероятностьПоТаблице = ВероятностьСимвола.Ключ; НоваяСтрокаРейтинга.ОтклонениеОтВероятности = Стр.ДоляВстреч - ВероятностьСимвола.Ключ; НоваяСтрокаРейтинга.ОтклонениеОтВероятностиМодуль = ?(НоваяСтрокаРейтинга.ОтклонениеОтВероятности >= 0, НоваяСтрокаРейтинга.ОтклонениеОтВероятности, НоваяСтрокаРейтинга.ОтклонениеОтВероятности * (-1)); КонецЦикла; РейтингВероятностей.Сортировать("ОтклонениеОтВероятностиМодуль Возр"); // Теперь в первых трёх строках - наиболее вероятные буквы ОбластьСтрокаОтчета.Параметры.БудетДешифрированКак = РейтингВероятностей[0].Символ; ОбластьСтрокаОтчета.Параметры.ПредполагаемыйСимвол = РейтингВероятностей[0].Символ; ОбластьСтрокаОтчета.Параметры.ВероятностьПоТаблице = РейтингВероятностей[0].ВероятностьПоТаблице; ОбластьСтрокаОтчета.Параметры.Отклонение = Стр.ДоляВстреч * 100 / РейтингВероятностей[0].ВероятностьПоТаблице - 100; ПрочиеВариантыТекст = РейтингВероятностей[1].Символ + " (" + Формат(Стр.ДоляВстреч * 100 / РейтингВероятностей[1].ВероятностьПоТаблице - 100, "ЧДЦ=14") + "%); " + РейтингВероятностей[2].Символ + " (" + Формат(Стр.ДоляВстреч * 100 / РейтингВероятностей[2].ВероятностьПоТаблице - 100, "ЧДЦ=14") + "%) " ; ОбластьСтрокаОтчета.Параметры.ПрочиеВарианты = ПрочиеВариантыТекст; Отчет.Вывести(ОбластьСтрокаОтчета); КонецЦикла; Возврат Отчет; КонецФункции
9602 views




