Форум: "Основная";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];
ВнизПроверка стринги Найти похожие ветки
← →
Кастуся (2004-07-05 22:26) [0]Мастаки! Нужно быстро проверить, состоит ли 32-х символьная строка из ["0".."9","A".."F"]! Плиз, хелп!
← →
Rouse_ © (2004-07-05 22:38) [1]function A(const S: String[32]): boolean;
var
I: Byte;
begin
Result := True;
for I := 1 to 32 do
if not (S[I] in ["0".."9","A".."F"]) then
begin
Result := False;
Exit;
end;
end;
:)
← →
3APA3A (2004-07-05 23:19) [2]Мне кажется такой вариант пошустрее будет... Хотя до тестирования руки не дошли...
{$B-}
function B(const Str : string[32]) : boolean;
var i : Integer;
code : Byte;
begin
Result := True;
for i := 1 to 32 do
begin
code := ord(Str[i]);
if (code = 0) or (code = 1) and ... then
begin
Result := False;
Exit;
end;
end;
end;
← →
KilkennyCat © (2004-07-06 01:25) [3]Шустрее будет, если просто проверять положение ord(S[i]) между ord("0") и ord("9"), а также между ord("A") и ord("F")
← →
Palladin © (2004-07-06 01:29) [4]:)
StrToInt("$"+s);
← →
KilkennyCat © (2004-07-06 01:34) [5]
> Palladin © (06.07.04 01:29) [4]
блин... когда я начну видеть очевидное? :))
← →
Кастуся (2004-07-06 19:09) [6]
> Palladin © (06.07.04 01:29) [4]
> :)
> StrToInt("$"+s);
медленно
> Rouse_ © (05.07.04 22:38) [1]
> function A(const S: String[32]): boolean;
> var
> I: Byte;
> begin
> Result := True;
> for I := 1 to 32 do
> if not (S[I] in ["0".."9","A".."F"]) then
> begin
> Result := False;
> Exit;
> end;
> end;
тоже медленно
фишка такая: в большинстве случаев строка состоит из этих символов, изредка встречается такое, что 1 или 2 символа не "те"
← →
jack128 © (2004-07-06 19:14) [7]
> Шустрее будет, если просто проверять положение ord(S[i])
> между ord("0") и ord("9"), а также между ord("A") и ord("F")
а это тоже медленно?
← →
Palladin © (2004-07-06 21:11) [8]
> [6] Кастуся (06.07.04 19:09)
Как эти строки получаются?
← →
3APA3A (2004-07-06 21:19) [9]to Palladin
Хм... а если строчная a,b,c,d,e,f попадется... ведь тоже преобразуется...
← →
Palladin © (2004-07-06 21:35) [10]Дело в том что любой вариант автора не устраивает... хотя разница между ними миллисекунды... этож сколько миллиардов строк присутствует, что бы ощутимо было? выход один... просто не допускать такие строки при формировании... отсюда и вопрос... откуда они вообще взялись?
← →
Rouse_ © (2004-07-06 21:46) [11]Ну тогда GUIDToString :)
← →
Rouse_ © (2004-07-06 21:52) [12]Опс...
Тут же обратка...
Я вот тут думаю... быстрее.
А какой критерий данного быстрее?
Перед проверкой держи на готове пул потоков размерностью 32 и делай им Resume с передачей Char из контролькой строки. При наличии нескольких процессоров можно еще и потоки по ним разветвлить :)
← →
evvcom © (2004-07-06 21:57) [13]Если все это медленно, то писать надо на ассемблере с оптимизацией под конкретный процессор! :)
← →
Anatoly Podgoretsky © (2004-07-06 22:18) [14]А это уже по второму кругу идет обсуждение, и в первом круге дали даже готовые решения, но видно без толку.
← →
Кастуся (2004-07-06 23:58) [15]
> Anatoly Podgoretsky © (06.07.04 22:18) [14]
> А это уже по второму кругу идет обсуждение, и в первом круге
> дали даже готовые решения, но видно без толку.
нормальных ответов не было.
← →
Palladin © (2004-07-07 00:02) [16]Удалено модератором
Примечание: LMD Lock :)
← →
jack128 © (2004-07-07 00:14) [17]
> Удалено модератором
> Примечание: LMD Lock :)
:-) Супер!!!! :-)
← →
KilkennyCat © (2004-07-07 00:44) [18]
> Кастуся (06.07.04 23:58) [15]
Нормальный был у Паладина. Могу дать ненормальный, надо? :) Пожалуйста:
Мы знаем, что в строке всего 32 символа, и знаем, какие они млгут быть. Соответственно, мы можем получить одномерный массив 32-ух байтных чисел, содеражащий в себе все варианты такой строки. Вся проверка сведется к проверке принадлежности нашей строки к этому массиву. Большой плюс этого решения - солидность программы (заказчики любят многометровость....)
← →
SergP © (2004-07-07 04:56) [19]
> KilkennyCat © (07.07.04 00:44) [18]
Ого... А время поиска по массиву?
2 Кастуся
Разве что проверять в цикле таким образом:
function A(const S: String[32]): boolean;
var
i,x: Byte;
begin
Result := True;
for I := 1 to 32 do
X:=ord(s[i]);
if ((x xor 48)>9) and (((x-65) and 223)>5) then
begin
Result := False;
Exit;
end;
end;
но даже если это и будет немножко быстрее чем остальное, все равно разницы не будет заметно... :(((
← →
Fay © (2004-07-07 09:17) [20]2Кастуся (06.07.04 23:58) [15]
Можешь обосновать? Нет, пожалуй.
← →
Кастуся (2004-07-07 21:56) [21]ладно. по второму кругу, так по второму. закрываем...
← →
Amoeba © (2004-07-08 11:55) [22]
> Кастуся (07.07.04 21:56) [21]
Нужно было закрывать уже после первых пяти постов.
← →
Anatoly Podgoretsky © (2004-07-08 12:05) [23]Amoeba © (08.07.04 11:55) [22]
Ты щедрый
← →
Romkin © (2004-07-08 12:06) [24]Кастуся (06.07.04 23:58) [15] Нормальных ответов не было?
Да я тебе даже конечный автомат нарисовал...
Вопросов вот нормальных не было
← →
Кастуся (2004-07-08 18:25) [25]
> Romkin © (08.07.04 12:06) [24]
> Кастуся (06.07.04 23:58) [15] Нормальных ответов не было?
>
> Да я тебе даже конечный автомат нарисовал...
> Вопросов вот нормальных не было
все это было про обработку стринги и конкретно, сабж был по удалению пробелов.
← →
Romkin © (2004-07-08 18:37) [26]Туда же легко вмещается и сабж. Так что я просто удивлен, что этот вопрос снова возник
← →
KilkennyCat © (2004-07-08 21:13) [27]
> Romkin © (08.07.04 18:37) [26]
не было в сабже про пробелы! :)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.04 c