Lazarus: Генерация случайной строки из определенного алфавита (паттерна) символов.

На самом деле, оказалось довольно простой задачей.

Основная программа

var P1,P2,P3,P4:String; I:Integer;
begin
  P1:='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  P2:='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  P3:='abcdefghijklmnopqrstuvwxyz0123456789';
  P4:='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';

  for I:=1 to 23 do
  begin
    WriteLn(GenerateString(75,P1));
  end;
  WriteLn('Press ENTER');
  ReadLn();
end.

Пока все совсем просто, создаем 4 паттерна (алфавита) для теста, заполняем паттерны, создаем счетчик для цикла, а в цикле вызываем функцию GenerateString, таким образом генерируем 23 строки.

Функция GenerateString

1. Функция GenerateString принимает 2 параметра — длина генерируемой строки и паттерн/алфавит, возвращает строку:

function GenerateString (len:Integer; Pattern:String): String;

2. Заводим две внутренних переменных, счетчик для текущей позиции символа в генерируемой строке, и переменную для хранения случайного символа, который получим из строки Pattern:

var I:Integer; C:Char;

3. Инициализируем значение переменной Result, которую функция автоматически возвратит в качестве результата функции:

Result:='';

Если этого не сделать, то при попытке заранее выделить память под переменную, компилятор выдаст предупреждение:

Hint: Function result variable of a managed type does not seem to be initialized (Подсказка: Переменная результата функции управляемого типа, похоже, не инициализирована).

4. И счетчик для текущего символа:

I:=0;

5. Выделяем память под будущую строку, если этого не сделать, память будет выделяться динамически, что будет тормозить процесс:

SetLength(Result,len);

6. Запускаем цикл:

while I < len do
begin
	//...
end;

В цикле:

1. Получаем случайный символ.
2. Записываем полученный символ в нужное место результирующей строки.
3. Увеличиваем счетчик цикла.

Обращение к символу в строке

В Pascal это очень просто, строка рассматривается как массив, а символы — элементы массива. Нумерация символов в строке начинается с единицы, т.е. если мы хотим в переменную C (типа char) записать третий символ из строки Pattern, то это делается так:

C:=Pattern[3];

Получение случайного целого числа из диапазона значений

Для этого применяется функция RandomRange из модуля Math со следующим синтаксисом:

RandomRange(начальное_значение, конечное_значение);

т.е. если вызвать функцию таким образом:

I:= RandomRange(1,10);

то в переменной I (целого типа) окажется случайное значение от 1 до 10.

Внимание! Не забудьте в начале программы подключить модуль Math!

Uses Math;

Ну а длина строки, это совсем просто: Length(Pattern).

Итого:

1. Получение случайного символа:

C:=Pattern[RandomRange(1, Length(Pattern))];

2. Запись символа в результирующую строку:

Result[I+1]:=C;

3. Увеличение счетчика:

inc(I);

Код функции целиком

function GenerateString (len:Integer; Pattern:String): String;
var I:Integer; C:Char;
begin
  Result:='';
  I:=0;
  SetLength(Result,len);

  while I < len do
  begin
       C:=Pattern[RandomRange(1, Length(Pattern))];
       Result[I+1]:=C;
       inc(I);
  end;
end;

Результат работы программы

Пример целиком

На GitHub

Происхождение пословиц и поговорок #1

Политическое:

Мох не выдаст — свинья на съезд!
Мох не выдаст — свинья не съезд!

Гаишное:

Мох не выезд — свинья не съезд!
Мох на выезд — свинья на съезд!
Мох на выезд — свинья на въезд!
Бох на выезд — свинья на въезд!

Сталкерское:

Мох не выест — свинья не съест!

Юрий Нестеренко:

Бог не выест — свинья не съест!

Квартет И:

И лишь последним вариантом стало точно найденное: «Бог не выдаст — свинья не съест!»

Закрылся любимый журнал ИNАЧЕ

На мой взгляд, тот случай, когда ушла эпоха. Любимый журнал детства, который я читал лет, наверное, с пятнадцати, а потом познакомился с основателем, которого сначала напугался: довольно крупный дядька, особенно на фоне меня, который я в 20 лет весил 45 кило и подходил под песню Пургена «Я длинный и худой, на мне рвется вся одежда». Но Вадим оказался очень добрым и светлым человеком, не раз подставлявшим мне руку, и в прямом и в переносном смысле.

В общем, как спел культовый музыкант:

Всё в своё время — зима и весна,
Каждой звезде — свой неба кусок,
Каждому морю — дождя глоток.

Сегодня, в бывший день печати, я закрыл проект inache.net. Журнал ИNАЧЕ мы создали еще в 1996 году, и вокруг него возникла невероятная интеллектуальная и креативная тусовка рубежа тысячелетий. Мы не вписывались ни в какие идеологические и стилевые рамки, с нами сотрудничали предельно разные неформалы и нонконформисты эпохи, без различия этносов и регионов — Mars MF-13, Nick Nordprod, Буковский, Каганов, Калугин, КлещЪ, Ключарёва, Кормильцев, Корнев, Корчинский, Курылёв, Летов, Мустафа ар-Руси, Непомнящий, Новодворская, команда Транслаборатории, Шаву, Широпаев, Эпштейн… И как оказалось, на полюсе нонконформизма идеологические различия исчезают. )

Еще в конце 90-х мы искали и заявляли альтернативы попсовому расейскому мейнстриму в культуре и политике, который в конечном итоге привел в сегодняшний адЪ. Видимо, плохо искали и заявляли… Но мы сознательно делали ИNАЧЕ как эзотерический проект: если надо объяснять, то не надо объяснять. )

Было выпущено 5 бумажных номеров журнала, которые разлетелись глобально — от Кёнига до Владика и Библиотеки Конгресса США. Презентация каждого номера в Москве или Питере сопровождалась яростными спорами вплоть до мордобоев. ) С 2005-го журнал выходил только в электронной версии, а после своего отъезда в 2015-м я перестал его обновлять. Он остался на российском хостинге, и за последние пару лет его хозяева мне несколько раз жаловались: на них наезжают Эшники и ФСБшники за наши «экстремистские» тексты. Хотя они были опубликованы уже более 10 лет назад — но расейские законы теперь имеют обратную силу.

В общем, сугубо номинально поддерживать сайт и подставлять оставшихся на России хостеров мне не хочется. Все, кому надо и всё, что надо, оттуда вычитали в свое время. А сейчас — те общие, довольно абстрактные идеи, которыми мы увлекались на рубеже веков, уже не работают. Сейчас нужно не wishful thinking, но конкретные проекты создания и взаимодействия построссийских стран. Этим занимается портал Регион.Эксперт. И после империи всё будет ИNАЧЕ! )

Из ТГ-канала Вадима Владимировича.

ЗЫ. Если будет разрешение — отсканирую бумажные номера и выложу в PDF

Анекдот

Си Цзиньпин пошел на третий срок, теперь он Си++

Музыкальный римейк анекдота

Си Цзиньпин пошел на третий срок, теперь он должен переименоваться в Ре Цзиньпиня

Чудеcнейший Штепа открыл проект Region.Expert

Давно открыл уже, но проект не такой уж чтобы посещаемый, так что я сделал кнопочку, по согласию с Вадимом, конечно же.

Можете себе на сайт/в блог забрать, вот вам код кнопочки:

<a href="https://region.expert/" target="blank"><img src="https://i.imgur.com/2SXUPQ1.png" alt="Регион.Эксперт. Портал о регионализме"></a>