// package Частотник -- ищет минимально частотную архивную пару package frequencer import ( "log" mKh "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers" "gitp78su.ipnodns.ru/svi/packer/lev0/alias" "gitp78su.ipnodns.ru/svi/packer/lev0/types" "gitp78su.ipnodns.ru/svi/packer/lev1/archive_combo" "gitp78su.ipnodns.ru/svi/packer/lev1/archive_stat_combo" "gitp78su.ipnodns.ru/svi/packer/lev1/dict_keys" "gitp78su.ipnodns.ru/svi/packer/lev2/belt" ) // Частотник -- ищет максимально частотную архивную пару type Частотник struct { лента *belt.Лента // Лента бинарных данных словКлючи *dict_keys.СловКлючи // Словарь задействованных ключей ap *archive_combo.ArchiveCombo // Частотная архивная пара archStatVal *archive_stat_combo.ArchiveStatCombo // Статистика частот архивных значений ключ alias.ArchKey // Текущий ключ для перебора } // НовЧастотник -- возвращает новый искатель максимальной архивной пары func НовЧастотник() *Частотник { сам := &Частотник{ словКлючи: dict_keys.СловКлючиПолуч(), лента: belt.ЛентаПолуч(), ap: archive_combo.NewArchiveCombo(0, 0), } _ = types.ИЧастотник(сам) return сам } // Пуск -- запускает вычисление частотной архивной пары // // Считается успехом, если нашёл 5 замен архивных пар func (sf *Частотник) Пуск() { sf.ключНайти() binData := sf.лента.Вых() sf.archStatVal = archive_stat_combo.NewArchiveStatVal(binData) sf.ap = sf.archStatVal.Max() еслиНайдено := sf.ap != nil mKh.Hassert(еслиНайдено, "Частотник.Пуск(): not find keys for change, checked=%v", sf.archStatVal.Len()) log.Printf("Частотник.Пуск(): архивПара=%v, checked=%v\n", sf.ap, sf.archStatVal) } // Ключи -- возвращает найденные ключи func (sf *Частотник) АрхивПара() types.ИАрхивПара { return sf.ap } // Вычисляет свободный ключ словаря подстановки (его нет в бинарном архивном списке) func (sf *Частотник) ключНайти() { binData := sf.лента.Вых() ключВозможно := sf.словКлючи.ВозможноКлюч() fnIsStop := func() bool { for _, binVal := range binData { if ключВозможно == alias.ArchKey(binVal) { ключВозможно = sf.словКлючи.ВозможноКлюч() return false } } return true } for fnIsStop() { } sf.ключ = ключВозможно }