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

Вниз

Одно   Найти похожие ветки 

 
maga001   (2003-12-12 22:16) [0]

Уважаемые Мастера и Подмастерья!
Говорят, что экспериментально доказано, что люди читают слова по первой и последней букве, т.е. неважно в какой последовательности идут буквы в слове, главное что бы на месте были первая и последняя буква. Я сразу же задался целью сделать программу, которая будет обычный текст будет переделывать в вышеизложенный вид. Но ввиду того, что я новичок в делфи и тем более профан в таких делах, ничего токового не получилось, может кто сделает? Поделитесь кодом.
Заранее благодарен!


 
Юрий Зотов ©   (2003-12-12 23:46) [1]

Элементарно, Ватсон.

Вот Вам текст, полностью соответствующий тому, что Вы сказали:
Г...и, к...е же н...и и...а з...т на э...т н...й с...т!

Для начала прочитайте его, а потом запрограммируйте тот алгоритм, которым Вы это сделали. И все проблемы.


 
Ihor Osov'yak ©   (2003-12-13 00:05) [2]

2 [1] Юрий Зотов © (12.12.03 23:46)

А я первых два слова прочитал :-)


 
Johnmen ©   (2003-12-13 00:25) [3]

>Юрий Зотов © (12.12.03 23:46)
>Г...и, к...е же н...и и...а з...т на э...т н...й с...т!

Господи, какие же новички издалека заходят на этот несчастный сайт!

:)


 
maga001   (2003-12-13 00:43) [4]


> Вот Вам текст, полностью соответствующий тому, что Вы сказали:
> Г...и, к...е же н...и и...а з...т на э...т н...й с...т!

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


 
maga001   (2003-12-13 00:45) [5]

Ребята, если такое с вашей точки зрения не возможно скажите сразу, а то такое ощущения что я какую-то глупость несусветную сморозил.


 
Игорь Шевченко ©   (2003-12-13 00:52) [6]

maga001 (13.12.03 00:45)

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

Гдсоопи, ккиае нвоикчи иоднга здяхоат на эотт нысеачтснй сйат


 
maga001   (2003-12-13 01:02) [7]


> Игорь Шевченко

Этот "алгоритм" видел уже не раз, только хотелось бы увидеть это на языке Object Pascal, а мой "алгоритм" то весь текст перемешывает, то вообше буквы ковыряет.


 
Ihor Osov'yak ©   (2003-12-13 01:09) [8]

2 [5] maga001 (13.12.03 00:45)

Было уже месяц или два об этом.. Но имхо, это только для умеющих бегло читать..

Да, мысли желательно внятно излагать.. И, кстати, [2] не противоречит условиям, изложенным в [1]. А то, что "буквы не должны быть пропущены, они должны просто поменяться местами" упомянуто лишь в [4].

Да и реализация программная перестановки - элементрарна.. Тоже был разговор на эту тему - за сколько минут можно сделать.. У меня вышло где-то минут 5-8.. Начиная от запуска делфи, кончая тестированием.. Если есть интерес - исходник должен сохраниться :-)


 
maga001   (2003-12-13 01:12) [9]


> Ihor Osov"yak ©

Если бы его не было я бы сюда не писал :)))


 
Ihor Osov'yak ©   (2003-12-13 01:12) [10]

Сори, тогда речь шла о генерации всех возможных перестановок. А то, что тебе нужно - можно еще проще..


 
maga001   (2003-12-13 01:16) [11]


> Ihor Osov"yak ©

Про генерацию я знаю, было уже, только тут текст надо обработать.


 
Юрий Зотов ©   (2003-12-13 01:24) [12]

> maga001

Да Вы поймите главное. Разбить текст на слова и как-то там перемешать в них буквы - это не проблема, и пишется такая программа действительно за 5 минут. Но что потом?

Ну, получите Вы примерно такой текст, что привел Игорь в [6]. А дальше-то что?


 
maga001   (2003-12-13 01:34) [13]


> Юрий Зотов ©

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


 
Fantasist ©   (2003-12-13 01:38) [14]


