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

Вниз

Сравнения строк   Найти похожие ветки 

 
4eshka)   (2005-01-13 14:35) [0]

У кого какие идеи, нужно сравнить две строки не используя опреторы сравнения? Какии способы есть для этого? У кого какие идеи? У меня есть несколько реализаций. Нужно как можно запутанее :)


 
Kerk ©   (2005-01-13 14:35) [1]

4eshka)   (13.01.05 14:35)
без операторов сравнения ничего сравнивать невозможно


 
Vovchik_A ©   (2005-01-13 14:36) [2]

Сравнивать будем посимвольно или просто длину ? :)


 
Ega23 ©   (2005-01-13 14:41) [3]

У кого какие идеи?

У меня есть идея. Реализации - в студию!


 
4eshka)   (2005-01-13 14:43) [4]

Сравниваем s1 и s2

  s1:="qqq";
  s2:=edit1.text;
  a:=0;
  b:=0;
  for i:=1 to length(s1) do
  begin
     a:=a+ord(s1[i]);
  end;
  for i:=1 to length(s2) do
  begin
     b:=b+ord(s2[i]);
  end;

  try
    a:=123 div (a-b);
    ShowMessage("fu");
  except ShowMessage("good") end;


 
Kerk ©   (2005-01-13 14:44) [5]

4eshka)   (13.01.05 14:43) [4]
а.. ты извраты имел ввиду.. так бы и сказал.. ща подумаю.. :)))))))))


 
4eshka)   (2005-01-13 14:47) [6]


> 4eshka)   (13.01.05 14:43) [4]
> а.. ты извраты имел ввиду.. так бы и сказал.. ща подумаю..
> :)))))))))

:)


 
pasha_golub ©   (2005-01-13 14:49) [7]

Может, я тупой, но ни черта не понял


 
Kerk ©   (2005-01-13 14:52) [8]

a := 0;
for i := 1 to Min(Length(s1),Length(s2)) do
 a := a + (Ord(s1[i]) - Ord(s2[i]));
a := a + (Length(s1)-(Length(s2));

if Boolean(a) then ShowMessage("!!!");


 
Kerk ©   (2005-01-13 14:54) [9]

4eshka)   (13.01.05 14:43) [4]
Этот код - полный бред и работать не будет


 
4eshka)   (2005-01-13 14:57) [10]

Почему не будет работать? Проверь! У меня работает :D


 
4eshka)   (2005-01-13 14:59) [11]


> s1:="qqq";
>   s2:=edit1.text;
>   a:=0;
>   b:=0;
>   for i:=1 to length(s1) do
>   begin
>      a:=a+ord(s1[i]);
>   end;
>   for i:=1 to length(s2) do
>   begin
>      b:=b+ord(s2[i]);
>   end;
>
>   try
>     a:=123 div (a-b); //на 0 делить нельзя, если (a-b)<>0 то и s1<>s2, если равны, то получается деление на 0
>     ShowMessage("fu");
>   except ShowMessage("good") end;


 
Kerk ©   (2005-01-13 15:04) [12]

4eshka)   (13.01.05 14:57) [10]
сравни строки

Roman Jankovski
Jankovski Roman


 
}|{yk ©   (2005-01-13 15:05) [13]

А xor и деление любого числа на получившееся быстрее будет...


 
4eshka)   (2005-01-13 15:07) [14]


> 4eshka)   (13.01.05 14:57) [10]
> сравни строки
>
> Roman Jankovski
> Jankovski Roman

мда, понятно теперь :) но идея понятна то


 
Kerk ©   (2005-01-13 15:09) [15]

4eshka)   (13.01.05 15:07) [14]
yes


 
Ega23 ©   (2005-01-13 15:22) [16]


ss:="Declare @X int Set NoCount On "+
   "exec @X=sp_Compare2Strings @Param1="+String1+", @Param2="+String2+
   " Set NoCount OFF Select X=@X";
With Querty do
begin
 Sql.Add(ss);
 Open;
 if FieldBuName("X").AsBoolean then
   ShowMessage("=")
  else
   ShowMessage("<>");
.....


:о)


 
wl   (2005-01-13 15:24) [17]

> Kerk ©   (13.01.05 14:52) [8]
этот код тоже не работает
например,
s1 := "123";
s2 := "3";


 
4eshka)   (2005-01-13 15:36) [18]


 s1:="wwww";
 s2:=edit2.text;
 assignfile(f,s1);
 rewrite(f);
 writeln(f,s1);
 closefile(f);
 assignfile(f,s2);
{$I-}
 reset(f);
{$I+}
 case IOResult of
 0: ShowMessage("=");
 end;


 
Kerk ©   (2005-01-13 15:43) [19]

wl   (13.01.05 15:24) [17]
там xor нужен


 
Kerk ©   (2005-01-13 15:49) [20]

хотя пофиг.. совсем сегодня думалка неработает..


 
Kerk ©   (2005-01-13 15:51) [21]

хотя пофиг.. совсем сегодня думалка неработает..


 
Zeqfreed ©   (2005-01-13 15:52) [22]

Вроде работает...


function IsEqual(s1, s2 : String) : boolean;
var
r, o1, o2 : Byte;
i : Word;
begin
r := 0;
Result := true;

SetLength(s1, Max(length(s1), length(s2)));
SetLength(s2, Max(length(s1), length(s2)));

for i := 1 to Min(length(s1), length(s2)) do begin
 o1 := Ord(s1[i]);
 o2 := Ord(s2[i]);

 r := o1 xor o2;
 Result := not (Result and Boolean(r));
end;
end;


 
Zeqfreed ©   (2005-01-13 15:54) [23]

надеюсь Max без операций сравнивания можно писать?


 
Sandman25 ©   (2005-01-13 15:55) [24]

procedure Test(const s1, s2: string);
const
 Arr: array[-1..0] of string = ("<>", "=");
begin
 with TStringList.Create do
   try
     Add(s1);
     ShowMessage(Arr[IndexOf(s2)])
   finally
     Free
   end
end;


Кто найдет условный оператор или операторы сравнения, пусть бросит в меня камень :)


 
Reindeer Moss Eater ©   (2005-01-13 16:00) [25]

... Нужно как можно запутанее :)

Видимо человек пишет крутую защиту крутой программы.
Забыв при этом, что после крутой и запутанной проверки строк (никому не нужной кстати) последует один простой и некрутой и незапутанный условный переход.


 
DiamondShark ©   (2005-01-13 16:00) [26]


> Кто найдет условный оператор или операторы сравнения, пусть
> бросит в меня камень :)

А внутри TStringList.IndexOf можно искать?


 
DiamondShark ©   (2005-01-13 16:01) [27]


> Кто найдет условный оператор или операторы сравнения, пусть
> бросит в меня камень :)

А внутри TStringList.IndexOf можно искать?


 
Sandman25 ©   (2005-01-13 16:04) [28]

[26] DiamondShark ©   (13.01.05 16:00)

Конечно, нет. А то мы так и до jnz доберемся :)


 
MBo ©   (2005-01-13 16:28) [29]


function StrEQ(s1, s2: string): Boolean;
 function IsZero(i: Integer): Boolean;
 begin
   Result := Boolean((i - 1) shr 31);
 end;
 function EQStr(s1, s2: string): Boolean;
 var
   i, xr: Integer;
 begin
   xr := 0;
   for i := 1 to Length(s1)
     do Inc(xr, Byte(s1[i]) xor Byte(s2[i]));
   Result := IsZero(xr);
 end;
begin
 Result := (IsZero(Length(s1) xor Length(s2))) and EQStr(s1, s2);
end;


 
KSergey ©   (2005-01-13 16:35) [30]

>  [25] Reindeer Moss Eater ©   (13.01.05 16:00)

Вот и у меня такое-же подозрение....


 
4eshka)   (2005-01-13 16:36) [31]


> один простой и некрутой и незапутанный условный переход.

Ты его для начала найди :))


> Забыв при этом

Здесь хоть слово про защиту программы было? НЕТ. Так что не нужно глупости говорить


 
DiamondShark ©   (2005-01-13 16:40) [32]


> Sandman25 ©   (13.01.05 16:04) [28]
>
> Конечно, нет. А то мы так и до jnz доберемся :)

Было бы желание -- обойдёмся и без jnz.


 
begin...end ©   (2005-01-13 16:47) [33]

function IsEqual(const S1, S2: String): Boolean;
var
 L1, L2: Integer;
begin
 L1 := Length(S1);
 L2 := Length(S2);
 Result := False;
 try
   L1 := L1 div (L1 xor L2)
 except
   Result := CompareMem(@S1[1], @S2[1], L1)
 end
end.


 
begin...end ©   (2005-01-13 16:58) [34]

А ещё лучше так:

function New_IsEqual(const S1, S2: String): Boolean;
var
 L1, L2: Integer;
begin
 {$B-}
 L1 := Length(S1);
 L2 := Length(S2);
 Result := CompareMem(@L1, @L2, SizeOf(Integer)) and CompareMem(@S1[1], @S2[1], L1)
end.



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

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

Наверх




Память: 0.54 MB
Время: 0.043 c
4-1102563017
111
2004-12-09 06:30
2005.01.30
Перезагрузка


1-1105953089
thvfrjd
2005-01-17 12:11
2005.01.30
проблема с ExcelApplication


1-1105699329
Варава
2005-01-14 13:42
2005.01.30
QuickReport и длинные поля.


1-1106075626
Aleks
2005-01-18 22:13
2005.01.30
как из сторки скопитовать заданный символ


14-1104778763
VMcL
2005-01-03 21:59
2005.01.30
Метание гнилых помидоров и тухлых яиц