vložil Radek Červinka
15. července 2010 23:17
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.