Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.14;
Скачать: CL | DM;

Вниз

Задачка для мастеров   Найти похожие ветки 

 
Ahmad K ©   (2003-06-28 07:54) [0]

Задачка для мастеров.
Небольшая задача для мастеров. Зададим допустим в Edit1 слово состоящее из 4-8 букв, например: ДЕЛФИ, теперь надо чтобы в ListBox1 появились все вариации перестановок букв в этом слове, например: ФИДЕЛ, ЛЕДИФ и т.д.
Ну, слабо?


 
zzet ©   (2003-06-28 08:05) [1]

Слабо.. А мож че полегче придумаешь?


 
MBo ©   (2003-06-28 08:11) [2]

... ясливарпу йогурд-цясем аз от ,иисрукер или халкиц о ланз отк ыб илсЕ (; шиниф йынлоп ,онченок ,ачадаЗ


 
Юрий Зотов ©   (2003-06-28 09:10) [3]

> Ahmad K © (28.06.03 07:54)

Ох, и правда трудная задача. Представляете - целых 5 минут пришлось по клавишам стучать. Правда, решил все-таки. Но код не приведу. Потому что задачку-то эту задали Вам, а не форуму.


 
sergey2   (2003-06-28 09:14) [4]

(: .ьтавишарпс емуроф ан олыб онжун йен о отч ,огокат ,ечадаз йотэ в огонжолс огечин ужив еН.


 
Ahmad K ©   (2003-06-28 11:09) [5]


> ... ясливарпу йогурд-цясем аз от ,иисрукер или халкиц о
> ланз отк ыб илсЕ (; шиниф йынлоп ,онченок ,ачадаЗ

я просил писать не задом на перед а просто переставлять буквы в словах. В циклах и рекурсии я мало смыслю честно сказать, про рекурсии правда вообще ничего не слышал :)


> (: .ьтавишарпс емуроф ан олыб онжун йен о отч ,огокат ,ечадаз
> йотэ в огонжолс огечин ужив еН.

Это не вопрос это - задача.


> Ох, и правда трудная задача. Представляете - целых 5 минут
> пришлось по клавишам стучать. Правда, решил все-таки. Но
> код не приведу. Потому что задачку-то эту задали Вам, а
> не форуму.

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


 
Ahmad K ©   (2003-06-28 11:10) [6]

Все равно всем спасибо, хоть с делфи вы и незнакомы но отмазываться умеете :)


 
Ihor Osov'yak ©   (2003-06-28 11:53) [7]

Я конечно, не ЮЗ, пять минут мне мало, но думаю - не более 15 это точно. Начинаем эксперемент, всмысле начинаю старт. По окончании - дам реализацию сюда :-)




 
Ihor Osov'yak ©   (2003-06-28 12:14) [8]

Усе, готово. Сейчас резулт постить буду, ну не настолько я морально устойчав, как ЮЗ :-)..

Зы - написание оптимального кода не преследовалось..


 
Bayer_Linse ©   (2003-06-28 12:17) [9]

Задача с завидным упорством появляется на форуме. Пора ее уже в FAQ заносить. :-)

Решение- в первом томе Кнута. Два варианта.


 
Ihor Osov'yak ©   (2003-06-28 12:19) [10]

Итого 21 минута, с них 1 ушла на беседу в аське и две на угон кошки, чтобы не мешала..
Как обратил внимание Олег Гашев (а именно с ним в аьке говорил) - не должно быть повторений в результ. варианте. Например, если исходное слово МАМА - то вариант МАМА должен был присутствовать один раз. Но я с этим не согласился, так как это не следует с условия. То есть я пошел по пути упрощения..

Итак:

