Последние записи
- TChromium (CEF3), сохранение изображений
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
- Взаимодействие через командную строку
- Перенести программу из Delphi в Lazarus
- Определить текущую ОС
- Автоматическая смена языка (раскладки клавиатуры)
- Сравнение языков на массивах. Часть 2
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
5th
Сен
Генератор вариаций слов (предложений)
Posted by obzor under Delphi
Есть список с набором заданий (построчно перечислен список столбцов для выборки из таблицы) и таблица из которой нужно извлекать данные по указанным столбцам после перемешивая между собой данные генерируя макс. количество слов.
Количество столбцов в таблице и в списке заданий может меняться пользователем.
Запутался в циклах совсем, получается сгенерировать только 1 раз для конкретной строки, после чего цикл идет дальше а вернуть еще раз генерацию для слова не могу, да и количество слов в каждом столбце разное, немного сбивает с толку.
К примеру: берем 1 значение из набора правил — 2 3 1 и генерируем для него максимум вариаций:
1) собрать красный стол
2) собрать синий стол
3) собрать белый стол
4) собрать красный стул
5) собрать синий стул
6) собрать белый стул
7) …
вместо слова можно использовать термин ячейка таблицы, если так удобней.
цифры в наборе правил — это номера столбцов для выборки в таблице.
мы используем для построения ПРЕДЛОЖЕНИЙ ВСЕ такие индексы
1 1 1 1
1 1 1 2
1 1 1 3
. . .
1 1 1 N1
1 1 2 1
. . .
1 1 2 N4
. . .
1 1 N3 N4
. . .
N1 N2 N3 N4
type
Tcol_mas =array of string;//это будут СТОЛБЦЫ исходной таблицы
TND_mas =array of Tcol_mas; // а это уже массив столбцов (т.е. ВЕСЬ НД)
var
X: TND_mas; // а это собственно МЕСТО(переменная) куда ИСХОДНАЯ таблица будет
// складываться при вводе
// и доставаться при генерации
vvod(x);
generate(x, [2, 3, 1]); генерация по одному правилу
generate(x, [2,1]); // по следующему
generate(x, [1,2,4]); // и т.д.
procedure vvod(var m: TND_mas);
begin
// собственно заполняем КАК-то наш НД
SetLength(m, 4);// сколько нам надо ВСЕГО колонок
...
SetLength(m[1], 5); // КАКОЙ длины будет ДАННАЯ колонка
...
SetLength(m[x], 10);
end;
procedure generate( m: TND_mas; // из чего генерировать
myRule: array of integer // и как (правило)
);
var
cj: array of integer; //ИНДЕКСЫ используемых строк ДЛЯ каждого слова в правиле
begin
for j:=low(myrule) --от НАЧАЛЬНОГО в списке(массиве)
to high(myrule) --до ПОСЛЕДНЕГО в нем же
do
begin
r:=myrule[j]; //ну какую колонку ставим на j место
cj[j]:=low(m[r]); //ее НАЧАЛЬНЫЙ индекс
end;
flag:=true;
while flag begin// итак индексы готовы будем НАБИРАТЬ строку
repeat //но может быть и ТАК
s:='';
for j:=low(cj) to high(cj) do begin
// чтобы НЕ ПУТАТЬСЯ в индексах делаем "мелкие-мелкие" шажки
// и попутно "проговариваем" чего ХОТИМ добиться
r:=myrule[j];//нужный индекс
с:=m[r];// и нужная колонка
rj:=cj[j]; //ИНДЕКС нужного слова в нужной колонке
rs:=c[rj]; //и НАКОНЕЦ нужное слово
s:=s+ rs; // добавим это слово
end;
// слово ПРЕДЛОЖЕНИЕ готово!!!!
.... // что-то с ним сделали
// готовим НОВЫЕ индексЫ
for j:=high(cj) downto low(cj) do begin //должны увеличить ПОСЛЕДНИЙ ...
r:=myrule[j];
c:=m[r];
if cj[j]<high(c) then begin //... НЕ достигший СВОЕГО максимума
cj[j]:=cj[j]+1;
break;// и на этом ЗАКОНЧИТЬ изменения индексов
end
else // если же мы дошли до конца(максимального индекса)
cj[j]:=low(c);//вернемся к НАЧАЛУ
end; // и перейдем к предыдущему
// индексы готовы начнем( или уже все?)
// КАК нам узнать что мы дошли до конца(перебрали ВСЕ индексы)
// можно просто проверить ВСЕ(или НЕ все) индексы, а на что ...
// ОСТАВЛЯЮ как Д(омашнее) З(адание)
end; // если вначале был while
until; //если вначале был repeat
end;
А разберешься?
const r: array[1..3, 1..3] of Integer = ((2,3,1),(2,1,0),(1,2,4)); //правила
p: array[1..5, 1..4] of String = (('стол','собрать','красный','пластмассовый'),
('стул','настроить','синий','керамический'),
('лампа','починить','белый','деревянный'),
('диван','','','бумажный'),
('кровать','','','гипсовый'));
procedure TForm1.Button1Click(Sender: TObject);
var i,j,k: Integer;
procedure Rec(Text: String; i1,j1,Maxj: Integer);
var ti,tn: Integer;
s: String;
begin
for ti:=Low(p) to High(p) do begin
if p[ti,r[i1,j1]]='' then Exit;
s:=Text+p[ti,r[i1,j1]]+' ';
if j1=Maxj then Memo1.Lines.Add(s)
else Rec(s,i1,j1+1,Maxj);
end;
end;
begin
for i:=Low(r) to High(r) do begin
k:=-1;
for j:=Low(r) to High(r) do if r=0 then Break else k:=j;
if k<>-1 then Rec('',i,Low(r),k);
Memo1.Lines.Add('');
end;
end;
Вот еще, стихи сочиняет
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
const
NN=9;
MOI:array[0..NN]of string = ('мой','твой','наш','ваш','не','весь','как','так','зря','что');
DADA:array[0..NN]of string = ('дядя','Федя','гоблин','заяц','бубен','дятел','корень','голос','запах','череп');
SAMYH:array[0..NN]of string = ('самых','всяких','лучших','ближних','бедных','потных','гадких','знойных','теплых','милых');
CHESTNYH:array[0..NN]of string = ('честных','робких','зыбких','мокрых','толстых','тонких','вредных','крайних','толстых','скользких');
PRAVIL:array[0..NN]of string = ('правил','чисел','чресел','славил','красил','портил','метил','кресел','гробил','бросил');
KOGDA:array[0..NN]of string = ('когда','всегда','тогда','куда','сюда','ну, да','вот так','не так','вокруг','почти');
NE_V_SHU:array[0..NN]of string = ('не в шутку','внезапно','немного','приятно','ужасно','противно','душевно','по правде','как будто','истошно');
ZANEMOG:array[0..NN]of string = ('заболел','захотел','переел','утонул','отошел','почесал','закричал','вожделел','убежал','написал');
ON_UVA:array[0..NN]of string = ('он уважать','всех обижать','не понимать','не отставать','и почесать','так не видать','здесь не стоять','вам не понять','всех не унять','хотел обнять');
SEBYA_ZAS:array[0..NN]of string = ('себя заставил','его направил','меня поставил','её оставил','почти без правил','хоть не прибавил','ему не дали','меня не стали','её достали','уже устали');
I_LUCHE:array[0..NN]of string = ('и лучше','не хуже','всё ближе','так всё же','да, толше','и глубже','пусть ниже','нет, тише','зачем-же','прости же');
VYDU_NE_MOG:array[0..NN]of string = ('выдумать не смел','он бы поимел','ей не объяснял','так не уповал','лишь бы не упал','видеть не желал','брать не запрещал','всюду защищал','всех не посчитал','близко не лежал');
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Clear;
Memo1.Lines.Add(MOI[Random(NN+1)]+' '+DADA[Random(NN+1)]+' '+SAMYH[Random(NN+1)]+' '+CHESTNYH[Random(NN+1)]
+' '+PRAVIL[Random(NN+1)]);
Memo1.Lines.Add(KOGDA[Random(NN+1)]+' '+NE_V_SHU[Random(NN+1)]+' '+ZANEMOG[Random(NN+1)]);
Memo1.Lines.Add(ON_UVA[Random(NN+1)]+' '+SEBYA_ZAS[Random(NN+1)]);
Memo1.Lines.Add(I_LUCHE[Random(NN+1)]+' '+VYDU_NE_MOG[Random(NN+1)]);
end;
initialization
Randomize;
end.
Случайные статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)