Môj program mi u seba funguje, ale keď ho submitnem, neakceptujete ho alebo je niečo zle!

Ak je submit neakceptovaný, znamená to, že si ho odoslal po skončení oficiálneho času súťaže (cvičné sady nemajú termín začiatku a konca - sú stále otvorené).

Takisto testovač vracia viacero rôznych odovedí:

Ak si dostal odpoveď Chyba počas behu programu/EXC (exception)

  • Programy musia korektne skončiť, t.j. skončiť s návratovou hodnotou 0. Ak je tvoj program v jazyku C, hlavná funkcia main() musí vracať int a posledný príkaz pred jej ukončením musí byť return 0;.
  • Skontroluj si, či tvoj program nepotrebuje viac pamäte ako dovoľuje pamäťový limit. Pamäťový limit pre úlohu býva zvyčajne 256 MB. Ak sa jej pokúsi použiť viac, nepodarí sa mu to a skončí s chybou. (Ak skoro všetku pamäť alokuješ staticky ako polia, toto spoznáš tak, že tvoj program spadne okamžite, teda čas jeho behu bude nanajvýš 2 ms.)
  • Skontroluj si, či máš dosť veľké polia na to, aby si aj najväčší možný vstup dokázal uložiť do pamäte.

Ak si dostal odpoveď Prekročený časový limit/TLE (time limit exceeded)

  • Ak zvykneš pri debugovaní dopísať do programu, aby po vypísaní výsledku počkal na stlačenie klávesy, skontroluj, či si v svojom programe takýto príkaz nezabudol (a od tohto prístupu si čo najskôr odvykni).
  • Zamysli sa nad tým, či je tvoj algoritmus skutočne dosť rýchly na to, aby ľubovoľný možný vstup vyriešil v zadanom časovom limite. Ak áno, je problém v implementácii, ak nie, chce to inú, lepšiu myšlienku.
  • Občas je pomalosť programu skrytá v príkazoch programovacieho jazyka. Napríklad spájanie dvoch reťazcov do jedného vo väčšine programovacích jazykov nefunguje v konštantnom čase, ale v čase úmernom ich dĺžkam.

Ak dostávaš odpoveď Zlá odpoveď/WA (wrong answer)

  • V prvom rade skontroluj, či výstup vypisuješ presne vo formáte uvedenom v zadaní. (Nemám tam nejaké prázdne riadky navyše? Nechýbajú mi tam nejaké? Nemám navyše medzery na koncoch riadkov? Preklepy vo vypisovaných textoch?)
  • Používaš dátový typ s dostatočne veľkým rozsahom? V C/C++ má int 32 bitov (char má 8, short 16, long 32, long long 64). V Pascale má integer len 16 bitov. Používaj longint, kde sa len dá. Pokiaľ ti 32 bitov nestačí a potrebuješ až 64 bitov, tak použi int64.
  • Vypisuješ výsledok správne? Korektný formátovací reťazec pre long long je "%lld".
  • Inicializuješ (resp. nuluješ) všetky premenné (a najmä polia), ktoré máš v programe?
  • Ešte raz si poriadne prečítaj zadanie. Aj ak si si istý, že myšlienka tvojho riešenia je správna.
  • Ešte raz poriadne skontroluj svoj program, otestuj ho na čo najviac vstupoch, vrátane okrajových prípadov. (Najmenší možný vstup? Najväčší možný vstup? Vstup špeciálneho tvaru?)
  • Naše riešenie je skoro určite správne, ale občas sa aj my zmýlime. Ak si ani po naozaj podrobnom hľadaní nenájdeš chybu a myslíš si, že je chyba asi u nás, kontaktuj nás v diskusii pod príkladom (Do diskusie pod príkladom prosím neuvádzaj svoj kód.. diskusie sú verejné a my sa k tvojmu kódu vieme dostať)

Ak pri danom vstupe dostaneš IGN (ignored)

Testovanie vašich programov prebieha po sadách. Vstupy tvaru 1.a.in, 1.b.in, ... tvoria jednu sadu. Ak tvoj program vyrieši správne všetky vstupy zo sady, dostaneš bod (niekedy aj viacero bodov za sadu). Ak však riešenie na niektorom vstupe zlyhá (hocijaká chyba TLE, WA, EXC, ...), je jasné, že za danú sadu už bod nedostane a teda sa ďalšie vstupy tejto sady odignorujú. Vďaka tomu sa menej zaťažuje testovač.

Ak si dostal odpoveď Chyba počas kompilácie

  • V C++ nezabudni po #include-och uviesť riadok "using namespace std;". Na rozdiel od niektorých (nekorektných) windowsových kompilátorov to g++ nerobí automaticky.
  • Nepoužívaj knižnice špecifické pre jeden operačný systém (napr. pascalovská knižnica Dos, C-čkové conio.h a pod.).
  • Samozrejme, poriadne si prečítaj výstup z nášho kompilátora. Pravdepodobne náš kompilátor nemá niektorú knižnicu alebo funkciu, ktorú sa snažíš použiť.
  • U seba radšej vždy kompiluj so zapnutými warningami, t.j.: gcc/g++ -W -Wall program.c[pp] fpc -Cr -Ct -Co -vew program.pas
  • Vo FreePascale nepoužívaj vnorené komentáre, t.j. napríklad kód { writeln('Test'); {!!!!!} nie je v poriadku, pri štandardnom nastavení ho FreePascal neskompiluje, lebo si myslí, že aj za znakom } ešte pokračuje komentár.

Ak si dostal odpoveď Pokus o narušenie bezpečnosti

  • Najčastejšia príčina Security exception je, že sa submitnutý program snaží otvoriť nejaký súbor. Tvoj program nesmie čítať ani vytvárať žiadne súbory, vstup má čítať "z klávesnice", výstup písať "na obrazovku".
  • Skontroluj, či nepoužívaš zbytočné knižnice alebo knižnice závislé na platforme (napr. riadok uses Crt, DOS; nemá v tvojom programe čo robiť) a či nerobíš nedovolené veci nesúvisiace s riešením úlohy (napr. nevolaj ClrScr;).

Tento článok bol naposledy zmenený: 13. júl 2016 14:31