[OT] String-Konkurs dla Delphinów...

0

Witam serdecznie, o poranku :-D hehe...

Jako że uwielbiam konkursy, postanowiłem zaproponować szanownym
uczestnikom forum taki właśnie mały konkursik odnośnie Delphi.

Zadanie jest jedno i polega ono na tym a żeby
napisać funkcję zwracającą długość Stringa :-D

(Chodzi mi o normalny domyślny AnsiString w Delphi)

Warunek jest jeden: NIE WOLNO używać funkcji ani procedur z
Delphi, tzn. wszystkich tych, których opis można znaleźć pod F1.

Koniec...

Pierwszy kto wklei prawidłowy kod, wygrywa... [browar]

[<font color="blue">dopisane</span>]

Byłbym zapomniał, tacy masterzy jak np. Dryobates mogli
by się wstrzymać trochę i dać szansę innym, i proszę mi nie
mydlić oczu wstawkami Assemblera, bo nie będę mógł
zweryfikować poprawności rozwiązania... [wstyd]

0

Bardzo proszę nie mówiłeś nic o tym że nie można obsługiwać wyjątków :) Mieszkam w Łodzi więc po piwko się na pewno zgłoszę hehe :))

function MyLength(S: String): Integer;
var
 dlugosc: Integer;
begin
 try
  dlugosc := 0;
  while (True) do
  begin
   dlugosc := dlugosc + 1;
   if (S[dlugosc] = #0) then
   begin
    dlugosc := dlugosc - 1;
    Break;
   end;
  end;
  Result := dlugosc;
 except // Gdy nie podano zadnego stringa :P
  Result := 0;
 end
end;
0

Ja zaproponuje troche krótszą wersję :D

function StrLength(s:string):integer;
begin
 s:=s+#0;
 Result:=0;
 while s[Result+1]<>#0 do
  Result:=Result+1;
end;
0

Ale i tak wychodzi na to samo :P tylko że ty dodałeś #0 na wrazie czego hehe

0

A mnie się zdaje, że Cardinal(Pointer(Integer(Pointer(zmienna_typu_string))-4)^) zwróci długość stringa... Trochę debilnie wygląda takie kilkukrotne rzutowanie, ale powinno działać. Długość jest zapisana w 4 bajtach przed właściwym tekstem. Pawel podał chyba najlepsze rozwiązanie pętlowe, szybsze jest już tylko odczytanie tej długości.

0

[<font color="blue">dopisane</span>]

Byłbym zapomniał, tacy masterzy jak np. Dryobates mogli
by się wstrzymać trochę i dać szansę innym, i proszę mi nie
mydlić oczu wstawkami Assemblera, bo nie będę mógł
zweryfikować poprawności rozwiązania... [wstyd]

Uruchomilbys i mialbys od razu weryfikacje :)
Ale jak mnie nie chcecie to nie :P

Jezeli chodzi o podane rozwiazania, to my_nick najszybsze podal. Aby pozbyc sie tyle tego rzutowania wystarczy zapisac tak:
PCardinal(Cardinal(lancuch)-4)^

A co do konkursow, to powinno byc najpierw oglaszane, ze taki bedzie i o ktorej bedzie podane zadanie, bo przy tak prostych konkursach rozwiazanie mozna podac w pol minuty :)

/* Dopisane */
Tak apropos asm i weryfikacji:
asm

  
  mov eax, lancuch
  mov eax, [eax-4]
  mov dlugosc, eax

end;

Naprawde ciezko zweryfikowac? :P

0

Jezeli chodzi o podane rozwiazania, to my_nick najszybsze podal. Aby pozbyc sie tyle tego rzutowania wystarczy zapisac tak:
PCardinal(Cardinal(lancuch)-4)^

No i my_nick wygrywa [browar] Bravo [hurra]

A co do konkursow, to powinno byc najpierw oglaszane, ze taki bedzie i o ktorej bedzie podane zadanie, bo przy tak prostych konkursach rozwiazanie mozna podac w pol minuty :)

Trochę mnie to z nóg zwaliło bo ja do odczytania tych 4 bajtów
musiałem wymyślić aż coś takiego:

function MyLength(S: String): Integer;
var
  L: Byte;
  P, R: PChar;
begin
  Result := 0;
  if @S[1] <> nil then 
  begin
    L := 0;
    P := @S[1];
    R := @Result;
    while L <> 4 do 
    begin
      (R + L)^ := (P + L - 4)^;
      L := L + 1;
    end;
  end;
end;

i po to wymyśliłem konkurs...

zajęło mi to całą noc....

nie widziałem że można to zrobić w jednej linijce... ;-(

idę skoczyć z mostu... [wstyd]

[<font color="blue">dopisane</span>]

/* Dopisane */

Tak apropos asm i weryfikacji:
asm

  
  mov eax, lancuch
  mov eax, [eax-4]
  mov dlugosc, eax

end;

Naprawde ciezko zweryfikowac? :P

eeee... to jest za prosty język :-D widać
bez kompilowania że za pewne to działa...

A jak sprawdzisz w asm czy string nie jest pusty ?

0

A jak sprawdzisz w asm czy string nie jest pusty ?

function CzyNiepusty(lancuch: string): Boolean;
asm
end;

:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1