Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 685

/ вопрос открыт /

Здравствуйте!
Задача в следующем:
Написать процедуру (функцию), которая на входе получает: 1. массив символов 2. длину слова. На выходе стринглист в котором ВСЕ слова со всеми возможными комбинациями из этих символов с заданой длиной слова. В слове может быть повторение одного и тогоже символа, слово может состоять только из конкретного символа.
Например у нас 3и символа A,B,C длина слова из 4х имеем варианты
AAAA
AAAB
ABAC
CCCC
CCCB
и т.д.
или те же символы но слово из 2х символов
AA
AB
AC
BB
CC
CA
BA
и т.д.
Я не прошу кого то делать работу за себя, мне не лень. Просто у меня взрыв мозга. Написал я рекурсивную процедуру, но она все время работает как то неправильно. Вернее алгаритм получился настолько запутаным что чтоб его распутывать нужно писать все наново. Поэтому ее код не привожу. Может я изначально избрал неправильную логику алгаритма. Кому интересно поломать голову помогите. )

Пупкин В В Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Пупкин В В (статус: 2-ой класс)
Вопрос отправлен: 21 октября 2011, 14:55
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

А ну-ка на-ка, зацени-ка!

program p5685a;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils, Classes, Math, Types;
 
// целевая функция. возвращает кол-во вариантов (на всякий случай)
function GetVariants(const Symbols: string;       // строка символов, из которых составлять комбинации
                     const Len: Integer;          // длина выходной строки
                     Lines: TStrings): Cardinal;  // список, куда засовывать варианты
var
  S: string;
  Index, i, Range: Integer;
  Indexes: TByteDynArray; // счётчик
begin
  Result:= 0;
  Range:= Length(Symbols);
  Lines.Clear();
 
  if (Range = 0) or (Len < 1)
    then Exit;
 
  Lines.BeginUpdate();
  try
    Result:= Round(IntPower(Range, Len)); // количество вариантов: (кол-во символов)^(длина выходной строки)
 
    SetLength(S, Len);
    SetLength(Indexes, Len);
    FillChar(Indexes[0], Len, 0); // начальное значение счётчика 0, 0, ..., 0
 
    for Index:= 0 to Result - 1 do // ...и понеслась!
      begin
        // формирую строку по номерам символов
        for i:= 0 to Len - 1 do
          S[Len - i]:= Symbols[Indexes[i] + 1];
 
        // добавляю строку с список
        Lines.Add(S);
 
        // инкремент массива индексов
        i:= 0;
        while i < Len do
          begin
           if Indexes[i] < Range - 1
             then begin
                    Inc(Indexes[i]);
                    Break;
                  end
             else Indexes[i]:= 0;
 
           Inc(i);
         end; // while
      end; // for
  finally
    Lines.EndUpdate();
  end;
end;
 
const
  //Symbols = '0123456789ABCDEF';
  Symbols = 'ABCD';
  Len = 4;
 
var
  Lines: TStrings;
  Index: Integer;
 
begin
  Lines:= TStringList.Create();
  try
    if GetVariants(Symbols, Len, Lines) <> 0
      then begin
             WriteLn('  Total: ', Lines.Count);
             for Index:= 0 to Lines.Count - 1 do
               WriteLn(Index + 1: 5, ': ', Lines[Index]);
           end;
  finally
    Lines.Free();
  end;
 
  ReadLn;
end.

Проверил, всё работает. Обдумывал, тыкал клаву и отлаживал примерно 2 часа.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 23 октября 2011, 12:52
Оценка за ответ: 5

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

Мини-форум вопроса

Всего сообщений: 15; последнее сообщение — 26 октября 2011, 17:28; участников в обсуждении: 3.
min@y™

min@y™ (статус: Доктор наук), 21 октября 2011, 15:02 [#1]:

А ты представь, что твои буквы - это цифры. И делай поразрядный инкремент разрядов справа налево, а при переполнении очередного "разряда", "обнуляй его" и инкрементируй след. "разряд". И так до тех пор, пока значение всего "счётчика" не станет равно начальному значению.

Я бы смог набросать такую функцию, но ты сам сказал, что не надо.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Пупкин В В

Пупкин В В (статус: 2-ой класс), 21 октября 2011, 15:44 [#2]:

вот это загнул, мало что понял (
min@y™

min@y™ (статус: Доктор наук), 21 октября 2011, 15:58 [#3]:

Цитата (Пупкин В В):

вот это загнул, мало что понял

Ну извини, объяснил, как мог. :)
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Пупкин В В

Пупкин В В (статус: 2-ой класс), 21 октября 2011, 16:09 [#4]:

Я так понимаю в комбинаторике это называется размещение с повторением. А вот алгаритм поиска всех элементов не найду (
min@y™

min@y™ (статус: Доктор наук), 21 октября 2011, 18:05 [#5]:

Цитата (Пупкин В В):

А вот алгаритм поиска всех элементов не найду (

Чо, придумать алгоритм - мозгов не хватает? Я ж его тебе написал! А, ну да, конечно, в эпоху интернета думать и не надо, надо уметь НАЙТИ ГОТОВОЕ РЕШЕНИЕ.

Правильно, так держать! Конкуренты мне нахрен не нужны. Добро пожаловать в менеджеры, мерчандайзеры, хаускиперы, стритклинеры, каргомуверы и пр. А мозги можно сдать по программе "доноры против интеллекта".

Спасибо. Такие спецы тоже нужны. Особенно партии Е**ная Россия.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 23 октября 2011, 12:57 [#6]:

Кстати, никакой рекурсии. Всё оказалось даже проще, чем я думал.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
bugmenot

bugmenot (статус: 3-ий класс), 23 октября 2011, 13:37 [#7]:

Это всё проще делается, последний элемент инкрементируется, если возник перенос, то сполоснуть и повторить для последнего-1 элемента
виконання програми розпочинається з того самого мiсця, де призупинилося.

min@y™

min@y™ (статус: Доктор наук), 23 октября 2011, 13:50 [#8]:

Цитата (bugmenot):

Это всё проще делается, последний элемент инкрементируется, если возник перенос, то сполоснуть и повторить для последнего-1 элемента

Ты мой код смотрел? В нём всё так и делается.
Код, конечно, на идеальность и оптимальность не претендует. Если хочешь, напиши более короткий и быстрый вариант. И покажи.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 24 октября 2011, 17:00 [#9]:

Цитата (Пупкин В В):

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

А не надо провоцировать. Если не хватает мозгов, и ты хочешь, чтобы тебе помогли спецы, так и говори: "Сделайте мне лабу, я заплачу X денег (или выставлю Y литров пива)".
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Пупкин В В

Пупкин В В (статус: 2-ой класс), 26 октября 2011, 12:35 [#10]:

тебе на портал фриланса тогда. и это не либа совсем. для того сайт и создан чтоб люди которые не могут чегот догнать смогли задать свой вопрос и получить ответ. а за бабки есть и покруче спецы чем вы - минай.
min@y™

min@y™ (статус: Доктор наук), 26 октября 2011, 13:38 [#11]:

Цитата (Пупкин В В):

тебе на портал фриланса тогда

Зачем? Я и так неплохо зарабатываю.

Цитата (Пупкин В В):

и это не либа совсем.

А что такое "либа"? Библиотека (LIB)?

Цитата (Пупкин В В):

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

Ты задал свой вопрос:

Цитата (Пупкин В В):

Я не прошу кого то делать работу за себя, мне не лень. Просто у меня взрыв мозга.

Я тебе ответил, причём неплохо разжевав алгоритм:

Цитата (min@y™):

А ты представь, что твои буквы - это цифры. И делай поразрядный инкремент разрядов справа налево, а при переполнении очередного "разряда", "обнуляй его" и инкрементируй след. "разряд". И так до тех пор, пока значение всего "счётчика" не станет равно начальному значению.

А ты что мне вместо спасиба сказал, а?

Цитата (Пупкин В В):

вот это загнул, мало что понял (

Ты, хоть, вкуриваешь, что если тебе объяснили, но ты не понял, то это исключительно ТВОИ проблемы? Тебе тут никто ничего не должен.

Тогда я написал и отладил тебе готовую программу, чтобы ты глянул в исходник и понял, как работает алгоритм, но ты опять недоволен:

Цитата (min@y™):

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

И это опять вместо спасиба.

Ну и кто из нас хамит? Я ответил на ТВОЙ вопрос и выполнил ТВОЮ задачу. А что сделал ты, кроме как признался в своей мозговой импотенции и полил меня говном вместо благодарности?

Цитата (Пупкин В В):

а за бабки есть и покруче спецы чем вы - минай.

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

З.Ы. И не надо учить меня жить.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Пупкин В В

Пупкин В В (статус: 2-ой класс), 26 октября 2011, 14:16 [#12]:

не знал что вы настолько обыдчивы )
на вопрос что я сделал: попытался решить все с нуля, не имея понятия о комбинаторике, размещениях и т.д. используя обычную логику (заново придумывая велосипед). Получилась прога которая вродь работала, но можно было указывать только большее или равное количество символов в слове. Но меньше никак, разбираясь в логике написаного мной подумалось, что есть более простое и т.д. решение. Переделывая свой алгаритм настал взрыв мозга т.к. использовал рекурсию и кучу циклов. Потом задал вопрос. Во время этого откопал что это комбинаторика и размещения. В конце концов нашел хорошую доку где доходчиво объяснено как решается данная задача. Смысл в нахождении следующего по предыдущему. А вы увы изложили все настолько запутано, что мало ктоб понял только тот кто знает уже ))) Итак информация должна быть релевантна и нужно уметь объяснять. В качестве спасибо поставил вам пять. И говорю - спасибо. ))) раз еще сказать надо. А указал вам на хамство т.к. ваши рассуждения о безмозглости и вашей гениальности неактуальны. Ничего сверх гениального нет в этой задаче, но и не настолько она проста для решения.
min@y™

min@y™ (статус: Доктор наук), 26 октября 2011, 14:36 [#13]:

Цитата (Пупкин В В):

Итак информация должна быть релевантна и нужно уметь объяснять.

Ну как объяснить тов. прапорщику, что такое переменный ток? Провода длинные и прямые, а ток - это синусоида на графике...
Люди все разные, я под каждого подстраиваться не собираюсь. Мне проще написать готовую программу, чем объяснять, как она работает, т.к. в первом случае текста будет в разы больше, а толку - с комариный хрен (проходили уже неоднократно), и всё равно придётся писать программу.
Я, хотя бы, попытался, а мог и мимо пройти. Заметь, кстати, сколько на сайте экспертов и сколько из них влезло в обсуждение твоего вопроса. И не забывай, что тут на вопросы отвечают не роботы, а живые люди, у которых тоже есть эмоции. Повторяю: не хочешь негатива - не провоцируй.

Цитата (Пупкин В В):

А указал вам на хамство т.к. ваши рассуждения о безмозглости и вашей гениальности неактуальны.

Хамство не есть неактуальные рассуждения о чём-либо. А про чью-то гениальность я вообще не говорил ничего.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Пупкин В В

Пупкин В В (статус: 2-ой класс), 26 октября 2011, 14:56 [#14]:

Думаю задача была действительно сложновата, потому то эксперты не особо отвечают. На нее не отмахаешься фразой типа - используй функцию ... бла, бла + пример из инета. Потратил на поиски достаточно времени, решения в интернете по крайней мере на поверхности нет. А тут 80% экспертов, аля я хорошо умею гуглить. А так конечно понятно что никто никому ниче не должен. Я просто задал вопрос, что подразумивает ответ и все, без всяких там лирических отступлений - типа да вы все тупые и т.д. Еслиб никто не ответил, я б не обиделся. Все равно рано или поздно сам решил. Вы просто сократили время потраченое на это. Вот за это и спасибо. А терь вопрос закрыт.
bugmenot

bugmenot (статус: 3-ий класс), 26 октября 2011, 17:28 [#15]:

Цитата (Пупкин В В):

задача была действительно сложновата

Элементарщина, достаточно подумать головой. В простейшей реализации - k вложенных циклов по n итераций каждый.
виконання програми розпочинається з того самого мiсця, де призупинилося.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:25
Выполнено за 0.03 сек.