> Говорят, что экспериментально доказано, что люди читают слова по первой и последней букве


А ну этот же текст уже весь интернет обошел:

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

aoccdrnig to a rscheearch at an Elingsh uinervtisy, it deosn"t mttaer in waht oredr the ltteers in a wrod are, the olny iprmoetnt tihng is taht frist and lsat ltteer is at the rghit pclae. The rset can be a toatl mses and you can sitll raed it wouthit porbelm. Tihs is bcuseae we do not raed ervey lteter by it slef but the wrod as a wlohe


 
Stant ©   (2003-12-13 01:46) [15]

>Fantasist
Нормально читается. Толко вот не пойму, зачем нормальный текст надо "калечить"?

Наебру лобой тескт бсытро и без очепяток.


 
Ihor Osov'yak ©   (2003-12-13 01:53) [16]

2 [13] maga001 (13.12.03 01:34)

Книжек мало читаешь..

Выдергивай с одной строки рандомный символ (в пределах тела строки) и присоединяй к второй строке. Примерно так, как сделано дальше..
Зы - писалось без претензии на оптимальность:

unit fmainTossInnerChar;

interface

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

type
TForm1 = class(TForm)
edSrc: TEdit;
btToss: TButton;
lbResult: TLabel;
procedure btTossClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

function DoIt(aPrm: string): string;
var
strBeg: string;
idx: integer;
begin
if length(aPrm) <= 2 then
begin
result := aprm;
exit;
end;
result := aprm[1];
strBeg := Copy(aPrm, 2, length(aPrm) - 2);
while length(strBeg) > 0 do
begin
if length(strBeg) = 1 then
begin
result := result + strBeg;
break;
end;
idx := Random(length(strBeg)) + 1;
result := result + strBeg[idx];

if idx = 1 then
begin
strBeg := Copy(strBeg, 2, length(strBeg) - 1);
continue;
end;

if idx = length(strBeg) then
begin
SetLength(strBeg, length(strBeg) - 1);
continue;
end;
strBeg := Copy(strBeg, 1, idx - 1) + Copy(strBeg, idx + 1, length(strBeg) - idx);
end;
result := result + aPrm[length(aPrm)];

end;

procedure TForm1.btTossClick(Sender: TObject);
begin //
lbResult.Caption := doIt(edSrc.Text);
end;

initialization

Randomize;

finalization

end.


 
Ihor Osov'yak ©   (2003-12-13 01:58) [17]

ps без strBeg вполне можно обойтись.. А если сделать битовый массив флажков с целью отметки уже "выдернутых" символов - то можно обойтись без медленных оппераций по удалению "выдернутого" из тела строки.. Хотя можно и без массива флажков.. Еще проще.. Сейчас набросаю еще..
выдергиваешь символ, а на его место - переставляешь последний...


 
Ihor Osov'yak ©   (2003-12-13 02:18) [18]

заблудился в условиях окончания цыкла, и то, что делается за 2 минуты, езолил 20. Ибо лень было за ручкой идти, картинку рисовать, а по старости в уме уже плохо соображаю :-)

unit fmainTossInnerChar;

interface

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

type
TForm1 = class(TForm)
edSrc: TEdit;
btToss: TButton;
lbResult: TLabel;
procedure btTossClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

function DoIt(aPrm: string): string;
var
idx: integer;
idxLast: integer;
begin
if length(aPrm) <= 3 then
begin
result := aprm;
exit;
end;
result := aprm[1];
idxLast := length(aPrm) - 1;

while idxLast >= 2 do
begin
if idxLast = 2 then
begin
result := result + aPrm[2];
break;
end;
idx := Random(idxLast - 1) + 2;
result := result + aPrm[idx];
aPrm[idx] := aPrm[idxLast];
dec(idxLast);
end;
result := result + aPrm[length(aPrm)];

end;

procedure TForm1.btTossClick(Sender: TObject);
begin //
lbResult.Caption := doIt(edSrc.Text);
end;

initialization

Randomize;

finalization

end.


 
Ihor Osov'yak ©   (2003-12-13 02:23) [19]

