Dla tych, co się nudzą...

0

Witam wszystkich, podczas pracy nad obecym projektem musiałem rozwiązać pewien problem, którego implementacja w Object Pascalu zajęła mi ok. 20 minut; Z racji tej, że temat problemu jest dość ciekawy - ogłaszam konkurs; Opis problemu poniżej:

Uwaga! Temat ten nie jest związany z żadnym wyłudzaniem kodu na jakieś zaliczenie! Nie chodzę ani do szkoły, nie studiuję ani nawet nie pracuję na stanowisku, które jest związane z programowaniem; W załączniku zamieszczam skompilowany moduł zawierający tylko i wyłącznie moją fukcję; Deklaracja funkcji to:
function AddBytesPhrase(sSize: ShortString): ShortString;

Napisać funkcję, która do podanej w parametrze liczby będzie dodawać słowo bajtów ale w taki sposób, by słowo było poprawnie odmieniane (jak to w polskiej mowie) przy każdej podanej liczbie, np:

Wejście Wyjście '1' '1 bajt' '2' '2 bajty' '4' '4 bajty' '5' '5 bajtów' ... '22' '22 bajty' ... '272734643' '272734643 bajty' ...

a także spełniać następujące warunki:

  • funkcja posiada jeden parametr - łańcuch znaków, który stanowi dowolną naturalną i nieujemną liczbę (typ ShortString), długość liczby max. 255 znaków
  • wartością zwracaną przez funkcję jest łańcuch, który stanowi podaną w parametrze liczbę + znak spacji + słowo bajów w odpowiedniej odmianie
  • funkcja nie może wykorzystywać gotowej funkcji realizującej zadanie (choć chyba takiej w kompilatorze nie ma :)) ani korzystać z żadnego dodatkowego modułu prócz System (brak bloku uses)
  • funkcja może wykorzystywać jedynie systemowe funkcje Ord i Length
  • funkcja nie może posiadać żadnych lokalnych stałych, zmiennych, typów itd. i nie może korzystać z globalnych
  • w ciele funkcji każda instrukcja musi być w osobnej linii, także po else
  • musi być jak najszybsza i posiadać jak najmniej instrukcji
  • funkcja nie może posiadać instrukcji inicjalizującej wartość początkową rezultatu, a pomimo tego kompilator nie wyświetla hint'a o jej braku (inicjalizacji)
  • długość kodu stanowi pełna definicja funkcji (nagłówek funkcji wraz z blokiem begin end w osobnych liniach)

To tyle, jeśli chodzi o warunki; Jeżeli chodzi o nazewnictwo - jest dowolne; Implementacja nie powinna zająć długo czasu, ale jest ciekawą zagadką;

Dodam, że moja funkcja posiada 24 linie bez linii pustych i spełnia wszystkie wyżej wypunktowane warunki;

Kod udostępnie po tym, jak ujżę kod szybszy od mojego i który spełnia wszystkie warunki;

Zachęcam do udziału; Do wygrania... nie wiem, dobre piwo postawię on-line :)
Czekam na kody, pozdrawiam;

EDIT: Poprawiłem wyjście, bo źle napisałem... :)

0

Nie ten poziom... To chyba powinieneś postnąć w dziale newbie...
Z drugiej strony byli tacy co fizzbuzza zrobić nie mogli...

Monku, chyba mamy algorytm na następny test..

Furious Programming napisał(a)

w Object Pascalu
Już widzę jak z widowni zrywają się tłumy

Furious Programming napisał(a)

zajęła mi ok. 20 minut; Z racji tej, że temat problemu jest dość ciekawy
lol

0
Kerai napisał(a)

Nie ten poziom... To chyba powinieneś postnąć w dziale newbie...

Poziom nie poziom, dla Ciebie to pewnie łatwe;

Kerai napisał(a)

Już widzę jak z widowni zrywają się tłumy

Nie musi być tłumów, chciałbym zobaczyć różne rozwiązania;

1

No dobra, to gdzie jest ten drugi programista Object Pascala? Wszyscy go chętnie poznamy.

0

Jakiś argument za tym żeby nie używać zmiennych lokalnych? Jak będzie ich mało to i tak kompilator je upchnie w rejestrach procesora. Zresztą owe rejestry i tak będą czymś tam zapchane, obojętne jaki kod sklecisz. Poza tym czy przewidziałeś np taką sytuację:

