![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Рандомное слово [D7]
Дмитрий © (2009-08-09 14:15:00)Дана строка со словами, нужно выбрать из этих слов рандомное... Как это сделать???
KilkennyCat (2009-08-10 18:50:00) [1]
> Palladin © (10.08.09 17:04) [41]
дык это ты так видишь :)
а я вижу - алфавит.
Palladin (2009-08-10 17:04:00) [2]
> [34] KilkennyCat © (10.08.09 16:06)
дык... диапазоносочетание 'a'..'я' это всего лишь вид записи диапазона 34..76 к примеру...
Anatoly Podgoretsky (2009-08-10 16:31:00) [3]Влом или в западло.
KilkennyCat (2009-08-10 16:29:00) [4]
> Anatoly Podgoretsky © (10.08.09 16:13) [36]
а чем это мешает? Вот где-то они лишнее додумывают, а вот алфавит весь сообразить им влом...
Sha (2009-08-10 16:23:00) [5]И ошибку исправь
Kolan (2009-08-10 16:20:00) [6]
> Доработай.
SplitRegExpr('\s+', Edit1.Text, Strings);
Так? :)
Anatoly Podgoretsky (2009-08-10 16:13:00) [7]> KilkennyCat (10.08.2009 16:06:34) [34]
Для ординалов то?
KilkennyCat (2009-08-10 16:07:00) [8]
> байт.
Точнее, элемент. Раз уж теперь все юникодное...
KilkennyCat (2009-08-10 16:06:00) [9]
> Palladin © (10.08.09 16:04) [33]
Это я знаю, я просто думал, что компилятор соптимизирует и включит непоследовательный байт.
Palladin (2009-08-10 16:04:00) [10]
> [30] KilkennyCat © (10.08.09 16:00)
)
ShowMessage('Это а:'+IntToStr(Byte('а'))+#13#10'Это я:'+IntToStr(Byte('я'))+#13#10+'А это ё:'+IntToStr(Byte('ё'))+#13#10#227#251);
Anatoly Podgoretsky (2009-08-10 16:03:00) [11]> Kolan (10.08.2009 15:26:28) [28]
Ну было же сказано, что для Юникод другие решения.
Sha (2009-08-10 16:02:00) [12]> Kolan © (10.08.09 15:26) [28]
> Расширьте для китайского языка для примера, пожалуйста.
Прочти [26] еще раз.
> Моё решения для сабжа было бы простым...
В твоем решении предусмотрен только один разделитель - пробел.
> Регулярное выражение можно доработать как угодно.
Доработай.
----
Я понимаю, конечно, что это учебный пример.
На практике подобных задачах для меня часто были важны две вещи:
1. Удобство в понимании того, что есть слово. С этой точки зрения, если только речь не идет о юникоде, проще задать символы слов, а не разделители, хотя, конечно это вещи эквивалентные для компьютера, но не для человека.
2. Скорость работы с большими текстами.
Именно на этими вещами я хотел поделиться.
Думаю, чем скорее наши студенты отучатся всюду совать TStringList и TMemo, тем лучше.
P.S. Moe решение, конечно, намного быстрее решения, основанного на TSringList, но не претендует на звание самого быстрого.
KilkennyCat (2009-08-10 16:00:00) [13]
> Kolan ©
ну я изначально такое предложил :)
А разве буква Ё не попадает в a..Я ?
Дмитрий Белькевич (2009-08-10 15:39:00) [14]1. Сделать, или взять готовую (rx, jedi) функции GetWordCount, GetWordByIndex (называются, вероятно, по-другому, что-то с 'word' связанное будет).
2. В GetWordByIndex передать рандомное число от 1 до GetWordCount.
3. Profit.
>Letters: set of char
ИМХО разумнее задавать не литеры, которых много (особенно в юникоде), а разделители, которые более однообразны.
Kolan (2009-08-10 15:26:00) [15]
> Ничто не мешает расширить набор символов, которые мы считаем
> буквами.
Расширьте для китайского языка для примера, пожалуйста.
Моё решения для сабжа было бы простым. Я бы взял модуль TRegExp и использовал бы метод Split.
procedure TForm1.BitBtn1Click(Sender: TObject);
var
Strings: TStrings;
begin
Strings := TStringList.Create;
try
SplitRegExpr(' ', Edit1.Text, Strings);
Edit2.Text := Strings[Random(Strings.Count)];
finally
Strings.Free;
end;
end;
Регулярное выражение можно доработать как угодно.
http://regexpstudio.com/
Leonid Troyanovsky (2009-08-10 15:24:00) [16]
> Kolan © (10.08.09 14:47) [19]
> TStringList никак не нельзя
Надо ExtractStrings function.
--
Regards, LVT.
Sha (2009-08-10 15:16:00) [17]> Kolan © (10.08.09 15:08) [23]
Именно эта строка позволяет легко сопровождать код.
Ничто не мешает расширить набор символов, которые мы считаем буквами.
Если это не устраивает, можно использовать набор разделителей - изменения в коде тривиальны.
> Вам бы было стыдно за простой код?
Он только с виду простой. На самом деле тормознутый и не сопровождаемый.
Anatoly Podgoretsky (2009-08-10 15:15:00) [18]> Kolan (10.08.2009 15:08:23) [23]
Это будет работать правильно с соответствии со множеством, дл Юникода нужны другие решения. Другое дело с дефисом, если в качестве него будет использоваться одинаковый с тире код.
Соств множества может быть и более расширеным.
Kolan (2009-08-10 15:09:00) [19]Вам бы было стыдно за простой код?
Kolan (2009-08-10 15:08:00) [20]Я, Sha, ваш код не изучал, для того, чтобы его понять мне надо его запустить, но строка
Letters: set of char= ['0'..'9','a'..'z','A'..'Z','а'..'я','А'..'я'];говорит о том, что возможнотекст на немецком с диакритическими знаками или текст, записанный по правилам дореволюціонной орѳографiи будет обрабатываться не корректно. Я прав?