The Easiest Way to Save and Share Code Snippets on the web

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