Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » *Решено* | Задача по комбинаторике. Генератор комбинаций

Ответить
Настройки темы
*Решено* | Задача по комбинаторике. Генератор комбинаций

Аватара для Surround

Ветеран


Сообщения: 908
Благодарности: 20

Профиль | Отправить PM | Цитировать


Народ, может кто подкинет идею, как конструктивно сделать код, генерирующий все возможные комбинации какого-дибо набора символов.

Отправлено: 23:16, 14-01-2005

 

Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


Surround
Мало данных для анализа, как говоривает кое-кто из моих знакомых

И не говорите так: "конструктивно сделать код". Очень коряво звучит. Это относительно новое слово-паразит, "конструктивно". Ещё недавно было "концептуально". Перорально, млин.

Отправлено: 00:25, 15-01-2005 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для Surround

Ветеран


Сообщения: 908
Благодарности: 20

Профиль | Отправить PM | Цитировать


hasherfrog
извиняюсь, я имел в виду, чтобы код был не грузный и не отнимал большое количество ресурсов на перебор
есть набор символов, скажем A и B. Нужно составить, например, все возможные 6-символьные комбинации из этих знаков, причем, чтобы ни одни подряд более 3х раз не повторялся.

Последний раз редактировалось Surround, 15-01-2005 в 07:23.


Отправлено: 06:53, 15-01-2005 | #3


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


hasherfrog
Цитата hasherfrog:
Мало данных для анализа, как говоривает кое-кто из моих знакомых
Уж точно не я, данных вполне достаточно

Surround
Цитата Surround:
есть набор символов, скажем A и B. Нужно составить, например, все возможные 6-символьные комбинации из этих знаков, причем, чтобы ни одни подряд более 3х раз не повторялся.
Заметьте, что это простейшая задача по двоичной арифметике, с ней возиться как минимум не интересно. Рассмотрите такой вариант:
Код: Выделить весь код
program Project1; {by Savant}

{$APPTYPE CONSOLE}

uses
  SysUtils, Classes;

const
  js = 2; { Кол-во различных символов }
  jp = 3; { Максимально допустимое кол-во повторяющихся символов}
  jm = 6; { Кол-во символов в строке }
  a: array[1..js] of Char = ('A','B');
var
  i: Integer; { ИМХО byte/shortint не рекомендую использовать, при вычислениях он приводится к Cardinal/Integer }
  b: array[1..jm] of Char;
  res: TStrings;
function passed: Boolean;
{ Проверяет текущее значение b на допустимость по кол-ву повторений }
var
  x,y: Integer;
  c: array[1..jp+1] of Char;
begin
  Result:=True;
  for x:=1 to js do begin
    for y:=1 to jp+1 do c[y]:=a[x];
    if Pos(c,b) <> 0 then Result:=False;
  end;
end;
procedure moving(k,j: Integer);
var
  i: Integer;
begin
  for i:=j to js do begin
    b[k]:=a[i];
    if passed then
      if res.IndexOf(b)=-1 then res.Add(b);
    if k > 1 then moving(k-1,1);
  end;
end;
begin
  res:=TStringList.Create;
  try
    for i:=1 to jm do b[i]:=a[1];
    for i:=1 to jm do moving(i,2);
    for i:=0 to res.Count-1 do WriteLn(res.Strings[i]);
  finally
    res.Free;
  end;
  ReadLn;
end.
Как видите, он более универсальный. По умолчанию настроен на решение Вашей задачи. И вроде как даже работает . Вот что мне программа выдала после выполнения. Если результат неверен, предупреждайте сразу, я покопаюсь в коде:
BBBAAA
BABAAA
AABAAA
ABBAAA
BBABAA
BAABAA
AAABAA
ABABAA
BABBAA
AABBAA
ABBBAA
BBBABA
BBAABA
BAAABA
ABAABA
BABABA
AABABA
ABBABA
BBABBA
BAABBA
AAABBA
ABABBA
BABBBA
AABBBA
BBBAAB
BBAAAB
ABAAAB
BABAAB
AABAAB
ABBAAB
BBABAB
BAABAB
AAABAB
ABABAB
BABBAB
AABBAB
ABBBAB
BBBABB
BBAABB
BAAABB
ABAABB
BABABB
AABABB
ABBABB
BBABBB
BAABBB
AAABBB
ABABBB

p.s.: я тут несколько по геморному скопировал код, если чо не компилится, сообщайте.

Отправлено: 15:35, 15-01-2005 | #4


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


Savant
>> Уж точно не я, данных вполне достаточно
Ну-ну Условие "что бы каждый символ не повторялся бы более 3-х раз" Вы, очевидно, прочитали в голове Surround с помощью телепатии?

И решение, похоже, неверное. Вариант решения (уже 2, 3-й по порядку) - не удовлетворяет вышеупомянутому условию.

Отправлено: 16:36, 15-01-2005 | #5


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


hasherfrog
Не повторялся бы подряд более трёх раз!

Отправлено: 16:39, 15-01-2005 | #6


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


Savant
Да, действительно Ну что ж, поздравляю с победой

Отправлено: 17:06, 15-01-2005 | #7


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


hasherfrog

Победой в чём? Подожди поздравлять, вот когда явится Surround, посмотрит на всё ЭТО, и не скажет "полный отстой", тогда можешь поздравить

Отправлено: 17:14, 15-01-2005 | #8


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


Кстати, задачи, где речь идёт о комбинациях из 2-х символов. можно решать и по-другому

Нетрудно заметить, что общее количество комбинаций в данном случае (без дополнительного условия о 3-х) описывается двоичными числами от 0 до 2**6, т.е. символ==бит. И остается только проверить все числа от 0 до 63 на это самое условие...


Отправлено: 17:15, 15-01-2005 | #9


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


hasherfrog
Цитата:
Кстати, задачи, где речь идёт о комбинациях из 2-х символов. можно решать и по-другому

Нетрудно заметить, что общее количество комбинаций в данном случае (без дополнительного условия о 3-х) описывается двоичными числами от 0 до 2**6, т.е. символ==бит. И остается только проверить все числа от 0 до 63 на это самое условие...
Я это знаю, поэтому специально перед своей прогой сделал небольшой заголовок:
Цитата Savant:
Заметьте, что это простейшая задача по двоичной арифметике, с ней возиться как минимум не интересно.
Ух нафлудили....

Отправлено: 17:18, 15-01-2005 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » *Решено* | Задача по комбинаторике. Генератор комбинаций

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Интернет - Генератор кодов ссылок? Yez Программное обеспечение Windows 0 26-05-2009 18:12
Log/Monitoring - генератор пакетов Busla Сетевые технологии 2 25-04-2009 10:58
[решено] Генерация комбинаций morgan1991 AutoIt 13 29-01-2009 23:33
Генератор случайных чисел Murrey Хочу все знать 3 22-08-2006 13:00
генератор кода Trojn Мобильные ОС, смартфоны и планшеты 5 04-04-2004 04:06




 
Переход