Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.09.2018, 10:43   #1
Astrola
Пользователь
 
Регистрация: 04.09.2018
Сообщений: 16
По умолчанию Генератор вариаций слов

Здравствуйте.
Требуется помощь со стороны, сам никак не могу разобраться.

Есть список с набором заданий (построчно перечислен список столбцов для выборки из таблицы) и таблица из которой нужно извлекать данные по указанным столбцам после перемешивая между собой данные генерируя макс. количество слов.

Количество столбцов в таблице и в списке заданий может меняться пользователем.

Запутался в циклах совсем, получается сгенерировать только 1 раз для конкретной строки, после чего цикл идет дальше а вернуть еще раз генерацию для слова не могу, да и количество слов в каждом столбце разное, немного сбивает с толку.

Помогите разобраться как это всё можно реализовать. Спасибо за внимание.
Изображения
Тип файла: jpg data.jpg (42.7 Кб, 228 просмотров)
Astrola вне форума Ответить с цитированием
Старый 04.09.2018, 11:11   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,534
По умолчанию

По моему, ТС неясно представляет себе понятие "слово". На мою думку, ему из заданных слов надо сгенерировать предложения или как еще?
digitalis вне форума Ответить с цитированием
Старый 04.09.2018, 11:22   #3
Astrola
Пользователь
 
Регистрация: 04.09.2018
Сообщений: 16
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
По моему, ТС неясно представляет себе понятие "слово". На мою думку, ему из заданных слов надо сгенерировать предложения или как еще?
К примеру: берем 1 значение из набора правил - 2 3 1 и генерируем для него максимум вариаций:
1) собрать красный стол
2) собрать синий стол
3) собрать белый стол
4) собрать красный стул
5) собрать синий стул
6) собрать белый стул
7) ...
вместо слова можно использовать термин ячейка таблицы, если так удобней.
цифры в наборе правил - это номера столбцов для выборки в таблице.
Astrola вне форума Ответить с цитированием
Старый 04.09.2018, 11:35   #4
Astrola
Пользователь
 
Регистрация: 04.09.2018
Сообщений: 16
По умолчанию

да, нужно собрать из слов строку
Astrola вне форума Ответить с цитированием
Старый 04.09.2018, 11:58   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

максимальное число будет если
мы используем для построения ПРЕДЛОЖЕНИЙ ВСЕ такие индексы
Код:
  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;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 04.09.2018 в 12:01.
evg_m на форуме Ответить с цитированием
Старый 04.09.2018, 12:11   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А разберешься?
Код:
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[i]) to High(r[i]) do if r[i,j]=0 then Break else k:=j;
    if k<>-1 then Rec('',i,Low(r[i]),k);
    Memo1.Lines.Add('');
  end;
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 04.09.2018 в 12:14.
Аватар вне форума Ответить с цитированием
Старый 04.09.2018, 14:39   #7
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,534
По умолчанию

Но ведь нужно предусмотреть и переменное число столбцов (и, полагаю, слов в каждом столбце)
digitalis вне форума Ответить с цитированием
Старый 04.09.2018, 14:42   #8
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,538
По умолчанию

Вот еще, стихи сочиняет
Код:
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.
type_Oleg вне форума Ответить с цитированием
Старый 04.09.2018, 14:47   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Но ведь нужно предусмотреть и переменное число столбцов (и, полагаю, слов в каждом столбце)
А какие проблемы? Вместо массивов констант динамические массивы или стриггриды, да мало ли чего. А сам код практически и не привязан к размерности массивов
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 04.09.2018, 16:01   #10
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,534
По умолчанию

Цитата:
Сообщение от type_Oleg Посмотреть сообщение
Вот еще, стихи сочиняет
О.Бендеру бы такую прогу - продал бы за приличные бабки Ухудшанскому в поезде на Восточную магистраль
digitalis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перебор вариаций в двомерном масиве KotKod Microsoft Office Excel 3 20.02.2016 09:33
Генератор слов на кириллице Fedaykin Фриланс 2 09.11.2013 18:30
генератор слов Delphi7 -Jack- Общие вопросы Delphi 10 29.06.2012 19:55
Генератор слов!создание вопросы . kzmd Общие вопросы Delphi 15 16.10.2010 20:04
Генератор слов - что к чему? Ramal Общие вопросы Delphi 8 16.07.2009 01:11