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

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

 

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

Решение: 

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

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

У каждой буквы есть порядковый номер: А = 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 знака)

______________________________________________________________


 

27 Comments

  1. anig99

    Обозвать нужно по-другому. Длинное название слишком и непонятно из него для чего оно.

    Я в свое время (не для 1с) раскладывал число в двоичную систему исчисления (по формуле), разбивал это число на группы по 7 или 8 знаков, обратно переводил их в десятичную и получал соответствующий знак из таблицы ASCII.

    Reply
  2. orsprog

    (1) anig99,

    спасибо за подсказку, то же такой вопрос возник, пригодилось

    Reply
  3. marku

    Хорошая идея, может пригодится

    Reply
  4. Angeros

    Механизм подобен переводу между разными системами счисления. скажем 10->16.

    У себя подобное делал когда надо было уид 36симв сжать до 20ти.

    Применил подобный механизм перевода из 16тиричной в 96тиричную систему и обратно в 16тиричную.

    Reply
  5. see1c.ru

    (4) да , только разрядность можно любую установить.

    Reply
  6. see1c.ru

    (1) интересно какой вариант компактнее свернет 🙂

    Reply
  7. director04

    Весьма забавный механизм. Что-то типа «забавной математики». Положу в копилку…

    Reply
  8. Арчибальд
    разрядность буквенной записи меньше за счет того, что букв в нашем ряде 33, а в числовом 10

    Минус пока не поставлю. Но вообще-то, то в школе проходят.

    И на ИС публиковалось: http://infostart.ru/public/70211/

    Понятно, конечно, что для восьмерочника это открытие…

    Reply
  9. see1c.ru

    (8) Разве та обработка тоже самое делает или по такому же алгоритму? Причем тут школьники , ну в общем то все не угодишь, если считаете нужным ставьте минус.

    Reply
  10. anig99

    (9) там как раз до 36значной системы…

    Reply
  11. Арчибальд

    (9) Плюс за адекват. Так редко встречается…

    Reply
  12. see1c.ru

    (10) почему как раз ? 🙂 теоретически можете все доступные символы использовать, в примере их 127, но можете добавить, главное не использовать 0

    Reply
  13. DoctorRoza

    Люблю подобные задачи .. хорошая тренировка для мозга, так что + однозначно! )))

    Reply
  14. dimanich70

    Не знаю кто и зачем минусовать хочет, типо он в школе это изучал. У нас в школе этого не было.

    Считаю, очень интересное решение. Плюсую однозначно.

    Reply
  15. igor_gk

    🙂

    Reply
  16. sound

    Нормальная тема, плюсую. А еще если чуть-чуть развить идею и сильно постараться, то можно будет на основании этого потом написать упаковыватель баз и складывать бекапы тупо на дискеты. Часть кода я уже придумал, это встроенная функция «Вопрос» с примерно таким текстом «Отправить базу УПП на диск 3,5А?» 🙂

    Reply
  17. see1c.ru

    (16) была мысль на счет архиватора, но врятли удастся запаковать сильнее обычного zip. Еще мысль сделать архиватор примерного текста, сжать так, чтобы при распаковке смысл был понятен, а слова не обязательно в точности соответствовали исходным, например сохранялись только согласные. Может и не особо полезная вещь, но интересно попробовать 🙂

    Reply
  18. marsohod

    Начинаю завидовать китайцам и японцам… и корейцам… и… ну вы поняли 🙂

    Reply
  19. CheBurator

    (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.

    Reply
  20. echo77

    А можно сделать обратное преобразование? По данным документа сформировать мнемоническую строку, однозначно описывающую содержимое документа, типа хэша

    Reply
  21. see1c.ru

    (20) я не знаю насколько позволит разрядность в 1С, какой длинны максимальное число… можно попробовать все данные документа поместить в число , но оно будет очень большим, есть ли в этом смысл…

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

    в моем примере число содержит именно данные первоначальные и их можно обратно из числа получать. Вообще это просто номер комбинации символов полученных перебором. Только перебор не выполняется а по формуле рассчитывается.

    Reply
  22. DrAku1a

    Прикольно. По-сути это действительно перевод между системами счисления, но реализация весьма оригинальна. Можно по-аналогии сделать Base-64 кодирование и много чего еще…

    Reply
  23. dkprim

    вспомнились будни из универа. интересная и адекватная публикация, автору спасибо 🙂

    Reply
  24. Valerich

    обычный перевод из одной системы счисления в другую…

    Предлагаю поиграться с ЗиК (7.7): создайте новую базу, внесите одно начисление одному сотруднику и посмотрите уникальный код первой записи в таблице журнала расчетов. А потом скажите, почему там стоит именно такой код (если 1с ничего не поменяла, в методах кодирования записей, то там будет что-то вроде «zik7jz»).

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

    Reply
  25. ivn75

    А смысл было реализовывать это на 1с? Если архиваторы действительно лучше справляются, да и для шифровки/дешифровки нет смысла использовать. Единственно решение ради решения?

    Reply
  26. see1c.ru

    (25) Лично мне понадобилось при создании обмена между базами, в которых нельзя было изменять конфигурации.

    Reply
  27. Светлый ум

    не очень читабельный код

    Reply

Leave a Comment

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