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

Опубликовал see1c ru (see1c.ru) в раздел Программирование - Практика программирования

Возникла задача склеить два шестизначных числовых кода и записать их в один шестизначный код типа строка. О практическом применении напишу ниже.

 

Возникла задача склеить два шестизначных числовых кода и записать их в один шестизначный код типа строка. О практическом применении напишу ниже.

Решение: 

Выложим последовательность букв в ряд, например по алфавиту:

Алфавит = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ";

У каждой буквы есть порядковый номер: А = 1, Б = 2, В = 3 …, Ю = 32, Я = 33.

Если после прохождения всех номеров добавлять разрядность и продолжать нумерацию то получим: АА = 34, АБ = 35, АВ = 36 …  ААА = 1123, ААБ = 1124 ,...

Таким образом, буквенный ряд, как и числовой, будет бесконечным.

Из этого следует, что каждому числу соответствует одна комбинация букв нашего буквенного ряда, но при этом разрядность буквенной записи меньше за счет того, что букв в нашем ряде 33, а в числовом 10.

Это похоже на запись числа в шестнадцатеричном виде, но алгоритм немного другой и разрядов больше :)

Соответственно чем больше знаков  в исходном буквенном ряде, тем меньше знаков потребуется для кодирования числа.  Например, если составить ряд из букв верхнего и нижнего регистра русского и латинского алфавитов + цифры от 1 до 9 (ноль не используется) то длина его будет 127 символов.

 

Использем этот ряд для преобразование числа 999 999 999 999 в строку, получим значение 48AшяC 

т.е. 12-ти значное число можем "свернуть" в 6-ти символьную строку.

 

Механизм по обратному преобразованию можно использовать не только для определения первоначального числа.

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

так слово КЛАССИФИКАТОР   будет иметь номер 20674162138069284621

   а слово АЛГОРИТМ                                    номер 59583701312

 

Кроме того, добавив в буквенный ряд заглавные буквы, знаки препинания и пробел, можно получать номера целых предложений например:

Без труда не выловишь и рыбку из пруда.   =   19470269484383031306224885067323003470882054702807657091899034219691830


Теперь по реализации преобразования:

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

 

 &НаКлиенте
Процедура Выполнить2(Команда)

//Из числа в строку
    
Алфавит2 = Объект.Алфавит2;
    
КолСимволов = СтрДлина(Алфавит2);

    
Сл = "";
    
Ч = Число(?(ЗначениеЗаполнено(СокрЛП(Объект.Строка2)),СокрЛП(Объект.Строка2),0));
     Пока
Ч > КолСимволов Цикл

        
цел = Цел(Ч/КолСимволов);
        
дроб = (Ч/КолСимволов)-цел;

         Если
дроб = 0 Тогда
            
НомерБуквы = КолСимволов;
            
Ч = цел-1;
         Иначе
            
НомерБуквы = дроб*КолСимволов;
            
Ч = цел;
         КонецЕсли;

        
Сл = Сред(Алфавит2,    Окр(НомерБуквы),1) + Сл;

     КонецЦикла;

     Если
Ч > 0 Тогда
       
Сл = Сред(Алфавит2,Ч,1)+Сл;
     КонецЕсли;

    
Сообщение = Новый СообщениеПользователю;
    
Сообщение.Текст =Строка(Сл);
    
Сообщение.Сообщить();

// Из строки в число
    
Ч = 0;
    
ДлСтроки = СтрДлина(СокрЛП(Объект.Строка));
     Для
А = 1 По ДлСтроки Цикл Ч = Ч+Pow(КолСимволов,ДлСтроки-А)*Найти(Алфавит2,Сред(СокрЛП(Объект.Строка),А,1)) КонецЦикла;

    
Сообщение = Новый СообщениеПользователю;
    
Сообщение.Текст =Строка(Ч);
    
Сообщение.Сообщить();

 КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
Объект.Алфавит2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789abcdefghijklmnopqrstuvwxyzАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдеёжзийклмнопрстуфхцчшщьыъэюя";
КонецПроцедуры


Способы применения:

 

 - Использование максимального диапазона допустимых символов внутри установленной длинны кода.

 - Визуальное кодирование и декодирование текста.

 - Получение уникального идентификатора приемлемой длинны по нескольким элементам имеющим числовой код.

 - Изменяя строку Алфавит2 (набор и последовательность символов), можно установить уникальную кодировку.

 - Поместить строку в реквизит числового типа

 - Генерировать строковые пароли

 - Использовать как классификатор всех слов

 - ...

Также можно подумать на счет хранения закодированного пароля в обычном реквизите типа число, при этом ключ надежно прятать :) может быть актульно для 7.7 

 

Примеры преобразований:

_____________________________________________________________

число 22123476457584895786769029890898078978678123452153427867862146576367721919322327877721010111775763535555548388

строка рrюгщRPtpzWfнrYТHp1TЬйlЕldVdЙЛэCВщПzqJXлГэНZpmВeJяЧd

_______________________________________________________

строка ЕслиМеханизмИнтересенНажмитеПлюс

число 11214047979048599474046065949637649393355959347429435025149026973969

число 781060657266302177787942157125453912674901582490 (только русский алфавит нижний регистр, 33 знака)

______________________________________________________________


 

Скачать файлы

Наименование Файл Версия Размер
Коды слов - see1c.ru
.epf 6,50Kb
20.10.11
27
.epf 6,50Kb 27 Скачать

См. также

Добавить вознаграждение
Комментарии
1. Александр Медведев (anig99) 2479 20.10.11 09:18 Сейчас в теме
Обозвать нужно по-другому. Длинное название слишком и непонятно из него для чего оно.
Я в свое время (не для 1с) раскладывал число в двоичную систему исчисления (по формуле), разбивал это число на группы по 7 или 8 знаков, обратно переводил их в десятичную и получал соответствующий знак из таблицы ASCII.
2. Anna Babynina (orsprog) 20.10.11 09:20 Сейчас в теме
(1) anig99,
спасибо за подсказку, то же такой вопрос возник, пригодилось
3. Марк (marku) 52 20.10.11 09:43 Сейчас в теме
Хорошая идея, может пригодится
4. Доржи Балбаров (Angeros) 20.10.11 10:10 Сейчас в теме
Механизм подобен переводу между разными системами счисления. скажем 10->16.
У себя подобное делал когда надо было уид 36симв сжать до 20ти.
Применил подобный механизм перевода из 16тиричной в 96тиричную систему и обратно в 16тиричную.
5. see1c ru (see1c.ru) 46 20.10.11 10:15 Сейчас в теме
(4) да , только разрядность можно любую установить.
6. see1c ru (see1c.ru) 46 20.10.11 10:17 Сейчас в теме
(1) интересно какой вариант компактнее свернет :)
7. Валерий Гайдабура (director04) 3438 20.10.11 13:44 Сейчас в теме
Весьма забавный механизм. Что-то типа "забавной математики". Положу в копилку...
8. Александр Рытов (Арчибальд) 2653 20.10.11 14:37 Сейчас в теме
разрядность буквенной записи меньше за счет того, что букв в нашем ряде 33, а в числовом 10
Минус пока не поставлю. Но вообще-то, то в школе проходят.
И на ИС публиковалось: http://infostart.ru/public/70211/
Понятно, конечно, что для восьмерочника это открытие...
Светлый ум; Valerich; +2 Ответить 1
9. see1c ru (see1c.ru) 46 20.10.11 14:46 Сейчас в теме
(8) Разве та обработка тоже самое делает или по такому же алгоритму? Причем тут школьники , ну в общем то все не угодишь, если считаете нужным ставьте минус.
10. Александр Медведев (anig99) 2479 20.10.11 15:07 Сейчас в теме
(9) там как раз до 36значной системы...
11. Александр Рытов (Арчибальд) 2653 20.10.11 15:13 Сейчас в теме
(9) Плюс за адекват. Так редко встречается...
12. see1c ru (see1c.ru) 46 20.10.11 15:16 Сейчас в теме
(10) почему как раз ? :) теоретически можете все доступные символы использовать, в примере их 127, но можете добавить, главное не использовать 0
13. Алексей Роза (DoctorRoza) 20.10.11 17:07 Сейчас в теме
Люблю подобные задачи .. хорошая тренировка для мозга, так что + однозначно! )))
14. Автоматизация Производства (dimanich70) 173 20.10.11 21:16 Сейчас в теме
Не знаю кто и зачем минусовать хочет, типо он в школе это изучал. У нас в школе этого не было.

Считаю, очень интересное решение. Плюсую однозначно.
15. igor_gk (igor_gk) 44 21.10.11 14:01 Сейчас в теме
16. sound sound (sound) 518 21.10.11 16:45 Сейчас в теме
Нормальная тема, плюсую. А еще если чуть-чуть развить идею и сильно постараться, то можно будет на основании этого потом написать упаковыватель баз и складывать бекапы тупо на дискеты. Часть кода я уже придумал, это встроенная функция "Вопрос" с примерно таким текстом "Отправить базу УПП на диск 3,5А?" :)
17. see1c ru (see1c.ru) 46 21.10.11 16:59 Сейчас в теме
(16) была мысль на счет архиватора, но врятли удастся запаковать сильнее обычного zip. Еще мысль сделать архиватор примерного текста, сжать так, чтобы при распаковке смысл был понятен, а слова не обязательно в точности соответствовали исходным, например сохранялись только согласные. Может и не особо полезная вещь, но интересно попробовать :)
18. Вячеслав Кадацкий (marsohod) 119 22.10.11 07:44 Сейчас в теме
Начинаю завидовать китайцам и японцам... и корейцам... и... ну вы поняли :)
19. Сергей (Che) Коцюра (CheBurator) 3367 23.10.11 03:55 Сейчас в теме
(17)
94НН03 С006Щ3НN3 П0К4ЗЫ8437, К4КN3 У9N8N73ЛЬНЫ3 83ЩN М0Ж37 93Л47Ь Н4Ш Р4ЗУМ! 8П3Ч47ЛЯЮЩN3 83ЩN! СН4Ч4Л4 Э70 6ЫЛ0 7РУ9Н0, Н0 С3ЙЧ4С Н4 Э70Й С7Р0К3 84Ш Р4ЗУМ ЧN7437 Э70 4870М47NЧ3СКN, Н3 З49УМЫ84ЯСЬ 06 Э70М. Г0Р9NСЬ. ЛNШЬ 0ПР393Л3ННЫ3 ЛЮ9N М0ГУ7 ПР0ЧN747Ь Э70.
lefthander; Leja; +2 Ответить
20. Александр Крынецкий (echo77) 666 23.10.11 16:42 Сейчас в теме
А можно сделать обратное преобразование? По данным документа сформировать мнемоническую строку, однозначно описывающую содержимое документа, типа хэша
21. see1c ru (see1c.ru) 46 23.10.11 17:06 Сейчас в теме
(20) я не знаю насколько позволит разрядность в 1С, какой длинны максимальное число... можно попробовать все данные документа поместить в число , но оно будет очень большим, есть ли в этом смысл...

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

в моем примере число содержит именно данные первоначальные и их можно обратно из числа получать. Вообще это просто номер комбинации символов полученных перебором. Только перебор не выполняется а по формуле рассчитывается.
22. Андрей Акулов (DrAku1a) 1185 24.10.11 08:16 Сейчас в теме
Прикольно. По-сути это действительно перевод между системами счисления, но реализация весьма оригинальна. Можно по-аналогии сделать Base-64 кодирование и много чего еще...
23. Александр Иванов (dkprim) 4 26.10.11 12:34 Сейчас в теме
вспомнились будни из универа. интересная и адекватная публикация, автору спасибо :)
24. Валерий Дубовой (Valerich) 1602 27.10.11 07:00 Сейчас в теме
обычный перевод из одной системы счисления в другую...

Предлагаю поиграться с ЗиК (7.7): создайте новую базу, внесите одно начисление одному сотруднику и посмотрите уникальный код первой записи в таблице журнала расчетов. А потом скажите, почему там стоит именно такой код (если 1с ничего не поменяла, в методах кодирования записей, то там будет что-то вроде "zik7jz").
Это мне пришлось разбираться с проблемой несколько лет назад, когда у нас встала колом база ЗиК.... - ни добавить начисление, ни выгрузить загрузить данные...
25. Иван Мелихов (ivn75) 27.10.11 09:56 Сейчас в теме
А смысл было реализовывать это на 1с? Если архиваторы действительно лучше справляются, да и для шифровки/дешифровки нет смысла использовать. Единственно решение ради решения?
26. see1c ru (see1c.ru) 46 27.10.11 10:20 Сейчас в теме
(25) Лично мне понадобилось при создании обмена между базами, в которых нельзя было изменять конфигурации.
28. Константин Куликов (Светлый ум) 192 20.10.16 09:50 Сейчас в теме
не очень читабельный код