Форум: "Прочее";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];
ВнизЭффективность алгоритма... А Ты сможешь лучше?? Найти похожие ветки
← →
MBo © (2005-12-28 17:18) [40]
procedure ParseString(const s:string; var Longest, Shortest, NumWords:Integer);
const
Delimiters = [" ",",","."];
var
i, CurrLen, LastDelim:Integer;
StateInWord: Boolean;
procedure EndOfWord;
begin
CurrLen:=i-LastDelim;
if CurrLen>Longest then
Longest:=CurrLen;
if CurrLen<Shortest then
Shortest:=CurrLen;
Inc(NumWords);
StateInWord := False;
end;
procedure StartWord;
begin
LastDelim:=i;
StateInWord:=True;
end;
begin
Longest:=0;
Shortest:=MaxInt;
LastDelim:=0;
NumWords:=0;
StateInWord:=False;
for i := 1 to Length(s) do
if (s[i] in Delimiters) then begin
if StateInWord then
EndOfWord
end else
if not StateInWord then
StartWord;
if StateInWord then
EndOfWord;
if NumWords=0 then
Shortest:=0;
end;
← →
Джо © (2005-12-28 17:21) [41]
> [40] MBo © (28.12.05 17:18)
Красиво.
← →
Игорь Шевченко © (2005-12-28 17:25) [42]
procedure StringStats (const S: string;
var WordCount, MinWordSize, MaxWordSize: Integer);
var
P, PStartWord: PChar;
MinLength, MaxLength, CurrentLength: Integer;
begin
WordCount := 0;
MinWordSize := 0;
MaxWordSize := 0;
MinLength := Length(S) + 1;
MaxLength := 0;
P := PChar(S);
while P^ = " " do
Inc(P);
while P^ <> #0 do begin
Inc(WordCount);
PStartWord := P;
while P^ > " " do
Inc(P);
CurrentLength := P - PStartWord;
if CurrentLength < MinLength then begin
MinWordSize := CurrentLength;
MinLength := CurrentLength;
end;
if CurrentLength > MaxLength then begin
MaxWordSize := CurrentLength;
MaxLength := CurrentLength;
end;
while P^ = " " do
Inc(P);
end;
end;
← →
MBo © (2005-12-28 17:31) [43]Более краткая форма с подчеркнутой "конечноавтоматностью":
procedure ParseString2(const s:string; var Longest, Shortest, NumWords:Integer);
const
Delimiters = [" ",",","."];
var
i, CurrLen, LastDelim:Integer;
StateInWord: Boolean;
procedure ChangeState;
begin
if StateInWord then begin
CurrLen:=i-LastDelim;
if CurrLen>Longest then
Longest:=CurrLen;
if CurrLen<Shortest then
Shortest:=CurrLen;
Inc(NumWords);
end else
LastDelim:=i;
StateInWord := not StateInWord;
end;
begin
Longest:=0;
Shortest:=MaxInt;
LastDelim:=0;
NumWords:=0;
StateInWord:=False;
for i := 1 to Length(s) do
if (not (s[i] in Delimiters)) xor StateInWord then
ChangeState;
if StateInWord then
ChangeState;
if NumWords=0 then
Shortest:=0;
end;
← →
Игорь Шевченко © (2005-12-28 17:34) [44]MBo © (28.12.05 17:31) [43]
> if (not (s[i] in Delimiters)) xor StateInWord then
Ты меня, конечно, извини, но эта строка нечитабельна :)
← →
MBo © (2005-12-28 17:39) [45]>Игорь Шевченко © (28.12.05 17:34) [44]
>Ты меня, конечно, извини, но эта строка нечитабельна :)
Осознавая это, я сначала и дал развернутую версию ;))
← →
DErad (2005-12-28 17:44) [46]
> Спасибо! Я не претендую на звание вундеркинда и уже работаю.
> Просто решил несколько автоматизировать свою работу...
> Конечно чтобы написать процедуру я создал нечто вроде блок-
> схемы, но в виде простых предложений. Собственно, изложил
> подход на листе фразами.
А тебе лет сколько? если можно узнать!!!
← →
Курдль © (2005-12-28 17:51) [47]
> Игорь Шевченко © (28.12.05 17:25) [42]
Не мытьем, так катаньем аутор научился писать оптимальные процедуры! Вот его терь на работе похвалють! :)
← →
OldNaum © (2005-12-28 18:02) [48]MBo © (28.12.05 17:31) [43]
красиво, блин.
← →
Vlad433 © (2005-12-28 18:22) [49]procedure StringStats (S: string; var WCount, MinWord, MaxWord: Integer);
var
P:Char; MinLength, MaxLength, i, CurLength: Integer;
begin
WCount:=0; MinWord:=1000000;MaxWord:=0;CurLength:=0;
for i:=1 to Length(S)+1 do
begin
P:=S[i];
if P in [" ",#0] then if CurLength=0 then continue else
begin
if CurLength<MinWord then MinWord:=CurLength;
if CurLength>MaxWord then MaxWord:=CurLength;
CurLength:=0; Inc(WCount);
end else Inc(CurLength);
end;
end;
← →
Sha © (2005-12-28 19:54) [50]
procedure TelegramStatistics(s: string; var wordcount, minlen, maxlen: integer);
const
characters= ["0".."9","A".."Z","a".."z","А".."Я","Ё","ё","а".."я"];
var
i, len: integer;
begin;
wordcount:=0;
minlen:=MaxInt;
maxlen:=0;
len:=0;
if s<>"" then for i:=1 to Length(s)+1 do
if s[i] in characters
then inc(len)
else if len>0 then begin;
inc(wordcount);
if minlen>len then minlen:=len;
if maxlen<len then maxlen:=len;
len:=0;
end;
end;
← →
Verg © (2005-12-28 20:09) [51]
> Игорь Шевченко © (28.12.05 17:34) [44]
> MBo © (28.12.05 17:31) [43]
>
>
> > if (not (s[i] in Delimiters)) xor StateInWord then
>
>
> Ты меня, конечно, извини, но эта строка нечитабельна :)
Хм, чем же?
← →
Verg © (2005-12-28 20:30) [52]Ах да, с т.з. логики, xor следовало бы заменить на <>
Было бы очевиднее ? Т.е. "читабельнее"?
← →
pasha_golub © (2005-12-28 20:32) [53]
> Verg © (28.12.05 20:09) [51]
>
>
if (not (s[i] in Delimiters) and not StateInWord) or
((s[i] in Delimiters) and StateInWord) then...
Потому шо надо было так ;0))
PS Части разделенные OR можно было писать без скобок, но ради наглядности всегда пишу так...
← →
Sha © (2005-12-28 20:33) [54]> Verg © (28.12.05 20:30) [52]
Еще читабельнееif StateInWord=(s[i] in Delimiters) then
← →
Verg © (2005-12-28 20:38) [55]
> pasha_golub © (28.12.05 20:32) [53]
Это вообще ф топку.
← →
pasha_golub © (2005-12-28 20:40) [56]
> Verg © (28.12.05 20:38) [55]
Господе, все такие сурьезные...
Гоню я... По правилу какому-то преобразовал, да и все...
Что наша жизнь? Игра! (с) Пиковая дама, по-моему
;0)
← →
Verg © (2005-12-28 20:46) [57]
> Что наша жизнь? Игра! (с) Пиковая дама, по-моему
http://lain.ru/trash/curveball.swf
← →
pasha_golub © (2005-12-28 20:48) [58]
> Verg © (28.12.05 20:46) [57]
КЛАСС!!! Блин, а я ссылку на нее потерял в свое время. Огромное спасибо, чессслово.
← →
Verg © (2005-12-28 20:50) [59]В догонку...
http://lain.ru/trash/curveball.swf
http://yonkis.com/mediaflash/yeti_gore.htm
← →
pasha_golub © (2005-12-28 20:55) [60]
> http://yonkis.com/mediaflash/yeti_gore.htm
Оригинальный вариант, интересней, ИМХО.
← →
OldNaum © (2005-12-28 21:03) [61]<offtop>
блин, ну не даром Sha на FastProject"e рулит :D
кстати, выигрывал когда-нибудь в итоге? интересно, просто ) я щас частенько туда заглядываю. интересная все-таки штука. щас в инете все чаще можно встретить пакеты компонентов на базе FP.
</offtop>
← →
Verg © (2005-12-28 21:11) [62]
> pasha_golub © (28.12.05 20:55) [60]
>
> > http://yonkis.com/mediaflash/yeti_gore.htm
>
>
> Оригинальный вариант, интересней, ИМХО.
Просто, предложенный мной - это для тех, кому оригинал остопаршивел уже в тошноту. :)) Чтобы было знать что есть хужее :)))
← →
MBo © (2005-12-28 22:20) [63]>Verg © (28.12.05 20:09) [51]
> > if (not (s[i] in Delimiters)) xor StateInWord then
> Ты меня, конечно, извини, но эта строка нечитабельна :)
>Хм, чем же?
Ну загнул я там, конечно... ;)
Стоило сделать так:
if (s[i] in Delimiters) <> StateInWord then
← →
Sha © (2005-12-28 22:32) [64]> OldNaum © (28.12.05 21:03) [61]
> выигрывал когда-нибудь в итоге? интересно, просто )
в некоторых номинациях :)
← →
Verg © (2005-12-28 22:34) [65]
> MBo © (28.12.05 22:20) [63]
Нормально все. :)
Делай как хочешь - МЫ - разрешаем :))))))))))))))
← →
MasterPaleva © (2005-12-29 05:23) [66]Я так понял, что нужно сделать без использования функций и процедур, чтобы повысить эффективность алгоритма. Не считая length :)
var
i, j, slov,n, n2: integer;
str: string;
...
slov:=0;
j:=0;
n:=0;
n2:=length(str);
for i:=1 to length(str) do begin
if str[i]=" " then begin
inc(slov);
j:=i-j-1;
if j>n then n:=j;
if j<n2 then n2:=j;
end;
end;
В работе не проверял, щас Делфи не стоит. Вроде быстрее...
← →
vidiv © (2005-12-29 06:22) [67]
$data = "Стой, собака моя!";
preg_match_all("/[A-Za-zА-Яа-я]+/s", $data, $out);
if (count($out[0])) {
$minlen = strlen($out[0][0]);
$maxlen = strlen($out[0][0]);
for ($i=1; $i<count($out[0]); $i++) {
if (strlen($out[0][$i])<$minlen) $minlen = strlen($out[0][$i]);
if (strlen($out[0][$i])>$maxlen) $maxlen = strlen($out[0][$i]);
}
echo "Длина самого короткого слова: ".$minlen."<br>";
echo "Длина самого длинного слова: ".$maxlen."<br>";
echo "Количество слов: ".count($out[0]);
}else{
echo "Слов нет";
}
← →
MasterPaleva © (2005-12-29 07:09) [68]Unknowing (28.12.05 16:21)
Да, твой алгоритм не учитывает же ведь точки, запятые, двоеточия...
Придется еще массив создавать.
← →
з. танька (2005-12-29 07:14) [69]
> MasterPaleva © (29.12.05 05:23) [66]
неправильно.. :(
← →
Unknowing (2005-12-29 09:08) [70]Так, вроде, лучше... Но уже боюсь реакции :)
Procedure Parse(Str: String; var WordCount,MaxWord,MinWord: Integer);
var
PosAtString : Integer;
PosAtWord,
NumOfLetters,
LengthOfStr : Integer;
Flag : Boolean;
begin
PosAtString:=1;
WordCount:=0;
MaxWord:=0;
MinWord:=0;
LengthOfStr:=Length(Str)+1;
Flag:=False;
if Str<>"" then
while PosAtString<>LengthOfStr do
begin
if (Str[PosAtString]<>" ") and (not Flag) then
begin
Inc(WordCount);
Flag:=True;
PosAtWord:=PosAtString;
NumOfLetters:=0;
while ((PosAtWord<>LengthOfStr) and (Str[PosAtWord]<>" ")) do
begin
Inc(NumOfLetters);
Inc(PosAtWord);
end;
if WordCount=1 then MinWord:=NumOfLetters;
if NumOfLetters>MaxWord then MaxWord:=NumOfLetters;
if NumOfLetters<=MinWord then MinWord:=NumOfLetters;
end
else if Str[PosAtString]=" " then Flag:=False;
Inc(PosAtString);
end
else Writeln("Нет ни одного слова");
end;
← →
Unknowing (2005-12-29 09:26) [71]Огромное спасибо всем отозвавшимся!!!
Действительно можно лучше, понятьней и короче! Будем работать над собой :)
С Новым Годом!!!
← →
Ega23 © (2005-12-29 10:24) [72]MBo © (28.12.05 17:18) [40]
procedure ParseString(const s:string; var Longest, Shortest, NumWords:Integer);
const
Delimiters = [" ",",","."];
Не прокатит, если в предложении прямая речь. Или диалог.
:-)
← →
MBo © (2005-12-29 10:30) [73]>Ega23 © (29.12.05 10:24) [72]
>Не прокатит, если в предложении прямая речь. Или диалог.
Ну это уже от ТЗ зависит :) Возможно, лучше, как у Sha, не ограничители, а наоборот, допустимые в "словах" символы проверять
← →
Ega23 © (2005-12-29 10:32) [74]
> Ну это уже от ТЗ зависит :)
Согласен.
Просто не удержался код мастера покритиковать. :о)
← →
Bless © (2005-12-29 12:02) [75]
> MBo © (29.12.05 10:30) [73]
>
> >Ega23 © (29.12.05 10:24) [72]
> >Не прокатит, если в предложении прямая речь. Или диалог.
>
> Ну это уже от ТЗ зависит :) Возможно, лучше, как у Sha,
> не ограничители, а наоборот, допустимые в "словах" символы
> проверять
В варианте Sha не прокатят слова типа "черно-белый"
Нет в мире совершенства. :o)
← →
Bless © (2005-12-29 12:03) [76]Это я тоже не удержался :)
← →
Unknowing (2005-12-29 16:21) [77]Господа! "ТЗ" было такое: посчитать слова в предложении (словом считать все между пробелами). Мой, боюсь сказать, код, работает полностью при любых введенных словах и в любом кол-ве. Просто я хотел убедиться в том, можно ли вообще так подходить к решению подобных задач. Т.е. я зациклился на термине "эффективность". Что лучше два цикла или как у мастера Sha множества. Потому как полагаю что для их обработки компилятор используют цикл. Вообщем: то что сделал я это:
-хорошо, но можно сделать иначе
или
-плохо!! Необходимо сделать иначе!
??
← →
Ega23 © (2005-12-29 17:45) [78]
> -хорошо, но можно сделать иначе
> или
> -плохо!! Необходимо сделать иначе!
Каков критерий "необходимости"?
← →
Unknowing (2005-12-30 08:09) [79]
> Ega23 © (29.12.05 17:45) [78]
"Необходимо" - значит можно сделать существенно лучше.
← →
Ega23 © (2005-12-30 09:11) [80]
> "Необходимо" - значит можно сделать существенно лучше.
Ещё раз: что значит "существенно"?
Страницы: 1 2 3 вся ветка
Форум: "Прочее";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];
Память: 0.62 MB
Время: 0.036 c