Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: StEval  (Citit de 4068 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
StTwister
Client obisnuit
**

Karma: 11
Deconectat Deconectat

Mesaje: 86



Vezi Profilul
« : Martie 28, 2006, 15:29:12 »

Citat
StEval
~~~~~~
Program pentru evaluarea automata a problemelor de informatica de tip concurs.


Utilizare:
----------
Apasati dulbu click in dreptul casutei "Calea executabilului" pentru a selecta fisierul (compilat) pe care vreti sa-l evaluati. Acesta trebuie sa se afle in acelasi director cu fisierele de test.

Majoritatea fisierelor de test au formatul 0-numeproblema.in, 1-numeproblema.in etc. In cazul in care numele testelor este in alt format, acesta poate fi modifcat utilizand cele doua variabile %i% si %nume%. De exemplu, pentru fisiere in format "numeproblema.1in", "numeproblema.1ok", va trebui sa setati formatul in modul urmator: "%nume%.%i%in", respectiv "%nume%.%i%ok", setand "numeproblema" ca numele problemei, iar indicele incepand de la 1.

In cazul in care alegeti numarul de teste 0, programul va incrementa indicele fisierului de intrare pana cand fisierul respectiv nu va mai fi gasit.

In fereastra cu rezultatul evaluarii, puteti apasa dublu click pe un test cu raspuns gresit pentru a vedea fisierul de intrare, rezultatul asteptat si rezultatul returnat pentru a face o comparatie intre ce trebuia returnat si ce a returnat programul.


Contact:
--------
Felix Kerekes
Email: [email protected]




Download aici

Sugestii si critici (de preferat pozitive) sunt bine primite

PS: Include sursa in Delphi

 Wink
Memorat
devilkind
Echipa infoarena
Nu mai tace
*****

Karma: 284
Deconectat Deconectat

Mesaje: 1.240



Vezi Profilul
« Răspunde #1 : Martie 28, 2006, 16:03:26 »

thx dude, chiar aveam nevoie de un evaluator cu care sa imi testez sursele, ms  Spiteful
Memorat
cristi8
Vizitator
« Răspunde #2 : Martie 28, 2006, 16:19:01 »

cum faci verificarea outputului in caz ca sunt mai multe raspunsuri bune ?

sugestie: adauga optiunea "verificator:"
Memorat
StTwister
Client obisnuit
**

Karma: 11
Deconectat Deconectat

Mesaje: 86



Vezi Profilul
« Răspunde #3 : Martie 29, 2006, 11:56:51 »

Am mai facut niste imbunatatiri in versiounea 1.1

Citat
Exista patru moduri de evaluare a problemelor:
1. Numere intregi - programul va citi cate un numar intreg pe rand din cele doua fisiere pana cand se gasesc rezultate diferite sau se ajunge la sfarsitul unuia din fisiere
2. Text - programul verifica byte cu byte fiecare linie a celor doua fisiere
3. Numere reale - programul va citi cate un numar intreg pe rand din cele doua fisiere pana cand se gasesc rezultate diferite (cand diferenta din cele doua numere citita in modul este mai mica decat "Eroare maxim admisa") sau se ajunge la sfarsitul unuia din fisiere
4. Verificator - programul va apela programul verificator impreuna cu trei parametrii (fisierul de intrare, fiserul de iesire si fisierul .ok) si va citi codul de iesire al acestuia (codul returnat de functia main() sau de API-ul ExitProcess). Daca acesta este 0, atunci rezultatul este corect, altfel, rezultatul este incorect iar programul evaluator va afisa in dreptul testului respectiv codul de iesire al progamului verificator.


Download aici
Memorat
bogdan2412
Echipa infoarena
Nu mai tace
*****

Karma: 410
Deconectat Deconectat

Mesaje: 951



Vezi Profilul
« Răspunde #4 : Martie 29, 2006, 12:54:41 »

Ar fi super tare daca l-ai face pentru linux Smile... Parca exista ceva genu Kylix de la Borland pt Delphi in Linux... Cred ca se poate porta destul de usor  Confused
Memorat
StTwister
Client obisnuit
**

Karma: 11
Deconectat Deconectat

Mesaje: 86



Vezi Profilul
« Răspunde #5 : Martie 29, 2006, 13:32:31 »

Esti a treia persoana care-mi cere lucrul asta. Din pacate, cunostintele mele despre programarea in linux sunt sub zero.

Oricum, presupun ca in linux se poate face foarte usor cu un bash script, de catre cineva cu experienta.

Chiar daca exista Kylix si Lazarus pentru Linux, care seama extrem de mult cu Delphi, sistemul de process-handling este complet diferit. M-am documentat un pic si am citit undeva ca nu exista corespondent WaitForSingleObject in Linux. Asta complica putin lucrul cu masurarea timpului/terminarea unui proces care a depasit limita de timp. Poate ma ajuta cineva cu experienta in Linux...
Memorat
Coty
Nu mai tace
*****

Karma: 6
Deconectat Deconectat

Mesaje: 235



Vezi Profilul WWW
« Răspunde #6 : Martie 30, 2006, 07:46:47 »

Are UpTheWall un evaluator de linux in bash (tipul cu convertorul de fisiere in/out)... i-am zis deja si o sa il publice (daca n-a facut-o deja) dar trebuie s a il comenteze putin sa inteleaga lumea ce si de ce face asa Wink
Memorat
upthewall
Vizitator
« Răspunde #7 : Aprilie 03, 2006, 14:21:06 »

Are UpTheWall un evaluator de linux in bash (tipul cu convertorul de fisiere in/out)... i-am zis deja si o sa il publice (daca n-a facut-o deja) dar trebuie s a il comenteze putin sa inteleaga lumea ce si de ce face asa Wink

Este posibil ca evaluatorul sa primeasca o interfata online (mai la vara, mai la vara..), lumea sa-si trimita testele ca un zip, pe langa surse si sa primeasca rezultatele, dar nu garantez ca fi prea curand - asta o voi face pe serverul meu www.informatrix.ro de linux, si va folosi evaluatorul facut in bash.
Mai curand, voi publica sursa evaluatorului facut in bash, comentat, etc, pentru ca toata lumea sa inteleaga exact cum se foloseste (nu e greu Smile ) si sa aveti si in linux asa ceva.
O sa public sursa in curand la http://informatrix.ro/informatica/eval.php
Pot deja sa fac niste instructiuni de folosire rapide:
    *  se ruleaza cu ./eval LIMITA_IN_SECUNDE NUMELE_PROGRAMULUI 2>/dev/null
Limita in secunde este 'reala', deci puteti folosi 0.1 desi pentru 0.1 este de preferat sa folositi 0.15 sau asa ceva, ca variaza.
De asemenea numele programului va fi gigel daca ai gigel.pas sau gigel.cpp sau gigel.c (vor fi mai multe variante pt pascal, C, C++ - oricum foarte asemanatoare ca cod), si directorul cu teste trebuie sa se numeasca tot gigel.
    *  de retinut, programul compileaza singur sursa ( in functie de limbajul caruia ii este destinat) si o sterge cand a terminat de evaluat.
In directorul cu teste se vor gasi teste de forma 0-gigel.in  0-gigel.ok    1, 2, 3, etc (merg si pana la 50).
Din orice fel de teste este posibila transformarea acestora in teste in formatul dorit, folosind convertorul meu de teste: http://infoarena.devnet.ro/forum/index.php/topic,898.0.html
Memorat
StTwister
Client obisnuit
**

Karma: 11
Deconectat Deconectat

Mesaje: 86



Vezi Profilul
« Răspunde #8 : Ianuarie 13, 2007, 17:00:12 »

Mai are careva cumva arhiva sa mi-o trimita si mie la [email protected] ?

Eu nu o mai am pe calc din oarecare motive, si vad ca pe rapidshare nu mai e...

Mersi mult
Memorat
TYTUS
Strain


Karma: 5
Deconectat Deconectat

Mesaje: 24



Vezi Profilul
« Răspunde #9 : Ianuarie 15, 2007, 21:04:47 »

Evaluatorul care-l folosesc eu. Nu e cine stie ce dar isi face treaba.
Pentru instalare copiati codul de mai jos intr-un fisier numit jlaunch.cpp
Cod:
/*
        SAE
        ----------------------
        jlaunch.cpp
        Cristian George Strat
*/

/**
        argv
                1       binary file to execute
                2       uid for impersonation
                3       time limit (float, seconds)
                4       directory to chroot()

        :WARNING:
                Binaries must be statically compiled since chroot() denies access
                to shared libraries.

        returns
                0               execution successful
                200             execution timed out
                210             unknown run-time error
                100-199 known run-time error (exitcode = 100 + WTERMSIG(status))
*/

/* #define VERBOSE */
/* #define PROFILING */

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>
#include <wait.h>
#include <sys/resource.h>

#include <math.h>

#ifdef PROFILING
#include <sys/time.h>
#endif

#define MBM     (1 << 20)
/* #define LIMIT_STACK_SIZE */

double datalimit = 63., stacklimit = 1.;

void die(char *msg) {
        printf("%s\n", msg);
        exit(255);
}

int main(int argc, char *argv[], char *envp[]) {
#ifdef PROFILING
        rusage ru;
#endif

        pid_t child;    /* child that loses privileges and executes argv[1] */
        pid_t timer;    /* child timer */
        uid_t nuid;             /* uid assigned to child */
        pid_t who;

        char cmd[250];
        int exitcode = 0;
        int status;

        /* failsafe */
        if (5 > argc) die("not enough arguments\n");

        /* -- spawn child ---------------------------------------- */
        child = fork();
        if (!child) {
                /* child process here */

                rlimit rl;

                /* limit number of processes */
                rl.rlim_cur = rl.rlim_max = 2;
                setrlimit(RLIMIT_NPROC, &rl);

                /* limit memory */
#ifdef LIMIT_STACK_SIZE
                rl.rlim_cur = rl.rlim_max = (int)ceil(datalimit * MBM);
                setrlimit(RLIMIT_DATA, &rl);
                rl.rlim_cur = rl.rlim_max = (int)ceil(stacklimit * MBM);
                setrlimit(RLIMIT_STACK, &rl);
#endif
                rl.rlim_cur = rl.rlim_max = (int)ceil((stacklimit + datalimit) * MBM);
                setrlimit(RLIMIT_AS, &rl);

                /* chroot */
                chroot(argv[4]);

                /* lose admin privileges */
#ifdef VERBOSE
                printf("child: renunt la permisiuni\n");
#endif
                nuid = strtol(argv[2], NULL, 10);
                setuid(nuid);

#ifdef VERBOSE
                printf("child: ma transform\n");
#endif
                execve(argv[1], argv, envp);
        }

        /* -- spawn timer ----------------------------------------- */
        timer = fork();
        if (!timer) {
#ifdef VERBOSE
                printf("timer: cronometrez %d\n", child);
#endif
                /*
                        :TODO:
                        sleep could be done through a system call
                */
                sprintf(cmd, "sleep %s", argv[3]);
                system(cmd);

#ifdef VERBOSE
                printf("timer: am terminat\n");
#endif

                exit(200);
        }

        /* -- main thread ----------------------------------------- */
#ifdef VERBOSE
        printf("tata: astept sa termine cineva...\n");
#endif

#ifdef PROFILING
        who = wait4(-1, &status, 0, &ru);
        printf("PROFILING: wait4 finished with. utime: %d s, %d us; stime: %d s, %d us\n", ru.ru_utime.tv_sec, ru.ru_utime.tv_usec, ru.ru_stime.tv_sec, ru.ru_stime.tv_usec);
#else
        /* waits for a single child process (it doesn`t matter which one) */
        who = wait4(-1, &status, 0, NULL);
#endif

#ifdef VERBOSE
        printf("tata: am asteptat destul -> %d ...\n", who);
#endif

        if (!who) return 200;   /* weird error, this shouldn`t happen */

        if (timer == who) {
#ifdef VERBOSE
                printf("tata: timer a terminat primul, omor child (%d)\n", child);
#endif
                /* timer finished first -> execution timed out */
                kill(child, SIGKILL);

                return 200;
        }
        else {
#ifdef VERBOSE
                printf("tata: child a terminat primul, omor timer (%d)\n", timer);
#endif
                /* analyze why child terminated */
                if (!WIFEXITED(status)) {
                        if (WIFSIGNALED(status)) exitcode = (100 + WTERMSIG(status));
                        else exitcode = 210;
                }
                else exitcode = 0;

#ifdef VERBOSE
                printf("tata: exitcode = %d\n", exitcode);
#endif

                /* child process finished first -> execution is ok, kill timer */
                kill(timer, SIGKILL);

                return exitcode;
        }
}
Si codul urmator intr-un fisier "eval.pl"
Cod:
$a1=@ARGV[0];
if ( ($a1 ne "help" && $a1 ne "config" && $a1 ne "c" && $a1 ne "pascal" && $a1 ne "setup") ) {
        print ("Mod de folosire:\n");
        printf ("\tperl eval.pl setup        : Compileaza fisierul jlaunch.cpp necesar la testare\n");
        print ("\tperl eval.pl help          : Afiseaza informatii referitoare la modul de folosire\n");
        print ("\tperl eval.pl config        : Configureaza evaluatoru\n");
        print ("\tperl eval.pl p fisier.pas  : Testeaza un program scris in Pascal\n");
        print ("\tperl eval.pl c fisier.cpp  : Testeaza un program scris in C++\n");
        exit();
}

if ($a1 eq "setup") {
        if (!( -e "jlaunch.cpp") ) {
                print ("Fisierul jlaunch.cpp nu exista. Probabil l-ati sters sau nu l-ati descarcat. Daca nu il mai aveti\ntrimiteti un email la [email protected]");
                exit();
        }
        if (-e "run") {
                print ("Evaluatorul a mai fost instalat odata\n");
                exit();
        }
        exec ("g++ -o run jlaunch.cpp\n");
        printf ("Evaluatorul a fost instalat cu succees\n");
        exit();
}

if ($a1 eq "help") {
        printf ("======================================\n");
        print ("Evaluator versiunea 1.0\n");
        print ("Autor: Vlad Saveluc\nLicenta: GPL (http://www.gnu.org/copyleft/gpl.html)\n");
        print ("=======================================\n");
        print  ("Instructiuni de utilizare:\n");
        print ("1. Inainte de a testa surse programul trebuie configurat.\n");
        print ("\taceasta se realizeaza prin comanda:\n\t\t'perl eval.pl config'\n");
        printf ("\tProgramul va genera un fisier config.txt folosit mai tarziu la testare.\n");
        printf ("\tVor trebui introduse date referitoare la numarul de teste, denumirea \n\tfisierelor de intrare/iesire etc.\n");
        printf ("2. Testele se vor afla intr-un director cu teste definit la configurare\n");
        printf ("\tFisierele vor fi denumite 0.in, 1.in ... respectiv 0.ok, 1.ok ...\n");
        printf ("\tFisierele .ok sunt necesare doar in cazul in care validarea outputului\n");
        printf ("\tse face print diferenta de fisiere\n");
        printf ("3. Daca verificarea este realizata de un verificator acesta va trebui sa scrie intr-un fisier ver.ok\n");
        printf ("\t1- daca rezultatul este corect, 0- daca este gresit. !!! ver.ok va avea o singura linie\n");
        printf ("3.1 Utilizatorul sub care este rulat evaluatorul va trebui sa aiba drepturi de executare a verificatorului\n");
        printf ("\tAceasta se face prin: 'chmod 700 nume_verificator'\n");
        printf ("4. Dupa ce a fost configurat, programul poate testa programe scrise in C sau Pascal astfel\n");
        printf ("\tperl eval.pl c nume_fisier    - Pentru programe in C++\n");
        printf ("\tperl eval.pl p nume_fisier    - Pentru programe scrise in Pascal\n");
        printf ("5. Rezultatele evaluarii se vor gasi intr-un fisier definit la configurare\n");
        exit();
}


if ($a1 eq "config") {
        print ("Sunteti sigur ca doriti sa (re)configurati evalutorul (configuratia trecuta se va pierde) ? (DA/NU)\n");
        $ans=<STDIN>;
        while ($ans ne "DA\n" && $ans ne "NU\n") {
                print ("Raspunsul nu este valid. Mai incercati (trebuie scris cu masjuscule)\n");
                $ans=<STDIN>;
        }
        if ($ans eq "NU\n") {exit();}
        open (fout,">config.txt");
        print ("Problema va avea verificator (daca nu, se va verifica print diferenta de fisiere? (DA/NU)\n");
        $ans=<STDIN>;
        while ($ans ne "DA\n" && $ans ne "NU\n") {
                print ("Raspunsul nu este valid. Mai incercati (trebuie scris cu masjuscule)\n");
                $ans=<STDIN>;
        }
        print fout ("$ans");
        if ($ans eq "DA\n") {
                printf ("Dati denumirea executabilului verificatorului\n");
                $ans=<STDIN>;
                chomp($ans);
                while ( !( -e $ans) ) {
                        if ($ans eq "a.out") {printf ("a.out este fisier rezervat\n");}
                        else {printf ("Acest fisier nu exista. Mai incercati (CTRL + C pentru a iesi)\n");}
                        $ans=<STDIN>;
                        chomp($ans);
                }
                print fout ("$ans\n");
        }
        printf ("Directorul in care se gasesc testele este: \n");
        $ans=<STDIN>;
        chomp($ans);
        while ( !(-d $ans) ) {
                printf ("Directorul $ans nu exista. Mai incercati (CTRL + C pentru iesi)\n");
                $ans=<STDIN>;
                chomp($ans);
        }
        print fout ("$ans\n");
        printf ("Numarul de teste (divizor de 100)");
        $ans=<STDIN>;
        print fout ("$ans");
        printf ("Denumirea fisierului de intrare:");
        $ans=<STDIN>;
        print fout ("$ans");
        printf ("Denumirea fisierului de iesire:");
        $ans=<STDIN>;
        print fout ("$ans");
        printf ("Timp de executie: ");
        $ans=<STDIN>;
        print fout ("$ans");
        printf ("Comanda de compilare in C++ (recomandat 'g++') ");
        $ans=<STDIN>;
        chomp($ans);
        print fout ("$ans\n");
        printf ("Comanda de compilare in pascal (recomandat 'fpc') ");
        $ans=<STDIN>;
        chomp($ans);
        print fout ("$ans\n");
        printf ("Fisierul in care vor fi scrise rezultatele evaluarii (borderoul):");
        $ans=<STDIN>;
        print fout ("$ans");
}


if ($a1 eq "c" || $a1 eq "p") {
        $file=@ARGV[1];
        unless (-e "run") {
                printf ("Evaluatorul nu a fost instalat\n");
                printf ("Rulati 'perl eval.pl setup'\n");
                exit();
        }
        unless (-e "config.txt") {
                printf ("Evaluatorul nu a fost configurat\n");
                exit();
        }
        if ($file eq "") {
                printf ("Trebuie sa specificati fisierul sursa ce va fi evaluat\n");
                printf ("Rulati 'perl eval.pl' pentru mai multe detalii\n");
                exit();
        }
        unless (-e $file) {
                printf ("Fisierul $file nu exista\n");
                exit();
        }

        $fin="config.txt";
        open(fin);
        @data=<fin>;
        close(fin);
        foreach (@data) {
                chomp($_);
        }
        $type=@data[0];
        my $ver,$tdir,$nt,$in,$out,$tl,$comp_c,$comp_p,$borderou;
        $tl=0.0;
        if ($type eq "DA") {
                $ver=@data[1];
                $tdir=@data[2];
                $nt=@data[3];
                $in=@data[4];
                $out=@data[5];
                $tl=@data[6];
                $comp_c=@data[7];
                $comp_p=@data[8];
                $borderou=@data[9];
        }
        else {
                $tdir=@data[1];
                $nt=@data[2];
                $in=@data[3];
                $out=@data[4];
                $tl=@data[5];
                $comp_c=@data[6];
                $comp_p=@data[7];
                $borderou=@data[8];
        }
        open (fout,">$borderou");
        $ppt=100/$nt;
        #Partea de compilare
        if ($a1 eq "c") {
                system ("$comp_c $file 2>eror.txt\n");
        }
        else {
                system ("$comp_p $file 2>eror.txt\n");
        }

        unless (-e "a.out") {
                printf ("Eroare de compilare\n");
                system ("cp -f eror.txt $borderou");
                exit();
        }
        system ("rm -f eror.txt");
        $total=0;
        for ($i=0;$i<$nt;++$i) {
                printf fout ("Testul %2d ............ ",$i+1);
                chdir ("$tdir");
                system ("cp -f $i.in ../$in");
                if ($type eq "NU") {
                        system ("cp -f $i.ok ../");
                }
                else {
                        system ("cp -f $i.ok ../$tdir.ok");
                }
                chdir ("..");
                $mess=system ("./run a.out 0 $tl 0");
                if ($mess==0) {
                        if ($type eq "DA") {
                                system ("./$ver");
                                $fin="ver.ok";
                                open(fin);
                                @data=<fin>;
                                if (@data[0] eq "1") {
                                        $total+= $ppt;
                                        printf fout ("OK\n");
                                }
                                else {
                                        printf fout ("Raspuns gresit\n");
                                }
                        }
                        else {
                                $mess2=system("diff -bq $out $i.ok >/dev/null");
                                if ($mess2 ==0) {
                                        printf fout ("OK\n");
                                        $total += $ppt;
                                }
                                else {
                                        printf fout ("Raspuns gresit\n");
                                }
                        }
                }

                if ($mess==51200) {printf fout ("Limita de timp depasita\n");}
                if ($mess != 51200 && $mess!=0) {printf fout ("Eroare la executie\n");}
                system ("rm -f $in");
                system ("rm -f $out");
                system ("rm -f $i.ok");
        }
        printf fout ("Total                 $total\n");
        system ("rm -f a.out\n");
}

Pentru a executa "perl eval.pl".
Memorat
wickedman
Echipa infoarena
Nu mai tace
*****

Karma: 227
Deconectat Deconectat

Mesaje: 670



Vezi Profilul WWW
« Răspunde #10 : Ianuarie 17, 2007, 21:24:58 »

Va puteti inspira din sursele infoarena. Our sandbox&eval are pretty hot!

http://hackers.devnet.ro/browser/trunk/infoarena2/jrun
Memorat
cos_min
Nu mai tace
*****

Karma: 48
Deconectat Deconectat

Mesaje: 493


live


Vezi Profilul
« Răspunde #11 : Ianuarie 19, 2007, 17:34:12 »

nu merge niciun link sa pot lua evaluatorul...si totusi as avea nevoie de el, poti trimite pe mail ?
Memorat

vid...
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines