|
Вопрос # 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™ (статус: Доктор наук), 21 октября 2011, 15:02 [#1]:
А ты представь, что твои буквы - это цифры. И делай поразрядный инкремент разрядов справа налево, а при переполнении очередного "разряда", "обнуляй его" и инкрементируй след. "разряд". И так до тех пор, пока значение всего "счётчика" не станет равно начальному значению.
Я бы смог набросать такую функцию, но ты сам сказал, что не надо.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Пупкин В В (статус: 2-ой класс), 21 октября 2011, 15:44 [#2]:
вот это загнул, мало что понял (
|
|
min@y™ (статус: Доктор наук), 21 октября 2011, 15:58 [#3]:
Цитата (Пупкин В В):
вот это загнул, мало что понял
Ну извини, объяснил, как мог.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Пупкин В В (статус: 2-ой класс), 21 октября 2011, 16:09 [#4]:
Я так понимаю в комбинаторике это называется размещение с повторением. А вот алгаритм поиска всех элементов не найду (
|
|
min@y™ (статус: Доктор наук), 21 октября 2011, 18:05 [#5]:
Цитата (Пупкин В В):
А вот алгаритм поиска всех элементов не найду (
Чо, придумать алгоритм - мозгов не хватает? Я ж его тебе написал! А, ну да, конечно, в эпоху интернета думать и не надо, надо уметь НАЙТИ ГОТОВОЕ РЕШЕНИЕ.
Правильно, так держать! Конкуренты мне нахрен не нужны. Добро пожаловать в менеджеры, мерчандайзеры, хаускиперы, стритклинеры, каргомуверы и пр. А мозги можно сдать по программе "доноры против интеллекта".
Спасибо. Такие спецы тоже нужны. Особенно партии Е**ная Россия.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 23 октября 2011, 12:57 [#6]:
Кстати, никакой рекурсии. Всё оказалось даже проще, чем я думал.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
bugmenot (статус: 3-ий класс), 23 октября 2011, 13:37 [#7]:
Это всё проще делается, последний элемент инкрементируется, если возник перенос, то сполоснуть и повторить для последнего-1 элемента
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
min@y™ (статус: Доктор наук), 23 октября 2011, 13:50 [#8]:
Цитата (bugmenot):
Это всё проще делается, последний элемент инкрементируется, если возник перенос, то сполоснуть и повторить для последнего-1 элемента
Ты мой код смотрел? В нём всё так и делается.
Код, конечно, на идеальность и оптимальность не претендует. Если хочешь, напиши более короткий и быстрый вариант. И покажи.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 24 октября 2011, 17:00 [#9]:
Цитата (Пупкин В В):
хотя хамить не обязательно. человек ведь потому и спрашивает что мазгов своих не хватает.
А не надо провоцировать. Если не хватает мозгов, и ты хочешь, чтобы тебе помогли спецы, так и говори: "Сделайте мне лабу, я заплачу X денег (или выставлю Y литров пива)".
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Пупкин В В (статус: 2-ой класс), 26 октября 2011, 12:35 [#10]:
тебе на портал фриланса тогда. и это не либа совсем. для того сайт и создан чтоб люди которые не могут чегот догнать смогли задать свой вопрос и получить ответ. а за бабки есть и покруче спецы чем вы - минай.
|
|
min@y™ (статус: Доктор наук), 26 октября 2011, 13:38 [#11]:
Цитата (Пупкин В В):
тебе на портал фриланса тогда
Зачем? Я и так неплохо зарабатываю.
Цитата (Пупкин В В):
и это не либа совсем.
А что такое "либа"? Библиотека (LIB)?
Цитата (Пупкин В В):
для того сайт и создан чтоб люди которые не могут чегот догнать смогли задать свой вопрос и получить ответ.
Ты задал свой вопрос:
Цитата (Пупкин В В):
Я не прошу кого то делать работу за себя, мне не лень. Просто у меня взрыв мозга.
Я тебе ответил, причём неплохо разжевав алгоритм:
Цитата (min@y™):
А ты представь, что твои буквы - это цифры. И делай поразрядный инкремент разрядов справа налево, а при переполнении очередного "разряда", "обнуляй его" и инкрементируй след. "разряд". И так до тех пор, пока значение всего "счётчика" не станет равно начальному значению.
А ты что мне вместо спасиба сказал, а?
Цитата (Пупкин В В):
вот это загнул, мало что понял (
Ты, хоть, вкуриваешь, что если тебе объяснили, но ты не понял, то это исключительно ТВОИ проблемы? Тебе тут никто ничего не должен.
Тогда я написал и отладил тебе готовую программу, чтобы ты глянул в исходник и понял, как работает алгоритм, но ты опять недоволен:
Цитата (min@y™):
хотя хамить не обязательно. человек ведь потому и спрашивает что мазгов своих не хватает.
И это опять вместо спасиба.
Ну и кто из нас хамит? Я ответил на ТВОЙ вопрос и выполнил ТВОЮ задачу. А что сделал ты, кроме как признался в своей мозговой импотенции и полил меня говном вместо благодарности?
Цитата (Пупкин В В):
а за бабки есть и покруче спецы чем вы - минай.
Даже не сомневаюсь, причём, чем круче, тем больше денег им придётся заплатить за одну и ту же работу. В седующий раз к этим спецам и обращайся. Я же сделал тебе всё бесплатно, не смотря на наезды и тупизну.
З.Ы. И не надо учить меня жить.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Пупкин В В (статус: 2-ой класс), 26 октября 2011, 14:16 [#12]:
не знал что вы настолько обыдчивы )
на вопрос что я сделал: попытался решить все с нуля, не имея понятия о комбинаторике, размещениях и т.д. используя обычную логику (заново придумывая велосипед). Получилась прога которая вродь работала, но можно было указывать только большее или равное количество символов в слове. Но меньше никак, разбираясь в логике написаного мной подумалось, что есть более простое и т.д. решение. Переделывая свой алгаритм настал взрыв мозга т.к. использовал рекурсию и кучу циклов. Потом задал вопрос. Во время этого откопал что это комбинаторика и размещения. В конце концов нашел хорошую доку где доходчиво объяснено как решается данная задача. Смысл в нахождении следующего по предыдущему. А вы увы изложили все настолько запутано, что мало ктоб понял только тот кто знает уже ))) Итак информация должна быть релевантна и нужно уметь объяснять. В качестве спасибо поставил вам пять. И говорю - спасибо. ))) раз еще сказать надо. А указал вам на хамство т.к. ваши рассуждения о безмозглости и вашей гениальности неактуальны. Ничего сверх гениального нет в этой задаче, но и не настолько она проста для решения.
|
|
min@y™ (статус: Доктор наук), 26 октября 2011, 14:36 [#13]:
Цитата (Пупкин В В):
Итак информация должна быть релевантна и нужно уметь объяснять.
Ну как объяснить тов. прапорщику, что такое переменный ток? Провода длинные и прямые, а ток - это синусоида на графике...
Люди все разные, я под каждого подстраиваться не собираюсь. Мне проще написать готовую программу, чем объяснять, как она работает, т.к. в первом случае текста будет в разы больше, а толку - с комариный хрен (проходили уже неоднократно), и всё равно придётся писать программу.
Я, хотя бы, попытался, а мог и мимо пройти. Заметь, кстати, сколько на сайте экспертов и сколько из них влезло в обсуждение твоего вопроса. И не забывай, что тут на вопросы отвечают не роботы, а живые люди, у которых тоже есть эмоции. Повторяю: не хочешь негатива - не провоцируй.
Цитата (Пупкин В В):
А указал вам на хамство т.к. ваши рассуждения о безмозглости и вашей гениальности неактуальны.
Хамство не есть неактуальные рассуждения о чём-либо. А про чью-то гениальность я вообще не говорил ничего.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Пупкин В В (статус: 2-ой класс), 26 октября 2011, 14:56 [#14]:
Думаю задача была действительно сложновата, потому то эксперты не особо отвечают. На нее не отмахаешься фразой типа - используй функцию ... бла, бла + пример из инета. Потратил на поиски достаточно времени, решения в интернете по крайней мере на поверхности нет. А тут 80% экспертов, аля я хорошо умею гуглить. А так конечно понятно что никто никому ниче не должен. Я просто задал вопрос, что подразумивает ответ и все, без всяких там лирических отступлений - типа да вы все тупые и т.д. Еслиб никто не ответил, я б не обиделся. Все равно рано или поздно сам решил. Вы просто сократили время потраченое на это. Вот за это и спасибо. А терь вопрос закрыт.
|
|
bugmenot (статус: 3-ий класс), 26 октября 2011, 17:28 [#15]:
Цитата (Пупкин В В):
задача была действительно сложновата
Элементарщина, достаточно подумать головой. В простейшей реализации - k вложенных циклов по n итераций каждый.
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|