unit mfPerest;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
edSrc: TEdit;
btStart: TButton;
listResult: TListBox;
procedure btStartClick(Sender: TObject);
private
{ Private declarations }
procedure WriteOneCombination(aStr:string);
procedure DoIt(aStr:string; aFixPos:integer);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.btStartClick(Sender: TObject);
begin //
if edSrc.Text="" then begin
ShowMessage("


 
Bayer_Linse ©   (2003-06-28 12:23) [11]

Такое не интересно решать. Вот Вам, подумайте:

Представьте себе целочисленную шкалу - ну, то есть, бесконечный в обе стороны ряд точек, занумерованных целыми числами - положительными и отрицательными.
Теперь представьте себе, что на эту самую шкалу спускаются на парашютах два робота. Они приземляются одновременно. В разных точках, естественно. После приземления каждый из роботов тут же бросает свой парашют прямо в той точке, на которую приземлился, и, не теряя времени даром, начинает действовать строго по заложенной в нем программе. Программа написана на простеньком языке, состоящем всего из четырех операторов:


[<метка>:] Left
[<метка>:] Right
[<метка>:] GoTo <метка>
[<метка>:] PGoTo <метка>

При исполнении оператора Left робот делает один шаг влево, то есть перепрыгивает на точку с числом на единицу меньшим, а при исполнении оператора Right - шаг вправо. Оператор GoTo - обычный оператор безусловного перехода на указанную метку в программе. Оператор PGoTo - оператор условного перехода, где условием является наличие парашюта в той точке, на которой стоит робот (все равно - своего парашюта или чужого).
Итак, роботы приземляются, бросают парашюты и в один и тот же момент начинают действовать по заложенным в них программам. Причем действуют они синхронно. Давайте будем считать, что каждую секунду роботы одновременно исполняют очередной оператор своей программы (на исполнение операторов GoTo и PGoTo тоже требуется одна секунда).
Теперь представьте себе, что программы у роботов совершенно одинаковые. Тогда они и вести себя будут совершенно одинаково, весело прыгая по точкам и не мешая друг другу. Правда? Ничего подобного! Оказывается, можно написать такую программу, при исполнении которой роботы обязательно встретятся, то есть в какой-то момент прыгнут в одну и ту же точку!
Именно такую программу вам и предстоит написать. Учтите, что программа должна быть честной. Она не должна содержать операторов, отличных от упомянутых четырех, и, кроме того, ее текст, конечно же, должен быть конечным - то есть состоять из конечного числа строк-операторов. Постарайтесь придумать как можно более короткую программу.
Совершенно не обязательно, чтобы программа закончилась в тот самый момент, когда роботы встретятся. Пусть себе прыгают дальше - лишь бы встретились хоть раз. Не обязательно даже, чтобы программа вообще кончалась. Она вполне может включать бесконечный цикл.


А то перестановки, рекурсия. Старо.


 
Ihor Osov'yak ©   (2003-06-28 12:25) [12]

ShowMessage("


 
Ihor Osov'yak ©   (2003-06-28 13:01) [13]

2 Bayer_Linse © (28.06.03 12:23)

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



 
Ihor Osov'yak ©   (2003-06-28 13:02) [14]

Зы.. В моем постинге есть уже очень юольшая подсказка к решению..

Зы2. Смог ли бы я ее самоостоятельно решить - не знаю..


 
JohnJ ©   (2003-06-28 15:16) [15]

Интересная задачка - домой приеду, решу обязательно! :)
Если тема будет ещё актуальна, то выложу решение сюда.


 
Ihor Osov'yak ©   (2003-06-28 16:00) [16]

в дополнение к Ihor Osov"yak © (28.06.03 13:02)

.. Но надеюсь, что смог-бы..


 
Marser ©   (2003-06-28 16:42) [17]

Мы такое "слабо" на информатике проходили. Даже без того материала можно сделать через множества.


 
Bayer_Linse ©   (2003-06-28 22:16) [18]

Множества имеют ограниченную длину. Найди для 6 хотя бы.


 
Asteroid ©   (2003-06-29 01:58) [19]

> Bayer_Linse © (28.06.03 12:23)
Эта задача не так давно тут появлялась. Решение, конечно, шикарное :)


 
Кен ©   (2003-06-29 03:09) [20]

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

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, ValEdit, StdCtrls;

type
TForm1 = class(TForm)
ValueListEditor1: TValueListEditor;
Button1: TButton;
Edit1: TEdit;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
i, j, b : Integer;
s1, s2 : String;
begin
j:=1;
for i:=1 to Length(Edit1.Text) do begin j:=j*i; end;

s1 := Edit1.Text;
ValueListEditor1.Strings.Clear;
repeat
b := Random(Length(s1))+1;
s2 := Copy(s1,b,1);
Delete(s1,b,1);
s1 := s1+s2;
ValueListEditor1.Values[s1] :=s1;
until (ValueListEditor1.RowCount>j) ;

