Evaluatorul infoarena

... este responsabil de evaluarea solutiilor trimise de utilizator.

Cum se evalueaza o problema

Mai intai, codul sursa trimis de concurent se compileaza (vezi tabelul de mai jos). Apoi, solutia se evalueaza: se ruleaza programul compilat pentru diferite date de intrare (teste). In urma rularii, un program specializat decide daca raspunsul dat de solutia concurentului este corect si acord un punctaj pe masura.

Fiecare program compilat are dreptul de a rula doar un anumit interval de timp (specificat in descrierea problemei). in cazul in care timpul de executie este depasit, programul este terminat automat de sistem. Analog, se pot impune si limite de memorie.

Evaluarea se face intr-un mediu restrictionat. Programele compilate pot citi/scrie fisiere doar din/in directorul curent si nu au acces la unele functii sistem.

Compilatoare folosite

Iata lista oficiala de compilatoare folosite de evaluatorul infoarena:

Compilator si versiuneComanda de compilareExtensie implicita
GNU GCC 4.8.1gcc -DINFOARENA -Wall -O2 -static … -lmc
GNU G++ 4.8.1g++ -DINFOARENA -Wall -O2 -static … -lmcpp
FreePascal Compiler 2.4.0fpc -O2 -Xs … -dINFOARENApas
OpenJDK Java 1.5.0_55javac …, java -Xmx512m -Xss128m -DONLINE_JUDGE=true -Duser.language=en -Duser.region=US -Duser.variant=US …java

Configuratia sistemului de evaluare

  • Sistem de operare: Ubuntu 10.04.3 LTS
  • Procesor: Intel Pentium® Dual-Core CPU E6500 @ 2.93GHz
  • Memorie: 2048 MB RAM

Mesaje de evaluare

Pentru cei care nu sunt familiari cu sistemele unix sau sunt incepatori in programare, multe dintre mesajele evaluatorului pot parea oarecum criptice.

  • Eroare de sistem: Daca ai obtinut aceast mesaj te rugam sa ne contactezi, preferabil pe forum. Te rugam sa mentionezi si id-ul job-ului.
  • OK: Totul a functionat perfect.
  • Memory limit exceeded: Ai depasit limita de memorie. Majoritatea problemelor au o limita de 64 de mega, pe care noi o consideram destul de generoasa.
  • Time limit exceeded: Programul tau a depasit limita de timp. Asta inseamna ca programul tau nu este destul de rapid.
  • Wall time limit exceeded: Evaluarea a durat prea mult si a fost abandonata. Evaluatorul infoarena masoara doar timpul folosit de programul tau pentru a determina daca iti da TLE, dar exista si o limita fata de "ceasul de perete". Acest mesaj poti sa il obtii daca faci sleep, scanf de la stdin si alte functii care stau degeaba fara sa consume efectiv procesorul.
  • Blocked system call: Ai accesat o functie la care nu ai access. Nu ar trebui sa primesti aceasta functie decat daca incerci explicit sa faci ceva interzis.
  • Killed by signal: Cea mai frecventa eroare cand ai un bug in program. Cand un program incalca anumite conventii in UNIX acel program primeste un "semnal" care de cele mai multe ori il opreste. Cateva semnale comune:
    • 11(SIGSEGV): Segmentation fault. Asta in 99% din cazuri inseamna ca ai probleme cu accesul la memorie. Ai iesit din limitele unui vector, ai facut stack overflow, etc.
    • 8(SIGFPE): Floating point error. Cauzat cel mai frecvent de impartiri la 0.
  • Non-zero exit status: Programul tau a returnat o valoare diferita de 0. Cel mai probabil ai uitat return 0; sau ceva similar. Poti primi acest mesaj si in loc de mesajul "Killed by signal": verifica si dupa erorile mentionate deasupra.

Evaluatoarele problemelor iti vor da si ele un mesaj scurt, cel mai frecvent ceva de genul "OK" sau "Wrong Answer", dar unii propunatorii au umor :).

Troubleshooting

Pentru programatorii in Borland C/Pascal este important de tinut minte ca evaluatorul infoarena este un mediu foarte diferit fata de dos. Cateva erori comune si cum pot fi rezolvate

  • Pe infoarena se face I/O din fisiere, nu de la stdin, stdout (cu exceptia problemelor interactive). Daca faci scanf de la stdin vezi obtine cel mai probabil "Wall time limit exceeded" (vezi mai sus) iar daca faci printf la stdout rezultatul tau va fi ignorat.
  • tipul int din GCC este pe 32 de biti, nu 16 ca in Borland C/C++, char - 8 biti, short - 16 biti, long - 32, long long - 64
  • folositi sprintf in loc de itoa sau ltoa.
  • programul de evaluare ruleaza pe un sistem de operare UNIX. Folositi "\n" pentru terminarea liniei curente, nu "\r\n"
  • aveti grija ca functia main sa fie de tip int si sa intoarca 0 (return 0;)
  • nu folositi librarii dependente de sistemul de operare (ex. dos.h, graphics.h in C sau dos, crt, graph in pascal). Aceste librarii nu sunt necesare pentru a rezolva problemele de pe infoarena.
  • nu folositi modificatorii far, huge, _huge, __huge pentru ca nu exista in GCC. De asemenea, nu exista nici functiile care folosesc aceste tipuri de date (de ex. farmalloc, farfree etc.) si nici conceptul de memory model (tiny, small, medium, large, huge). De toate acestea nu mai e nevoie intrucat puteti avea acces la toata memoria prin functii standard si pointer-i standard - new, delete, malloc etc.