funkcja(input: string) {
chytrafunkcja(string, 0, 0, 0)
}
chytrafunkcja(input: string, a: int, b: int, c: int)

Czy parametry funkcji wliczasz do zmiennych lokalnych?

0

Em...
Chodzi o takie coś (to jest akurat cały program):
Wersja 1:

Function C(A:String):String;
Var I: Integer;
Begin
 I := Length(A);
 if (I = 1) And (A[I] = '1') Then
  C := 'bajt' else
 if (A[I]='1') or (A[I] = '5') or (A[I] = '6') or (A[I] = '7') or (A[I] = '8') or (A[I] = '9') or (A[I] = '0') Then
  C := 'bajt˘w';
 if (A[I]='2') or (A[I]='3') or (A[I]='4') Then
  C := 'bajty';
End;
Begin
 WriteLn(C('1024'));
 ReadLn;
End.

Wersja 2:

Function C(A:String):String;
Begin
 if (Length(A) = 1) And (A[Length(A)] = '1') Then
  C := 'bajt' else
 if (A[Length(A)]='1') or (A[Length(A)] = '5') or (A[Length(A)] = '6') or (A[Length(A)] = '7') or (A[Length(A)] = '8') or (A[Length(A)] = '9') or (A[Length(A)] = '0') Then
  C := 'bajtów';
 if (A[Length(A)]='2') or (A[Length(A)]='3') or (A[Length(A)]='4') Then
  C := 'bajty';
End;
Begin
 WriteLn(C('1024'));
 ReadLn;
End.

?

0

Imo to nie jest ciekawy problem. Ciekawe to może być np. napisanie protokołu sieciowego do wymiany informacji korzystając jedynie z TCP lub XML. Albo np. efektywny algorytm znajdowania liczb pierwszych.

EDIT:
Albo mam ciekawszy pomysł. Napisać funkcję odwracania bajtów (konwersja z Little Endian na Big Endian). To jest coś na Twój poziom ;)

4
somekind napisał(a)

No dobra, to gdzie jest ten drugi programista Object Pascala? Wszyscy go chętnie poznamy.

4 lata temu nauczyłem się c++

0
Sarrus napisał(a)

Albo mam ciekawszy pomysł. Napisać funkcję odwracania bajtów (konwersja z Little Endian na Big Endian). To jest coś na Twój poziom

Zadanie jest proste, owszem, aleto nie znaczy, że jest dla mnie trudne, wręcz zprzeciwnie, takie zadania rozwiązywałem na pierwszym roku w TI, więc 6 lat później tym bardziej jest to pryszcz;

Wibowit napisał(a)

Jakiś argument za tym żeby nie używać zmiennych lokalnych?

Nie potrzeba; Świat się nie zawali jak się ich użyje;

Wibowit napisał(a)

Czy parametry funkcji wliczasz do zmiennych lokalnych?

Nie wliczam, parametry to osobna sprawa;

Patryk27 napisał(a)

Chodzi o takie coś (to jest akurat cały program):

Druga wersja była by, ale masz zbyt dużo instrukcji warunkowych, wystarczą 4 (bez instrukcji przypisania Length do zmiennej);

EDIT dla tych oburzonych:
Napisałem go w Off bo rozwiązanie znam i nie czekam na czyjś kod, by go chytrze wykorzystać w swoim programie;
A czy to zadanie to nie jest jak z głupiego FizzBuzz? Przecież, że tak; Jak szanowny kolega @Demonical Monk w maju taki zrobił, to też tak mu pisaliście..? Chyba, że na nim poruszane były problemy milenijne, to zamykam gębę; W szkołach na zaliczenie jest pełno głupszych do niczego nie przydatnych programików, ten - nie jest do rysowania trójkątów w konsoli, może się nada;

@Wibowit zapytał, Patryk27 dał kod; Zdaje się, że jest dwóch zainteresowanych;

0
Furious Programming napisał(a)

Jak szanowny kolega @Demonical Monk w maju taki zrobił, to też tak mu pisaliście..? Chyba, że na nim poruszane były problemy milenijne, to zamykam gębę; W szkołach na zaliczenie jest pełno głupszych do niczego nie przydatnych programików, ten - nie jest do rysowania trójkątów w konsoli, może się nada;

Ale to był dobrze zorganizowany eksperyment który miał konkretny cel - udowodnić że nawet programista-ekspert może czasami nie dać rady z tak prostym zadaniem przy pierwszym podejściu ;)

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