ListBox1.Items.Clear;
for i:=1 to ValueListEditor1.RowCount-1 do begin
ListBox1.Items.Add(ValueListEditor1.Keys[i]);
end;

caption := "Вариантов: "+IntToStr(ValueListEditor1.RowCount-1);

end;

end.


Форма :

object Form1: TForm1
Left = 292
Top = 114
Width = 573
Height = 387
Caption = "Form1"
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = "MS Sans Serif"
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object ValueListEditor1: TValueListEditor
Left = 240
Top = 16
Width = 306
Height = 305
TabOrder = 0
end
object Button1: TButton
Left = 144
Top = 16
Width = 75
Height = 25
Caption = "Button1"
TabOrder = 1
OnClick = Button1Click
end
object Edit1: TEdit
Left = 16
Top = 16
Width = 121
Height = 21
TabOrder = 2
Text = "Edit1"
end
object ListBox1: TListBox
Left = 16
Top = 48
Width = 217
Height = 273
ItemHeight = 13
TabOrder = 3
end
end


 
Кен ©   (2003-06-29 03:40) [21]

Кстати а ведь эту задачку достаточно решить всего один раз !
А дальше достаточно лишь делать замену символов в ЛистБоксе.


 
Ahmad K ©   (2003-06-29 04:59) [22]


> Ihor Osov"yak

Ваш вариант мне больше понравился, по крайней мере не тормозит как мой иработает с любой длиной и слюбыми буквами, единсктвенная проблема была удалять схожие варианты, но это не трудно:

procedure TForm1.Button1Click(Sender: TObject);
var i, s: Integer;
begin
l.Sorted:=true;
for i:=L.Items.Count-1 downto 1 do
if l.Items[i]=l.Items[i-1] then
begin
s:=i-1;
l.Items.Delete(s);
end;

end;

end.


Тута появляются много сообщений, типа "мы это в детсадике проходили..." поясняю еще раз, я нигде и ничего про делфю или программирование не изучал и работал чисто методом тыка, а когда столкнулся с такой проблемо, долго и нудно расписывал исходник (на страницу почти что) и в итоге он тормозил, хотел просто узнать у кого решение получше...
Всем спасибо!


 
Bayer_Linse ©   (2003-06-29 09:24) [23]

Ahmad K © (29.06.03 04:59)

Неверно. Проверу нельзя делать. Иначе для слова из 15 разных букв придется долго ждать, пока произойдет проверка.

В твоем случае для удаления одинаковых вариантов нужно по другому сторить алгоритм, когда просто автоматически не будут генирироваться повторы.

Есть такой метод: перебор с отходом назад. Об этом методе смотри http://algolist.manual.ru/maths/combinat/sequential.php .

Что проверять. Если, например, у тебя в слове X[1]=X[3] и есть какой-то вариант P(X[3],a,b...) то при генерации варианта b<>X[1], потому что он был сгенерирован раннее.


 
Ahmad K ©   (2003-06-29 10:06) [24]


> Bayer_Linse

Спасибо за ссылку обязательно прочитаю, но мне нужно пока только слово не длиннее 8 букв, поэтому пока мой вариант годится.
Еще раз спасибо!


 
Кен ©   (2003-06-30 02:35) [25]

> Bayer_Linse © (29.06.03 09:24)
> Ahmad K © (29.06.03 04:59)
>
> Неверно. Проверу нельзя делать. Иначе для слова из 15 разных
> букв придется долго ждать, пока произойдет проверка.

Ха ! Для слова из 15 разных букв ... Да всех наших винчестеров вместе взятых не хватит для хранения всех возможных вариантов от слова из 15 разных букв.



Страницы: 1 вся ветка

Текущий архив: 2003.07.14;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.013 c
1-44735
Erik
2003-07-01 13:39
2003.07.14
Неосвобождается com сервер.


14-44896
Dimich1978
2003-06-27 20:44
2003.07.14
ПОЗДРАВИМ SERGO


1-44751
corte ™
2003-07-01 10:20
2003.07.14
Как отключить Excel ???


14-44828
Mike B.
2003-06-26 15:47
2003.07.14
Тест


1-44691
ss300
2003-06-29 17:02
2003.07.14
Выбрать из ста 20 случайных неповторяющихся чисел