Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2003.07.14;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.009 c
14-44819
Достатый
2003-06-25 23:28
2003.07.14
Забодало. Скупой платит дважды.


14-44802
Zelius
2003-06-25 21:31
2003.07.14
Пропали Хинты в Delphi и во всех моих прогах :(


6-44797
Staraya
2003-05-06 09:09
2003.07.14
Командная строка windows2000


3-44576
KSergey
2003-06-13 13:35
2003.07.14
TDataSet в режиме редактирования и исключение


14-44827
vajo
2003-06-26 10:22
2003.07.14
boot.ini





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский