Сейчас на форуме: Magister Yoda, subword (+9 невидимых)

 eXeL@B —› Основной форум —› Реверсинг небольшой функции на делфи
Посл.ответ Сообщение

Ранг: 26.6 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 21 октября 2008 12:09
· Личное сообщение · #1

Code:
  1. function GetBlockName(NumX, NumY: integer; const Level: integer): string;
  2. var d, i: integer;
  3. begin
  4.   d := round (power (2, Level-1));
  5.   if (NumX < 0) or (d-1 < NumX) then begin
  6.     NumX:= NumX mod d;
  7.     if (NumX < 0) then NumX:= NumX + d;
  8.   end;
  9.   Result := 't';
  10.   for i := 2 to Level do begin
  11.     d := d shr 1; // = d div 2
  12.     if (NumY < d) then begin
  13.       if (NumX < d)
  14.         then Result:= Result + 'q'
  15.         else begin Result:= Result + 'r'; NumX:= NumX - d; end;
  16.     end
  17.     else begin
  18.       if (NumX < d) then Result:= Result + 't'
  19.         else begin Result:= Result + 's'; NumX:= NumX - d; end;
  20.       NumY:= NumY - d;
  21.     end;
  22.   end;
  23. end;


эта функция позволяет получить имя блока гуглмапс по его координатам и уровня зуминга. Вот реальный пример: GetBlockName(5,10,5) = 'ttrtr'. Мне же надо обратную оперцию: из 'ttrtr' получить эти три числа - 5, 10, 5. Level узнать легко = длине строки. Первая буква всегда 't'. Дальше проблемы Вроде алго простой, но ума не дам - помогите!



Ранг: 210.5 (наставник), 2thx
Активность: 0.140
Статус: Участник

Создано: 21 октября 2008 15:29 · Поправил: arnix
· Личное сообщение · #2

Code:
  1. program Project1;
  2. {$APPTYPE CONSOLE}
  3. uses
  4.   SysUtils,
  5.   Math;
  6. var
  7.   qrst: String;
  8.   N, L: Integer;
  9.   x, y, i: Integer;
  10. begin
  11.   qrst := 'ttrtr';
  12.   N := Length(qrst);
  13.   L := Round(Power(2, N - 1));
  14.   x := 0;
  15.   y := 0;
  16.   for i := 2 to N do begin
  17.     writeln(qrst[i]);
  18.     if qrst[i] = 'r' then begin
  19.       x :=  x + (shr 1);
  20.     end else if qrst[i] = 's' then begin
  21.       x := x + (shr 1);
  22.       y := y + (shr 1);
  23.     end else if qrst[i] = 't' then begin
  24.       y := y + (shr 1);
  25.     end;
  26.     L := L shr 1;
  27.   end;
  28.   writeln(x, ', ', y, ', ', N);
  29. end.




Ранг: 26.6 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 21 октября 2008 15:36
· Личное сообщение · #3

arnix
Спасибо!! Вот что значит иметь мозги на месте



Ранг: 210.5 (наставник), 2thx
Активность: 0.140
Статус: Участник

Создано: 21 октября 2008 15:37
· Личное сообщение · #4

пожалуйста

я подправил алго так что еще раз бери


 eXeL@B —› Основной форум —› Реверсинг небольшой функции на делфи
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати