Поиск по этому блогу

среда, 14 февраля 2024 г.

Генератор идентификаторов и наименований

Иногда возникает задача придумать какое-то удобочитаемое ничего не значащее название. Например, имя для базы данных. Чтобы не тратить лишние калории, написал такую функцию.


Код:
Функция СгенерироватьИдентификатор(Знач ТребуемаяДлина, Знач Начало, Знач МаксСогласныхПодряд, Знач МаксГласныхПодряд) //ТребуемаяДлина = 8; // какой длины должен быть идентификатор //Начало = "vidu"; // с каких символов должен начинаться идентификатор (может быть пустая строка) //МаксСогласныхПодряд = 2; // сколько согласных букв подряд допустимо в идентификаторе //МаксГласныхПодряд = 1; // сколько гласных букв подряд допустимо в идентификаторе Согласные = "bcdfghjklmnpqrstvwxz"; Гласные = "aeiouy"; КолвоСогласных = СтрДлина(Согласные); КолвоГласных = СтрДлина(Гласные); ГСЧ = Новый ГенераторСлучайныхЧисел; Стр = Начало; КолвоСогласныхПодряд = 0; КолвоГласныхПодряд = 0; Если НЕ ПустаяСтрока(Стр) Тогда // посчитаем сколько уже согласных подряд в конце заданной строки Поз = СтрДлина(Стр); Пока Поз > 0 И СтрНайти(Согласные, Сред(Стр, Поз, 1)) > 0 Цикл КолвоСогласныхПодряд = КолвоСогласныхПодряд + 1; Поз = Поз - 1; КонецЦикла; // посчитаем сколько уже гласных подряд в конце заданной строки Если КолвоСогласныхПодряд = 0 Тогда Поз = СтрДлина(Стр); Пока Поз > 0 И СтрНайти(Гласные, Сред(Стр, Поз, 1)) > 0 Цикл КолвоГласныхПодряд = КолвоГласныхПодряд + 1; Поз = Поз - 1; КонецЦикла; КонецЕсли; ТребуемаяДлина = ТребуемаяДлина - СтрДлина(Стр); КонецЕсли; Для Сч = 1 По ТребуемаяДлина Цикл СледующаяГласная = Ложь; Если КолвоСогласныхПодряд >= МаксСогласныхПодряд Тогда // следующая буква должна быть гласной СледующаяГласная = Истина; ИначеЕсли КолвоГласныхПодряд >= МаксГласныхПодряд Тогда // следующая буква должна быть согласной СледующаяГласная = Ложь; Иначе // следующая может быть как гласной, так и согласной - выбираем 50/50 СледующаяГласная = (ГСЧ.СлучайноеЧисло(1, 100) > 50); КонецЕсли; Если СледующаяГласная Тогда Стр = Стр + Сред(Гласные, ГСЧ.СлучайноеЧисло(1, КолвоГласных), 1); КолвоСогласныхПодряд = 0; КолвоГласныхПодряд = КолвоГласныхПодряд + 1; Иначе Стр = Стр + Сред(Согласные, ГСЧ.СлучайноеЧисло(1, КолвоСогласных), 1); КолвоСогласныхПодряд = КолвоСогласныхПодряд + 1; КолвоГласныхПодряд = 0; КонецЕсли; КонецЦикла; Возврат Стр; КонецФункции