Delphi.cz

Český portál Delphi

Malá soutěž v programování - aktualizace

Zkusíme to jinak. Nechal jsem se inspirovat v zahraničí a uděláme takovou malou soutěž. Já navrhnu zadání (dostatečně lehké) a Vy zkusíte poslat implementaci části programu, která bude provádět zadání. Pro normálního programátora cca 1-2 hodiny práce. Doufám, že to zkusíte.

Cílem je porovnat různé řešení a hlavně začátečníkům ukázat jak to dělají jiní. Budou vyhlášeni dva vítězové:

  • nejrychlejší řešení (tj. program s nejvyšší rychlostí)
  • cena poroty (to jako já :-)) za eleganci nebo čistotu a tak podobně, inspirace začátečníkům

Druhá cena nemusí být vyhlášena (málo účastníků, autor už vyhrál první cenu …).

Uzávěrka je 29.7.2010 23:59. Řešení zasílejte přes kontaktní formulář.

Pravidla:

  • nesmí se měnit rozhraní uvedené v šabloně
  • výsledek bude kompilován na Delphi 2010, tj. můžete použít cokoliv co Delphi nabízí (v případě, že Váš kód nepůjde přeložit, lehce ho upravím - tedy pokud to dokáži - ale to snad nebude problém)
  • assembler není zakázán, ale takový kód nikdy nevyhraje cenu poroty
  • nesmí se používat globální proměnné kromě uvedených v šabloně
  • vlákna povolena (ale v tomto úkolu asi na nic), inline taky, optimalizace taky, prostě cokoliv
  • špatný výpočet (výsledná hodnota je tajná) nebo zacyklení program samozřejmě diskvalifikuje

Ceny:

  • autor vítězného kódu bude uveden spolu s jeho kódem
  • nemůžu nabídnout nic jiného než PDF verzi delphi.cz (prodává se za 150,-)
  • nově i hrneček

Zadání

Implementujte naznačenou funkci CountDigit tak, že převezme předaný text a provede na něm tyto operace:

  • 1) pokud je znakem číslo 0 - 9, tj. ASCII hodnoty čísla nikoliv bajty 0 - 9, připočte hodnotu čísla (tedy pro znak 5 připočte číslo 5)
  • 2) jiné znaky ignoruje
  • 3) pokud po popsaném sečtení všech znaků výsledné číslo více než jednociferné, tj. např. číslo 13 je proveden součet jeho číslic, tj. 1+3=4 (v podstatě bod 1). Toto se opakuje dokud nezůstane jednociferné číslo (např. 6). Tato hodnota se vrátí - tj. číslo 6 nikoliv znak '6'.

Příklad

Máme 456h7896 2. Tj. 4+5+6+7+8+9+6+2 = 47 -> 4+7 = 11 -> 1 + 1 = 2. Výsledek je číslo 2.

Nápověda

Pozor na předávané hodnoty, hodně se tak dá optimalizovat. Prohlédněte si vstupní data, můžete tak něco ušetřit (všechna data jsou na jednom řádku - jeden řádek textu a ten má rozumnou délku). TStringList je použit schválně.

Data

Stáhněte si soubor data.zip, po rozbalení vznikne data.txt. Tento soubor bude použit i pro výsledný test. Snad jsem na nic nezapomněl.

Aktualizace - demo projekt ke stažení projekt.zip

Šablona

program Project1;
{$APPTYPE CONSOLE}
{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}
{$STRINGCHECKS OFF}
{$INLINE ON}
{$O+}

uses
  Sysutils,
  windows,
  classes;

function CountDigit(const lst: TStrings):Integer;
begin
//  Result je výsledek
end;

var
  lst: TStringList;
  i:Integer;
  tick, tickend: Cardinal;
  iResult: Integer;
begin
  lst := TStringList.Create;
  try
    lst.LoadFromFile('data.txt');
    tick:= GetTickCount;
    iResult := 0;
    for i := 1 to 10000000 do
      Inc(iResult, CountDigit(lst));
    tickend := GetTickCount;
    writeln(Format('Result = [%d], Time = [%d]', [iResult, tickend - tick]));
  finally
    FreeAndNil(lst);
  end;
end.

Datum: 2010-07-15 22:17:00 Tagy: delphi, verze, optimalizace

soutez