а вообще-то такие вещи ( я имею ввиду реализацию номер 2), намного красивее на ассеблере смотрятся.. Но уже лень..


 
Ske4er ©   (2003-12-13 02:56) [20]

:) Пока пробовал сам Мастер Ihor Osov"yak уже написал :). Мож взглянуть на мой - не оптимальный, но короткий.

Я кинул на форму 2 Едита и Кнопку. У кнопки обравотчик - edit2.Text:=mix(edit1.text);

Ну а сама функция -
function Mix (word : string): string;
var
wordMixed : string;
i,j : integer;
begin
randomize;
wordMixed:="000000000000000000000000000000";
wordMixed[1]:=word[1];
wordMixed[length(word)]:=word[length(word)];
for i:=2 to length(word)-1 do
begin
repeat
j:=random(length(word)-2)+2;
until (word[j]<>"0");
wordMixed[i]:=word[j];
word[j]:="0";
end;
result:=copy(wordMixed,1,length(word));
end


 
Ske4er ©   (2003-12-13 03:01) [21]

Забыл предупредить - функция на одно слово. Как разбивать стоку на слова найдешь при желании на http://delphibase.endimus.ru/


 
Ihor Osov'yak ©   (2003-12-13 03:19) [22]

2 [20] Ske4er © (13.12.03 02:56)

несколько замечаний.
- randomize; желательно вызывать только раз. Нажмите ф1, там єтот момент, кажется, прокоментирован..
- как идентификатор формального параметра не желательно использовать идентификатор стандартного типа (я имею ввиду word)
- создаете искуственные преграды на длинну входного слова, причем без контроля на превышение этой преграды.. Я понимаю, что реальные слова длинной меньше, чем вы предусмотрели, но нужно отказываться от такого стиля. Рано или позно, сделав за прывычкой, пулучите немного неприятностей..
- внутренний цыкл, где подбираем "cвободный" рандом-индекс немного гоняться будет.. Честно говоря, я также примерно так думал делать, когда говорил о массиве флажков, но именно через эти лишние гонки и отказался от такого подхода.. Но, впрочем, это наверно оптимальние, чем мой первый вариант.


 
Ihor Osov'yak ©   (2003-12-13 03:20) [23]

блин, опячаткм на опячатке.. Спать пора :-)


 
KosilkA ©   (2003-12-13 06:17) [24]

proecdure TFrom1.Butotn1Oncilck(Sedner:Tobejct);
bgein
shomwessage("Пмочеу этот код у меня не раобтает?");
end;


 
Кен ©   (2003-12-13 07:52) [25]

Это открытие было сделано англичанами, а у них слова короткие. look, book и так далее.
Попробуйте переставить буквы в слове "конституционный" и потом прочитать.


 
Anatoly Podgoretsky ©   (2003-12-13 10:14) [26]

Юрий Зотов © (12.12.03 23:46) [1]
Попрошу не выражаться


 
Anatoly Podgoretsky ©   (2003-12-13 10:17) [27]

maga001 (12.12.03 22:16)
О сколько нам открытий чудных, готовит просвещенья век


 
Ihor Osov'yak ©   (2003-12-13 12:24) [28]

2 [24] KosilkA © (13.12.03 06:17)

Да ладно, нужно же иногда в детсво поиграть :-)


 
Ske4er ©   (2003-12-13 14:13) [29]

Спасибо за замечания. 3 и 4 знал, но решил что для для данной конктретной задачи "прокатит" :) Большой спасибо за 2е, не когда не задумывался, но сразу видно что привычка плохая :)

1:

Do not combine the call to Randomize in a loop with calls to the Random function. Typically, Randomize is called only once, before all calls to Random.

" Обычно randomize вызывается 1 раз и не вызывайте его в том же цикле что и random."


 
blackman ©   (2003-12-13 14:17) [30]

> єтот
Где такую букву взял ? Тоже хочу :)


 
Ihor Osov'yak ©   (2003-12-13 14:26) [31]

2 [29] Ske4er © (13.12.03 14:13)

Здесь борланды постеснялись в выражениях.. Поскромничали. Кнут, когда рассматривал генераторы псевдослучайных, очень акцентировал внимание на этом моменте. Конечно, не в контексте Делфи :-).
random генерирует неплохую псевдопоследовательность. Randomize ее рандомизирует, то есть гарантирует, что эта последовательность будет разной от запуска к запуску. Но если делать каждый раз Randomize перед Random - то это не значит, что полученная последовательность будет более качественной, чем в случае однократного вызова Randomize в пределах процесса с последующим многократным юзанием random. Скорее всего наоборот. И Кнут немного теоритически обьяснял этот эффект.. А практически можете проверить сами. Только перед тем посмотрите на критерии "хорошей" псевдослучайной последовательности.. В том же Кнуте, если лень смотреть в сторону буков по математике..


 
Всеволод Соловьёв ©   (2003-12-13 14:27) [32]


> Это открытие было сделано англичанами, а у них слова короткие.
> look, book и так далее.
> Попробуйте переставить буквы в слове "конституционный" и
> потом прочитать.

та да :)
Кстати, несмотря на то, что английский для меня не родной и знаю я его плоховато, но тем не менее, когда я начал читать английский текст в [14], я все понял.
А с русским так и еще легче. Пока не встретится слово конституционный :)))
Эотт ксонытцитионунй суд смаый ктонсцитоуниный из весх кннстутыцоиноих суодв на неашй паленте.

во всех трех случаях я это слово перемашеал по-разному.


 
Ihor Osov'yak ©   (2003-12-13 14:30) [33]

2 [30] blackman © (13.12.03 14:17)

на украинской раскладке клавиатуры.. Стоит сейчас три - укр, рус, анг, второпях иногда вместо рус переключаюсь на укр и наоборот.. Укр. текст с типично русским буквами, типа "ы" или "э","ъ" смотрится не менее оригинало и/или дебильно :-)


 
Ihor Osov'yak ©   (2003-12-13 14:34) [34]

2 [32] Всеволод Соловьёв © (13.12.03 14:27)

Наболело? :-(. Жители Украины поймут..
Но это уже оффтопик.. Сорри.


 
k-man ©   (2003-12-13 15:49) [35]


> Наболело? :-(. Жители Украины поймут..
> Но это уже оффтопик.. Сорри.

Как ничего не понявший не житель Украины прошу разъяснений


 
Ihor Osov'yak ©   (2003-12-13 16:02) [36]

2 [35] k-man © (13.12.03 15:49)

на другие сайты, например http://maidanua.org/ , там также есть форум..


 
k-man ©   (2003-12-13 16:38) [37]


> на другие сайты, например http://maidanua.org/ , там также
> есть форум..

Брр... ничего не понял.. Как связаны эти два поста


 
Ihor Osov'yak ©   (2003-12-13 16:55) [38]

2 [37] k-man © (13.12.03 16:38)
>Как ничего не понявший не житель Украины прошу разъяснений
см также выше о "ксонытцитионунй суд"..
на упомятумом мне сайте и форуме эта тема подробно рассматривается. В том числе последние решения этого суда.
Она там "в топик", здесь - нет..


 
Vuk ©   (2003-12-13 17:01) [39]

to Ihor Osov"yak:
Игорь, извините, но, видимо, не Вам стоит делать из топика оффтопик на ровном месте.


 
Ihor Osov'yak ©   (2003-12-13 17:12) [40]

2 [39] Vuk © (13.12.03 17:01)

ухожу, ухожу...
Я был не прав, извините.



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

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

Наверх




Память: 0.58 MB
Время: 0.033 c
4-12202
пачка
2003-11-04 21:18
2004.01.05
Как поймать клик мыши на конкретном окне программы? (Хуук)


1-11860
Kremen
2003-12-18 15:50
2004.01.05
Помогите с TWordDocument


14-12060
Сатир
2003-12-10 17:27
2004.01.05
Ура! Нам канал подняли!


3-11804
serfom
2003-12-07 17:46
2004.01.05
Как осуществить поиск по DB


14-12115
AxxxE
2003-12-15 20:05
2004.01.05
Mafia