From dd3f7d5d9475291d8359a01c9312355388d4f761 Mon Sep 17 00:00:00 2001 From: Daniel Saad Nogueira Nunes Date: Wed, 31 Jan 2024 19:04:25 -0300 Subject: webcast.php: fixing FS separador character. (#40) --- src/admin/report/webcast.php | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/admin/report/webcast.php b/src/admin/report/webcast.php index fe5ee12..75030be 100644 --- a/src/admin/report/webcast.php +++ b/src/admin/report/webcast.php @@ -253,15 +253,15 @@ for ($i = 0; $i < $numRuns; $i++) { $runProblem = $run[$i]['problem']; //if($runTime < $freezeTime) { - { - $runfile .= $runID . '^\' . - $runTime . '^\' . - $runTeam . '^\' . - $runProblem . '^\'; - - //if ($runTime >= $freezeTime) { - // $runfile .= '?' . "\n"; - //} else if ($run[$i]['yes'] == 't') { + { + $runfile .= $runID . '' . + $runTime . '' . + $runTeam . '' . + $runProblem . ''; + + //if ($runTime >= $freezeTime) { + // $runfile .= '?' . "\n"; + //} else if ($run[$i]['yes'] == 't') { if ($run[$i]['yes'] == 't') { $runfile .= 'Y' . "\n"; } else if ($run[$i]['answer'] == 'Not answered yet') { @@ -277,7 +277,6 @@ for ($i = 0; $i < $numRuns; $i++) { } } - if($st['currenttime'] >= $freezeTime) $timefile = $freezeTime; else -- cgit v1.2.3 From d712c818ac131caf357363ffc52517d6f56fe754 Mon Sep 17 00:00:00 2001 From: Gatuno Date: Wed, 31 Jan 2024 16:04:48 -0600 Subject: New autojudge setting on interface per problem. (#41) * First obey the global 'autojudge' setting per site. * Next, check the setting per problem per answer type. * By default autoanswer is enabled on all problems. --- src/admin/answer.php | 13 ++++ src/admin/problem.php | 200 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/fanswer.php | 24 ++++-- src/fcontest.php | 36 ++++----- src/fproblem.php | 16 +++- src/frun.php | 40 +++++----- 6 files changed, 280 insertions(+), 49 deletions(-) diff --git a/src/admin/answer.php b/src/admin/answer.php index c2d1fdc..53ef8b9 100644 --- a/src/admin/answer.php +++ b/src/admin/answer.php @@ -37,6 +37,7 @@ if (isset($_POST["Submit3"]) && isset($_POST["answernumber"]) && is_numeric($_PO $param["number"] = $_POST["answernumber"]; $param["name"] = $_POST["answername"]; $param["yes"] = $_POST["answeryes"]; + $param["short"] = $_POST["answershort"]; DBNewAnswer ($_SESSION["usertable"]["contestnumber"],$param); } ForceLoad("answer.php"); @@ -65,6 +66,7 @@ if (isset($_POST["Submit3"]) && isset($_POST["answernumber"]) && is_numeric($_PO Answer # Description + Shortname Yes/No ".$ans[$i]["number"]." (fake)\n"; } echo " " . $ans[$i]["desc"] . "\n"; + + if ($ans[$i]["short"]=="") echo " <EMPTY>\n"; + else echo " ".$ans[$i]["short"]."\n"; + if($ans[$i]["yes"]=="t") echo " Yes\n"; else echo " No\n"; + echo " \n"; $n++; } @@ -113,6 +120,12 @@ if ($n == 0) echo "
NO ANSWERS DEFINED + + Shortname (usually 2 or 3 letters): + + + + Type: diff --git a/src/admin/problem.php b/src/admin/problem.php index 33e887c..9024544 100644 --- a/src/admin/problem.php +++ b/src/admin/problem.php @@ -194,6 +194,21 @@ if (isset($_POST["Submit3"]) && isset($_POST["problemnumber"]) && is_numeric($_P $param['fake'] = 'f'; $param['colorname'] = trim($_POST["colorname"]); $param['color'] = trim($_POST["color"]); + $autojudge_value = 0; + if (isset ($_POST["autojudge_new_sel"]) && in_array ($_POST['autojudge_new_sel'], array ('all', 'custom', 'none'))) { + $all_answers = DBGetAnswers($_SESSION["usertable"]["contestnumber"]); + for ($g = 0; $g < count ($all_answers); $g++) { + if ($all_answers[$g]['fake'] == 't') continue; + $campo = 'autojudge_chc_new_'.$all_answers[$g]['number']; + + if ($_POST['autojudge_new_sel'] == 'all') { + $autojudge_value |= pow (2, $g); + } else if ($_POST['autojudge_new_sel'] == 'custom' && isset ($_POST[$campo]) && $_POST[$campo] == "1") { + $autojudge_value |= pow (2, $g); + } + } + } + $param['autojudge'] = $autojudge_value; DBNewProblem ($_SESSION["usertable"]["contestnumber"], $param); } } @@ -222,6 +237,36 @@ for ($i=0; $i
+"; + } else echo " "; + echo "\n"; + echo " \n"; } echo ""; @@ -438,6 +584,60 @@ To replace the data of a problem, proceed as if it did not exist (data will be r + + Autojudge Setting: + + + +\n"; + printf ('', $g, $g); + echo "\n\n"; + } + echo "\n"; + for ($g = 0; $g < count($all_answers); $g++) { + if ($all_answers[$g]['fake'] == 't') continue; + printf ('\n"; + } + echo "
\n"; + ?> + + +
diff --git a/src/fanswer.php b/src/fanswer.php index 8f2c95b..17f42a0 100644 --- a/src/fanswer.php +++ b/src/fanswer.php @@ -30,6 +30,7 @@ CREATE TABLE \"answertable\" ( \"contestnumber\" int4 NOT NULL, -- (id do concurso) \"answernumber\" int4 NOT NULL, -- (id da reposta) \"runanswer\" varchar(50) NOT NULL, -- (reposta dada no julgamento) +\"shortname\" varchar(50) DEFAULT '' NOT NULL, -- () \"yes\" bool DEFAULT 'f' NOT NULL, -- (flag para indicar se conta ponto) \"fake\" bool DEFAULT 'f' NOT NULL, -- (flag para indicar se eh resposta valida) \"updatetime\" int4 DEFAULT EXTRACT(EPOCH FROM now()) NOT NULL, -- (indica a ultima atualizacao no registro) @@ -49,7 +50,7 @@ CONSTRAINT \"contest_fk\" FOREIGN KEY (\"contestnumber\") REFERENCES \"contestta //devolve um array, onde cada linha tem os atributos number (numero da resposta) e desc (descricao da resposta) function DBGetAnswers($contest) { $c = DBConnect(); - $r = DBExec($c, "select distinct a.answernumber as number, a.runanswer as desc, a.yes as yes, a.fake as fake ". + $r = DBExec($c, "select distinct a.answernumber as number, a.runanswer as desc, a.shortname as short, a.yes as yes, a.fake as fake ". "from answertable as a where a.contestnumber=$contest and a.runanswer !~ '(DEL)' order by a.answernumber", "DBGetAnswers(get answers)"); $n = DBnlines($r); $a = array(); @@ -58,6 +59,18 @@ function DBGetAnswers($contest) { return $a; } +function DBGetAnswer($contest, $number) { + $c = DBConnect(); + $r = DBExec($c, "select distinct a.answernumber as number, a.runanswer as desc, a.shortname as short, a.yes as yes, a.fake as fake ". + "from answertable as a where a.contestnumber=$contest and a.runanswer !~ '(DEL)' order by a.answernumber", "DBGetAnswer(only 1 answer)"); + $n = DBnlines($r); + if ($n != 1) { + return null; + } + $a = DBRow($r,0); + return $a; +} + //recebe o numero do contest e o numero da resposta e remove-a caso seu tipo nao seja fake function DBDeleteAnswer($contest,$param,$c=null) { $ac=array('number'); @@ -98,8 +111,9 @@ function DBNewAnswer($contest, $param, $c=null) { } if(isset($param['answernumber']) && !isset($param['number'])) $param['number']=$param['answernumber']; if(isset($param['runanswer']) && !isset($param['name'])) $param['name']=$param['runanswer']; + if(isset($param['shortname']) && !isset($param['short'])) $param['short']=$param['shortname']; - $ac=array('number','name','yes'); + $ac=array('number','name','yes', 'short'); $type['number']=1; foreach($ac as $key) { if(!isset($param[$key])) { @@ -131,15 +145,15 @@ function DBNewAnswer($contest, $param, $c=null) { $ret=1; if ($n == 0) { $ret=2; - DBExec($c, "insert into answertable (contestnumber, answernumber, runanswer, yes, updatetime) values " . - "($contest, $number, '$name', '$y', $t)", "DBNewAnswer(insert answer)"); + DBExec($c, "insert into answertable (contestnumber, answernumber, runanswer, shortname, yes, updatetime) values " . + "($contest, $number, '$name', '$short', '$y', $t)", "DBNewAnswer(insert answer)"); if($cw) DBExec($c, "commit work", "DBNewAnswer(commit)"); LOGLevel("Answer $number inserted (contest=$contest,user=".$_SESSION["usertable"]["username"]."/".$_SESSION["usertable"]["usersitenumber"].")", 2); } else { $lr = DBRow($r,0); if($updatetime > $lr['updatetime']) { $ret=2; - DBExec($c, "update answertable set runanswer='$name', yes='$y', updatetime=". $updatetime . " where ". + DBExec($c, "update answertable set runanswer='$name', yes='$y', shortname='$short', updatetime=". $updatetime . " where ". "contestnumber=$contest and answernumber=$number and fake='f'", "DBNewAnswer(update answer)"); if($cw) DBExec($c, "commit work", "DBNewAnswer(commit)"); LOGLevel("Answer $number updated (contest=$contest,user=".$_SESSION["usertable"]["username"]."/".$_SESSION["usertable"]["usersitenumber"].")", 2); diff --git a/src/fcontest.php b/src/fcontest.php index ccd3e11..5238438 100644 --- a/src/fcontest.php +++ b/src/fcontest.php @@ -1083,24 +1083,24 @@ function insertlanguages($n,$c=null) { DBNewLanguage($n, $param, $c); } function insertanswers($n,$c) { - DBExec($c, "insert into answertable (contestnumber, answernumber, runanswer, yes, fake) values ". - "($n, 0, 'Not answered yet', 'f', 't')", "DBNewContest(insert fake answer)"); - DBExec($c, "insert into answertable (contestnumber, answernumber, runanswer, yes, fake) values ". - "($n, 1, 'YES', 't', 'f')", "DBNewContest(insert YES answer)"); - DBExec($c, "insert into answertable (contestnumber, answernumber, runanswer, yes, fake) values ". - "($n, 2, 'NO - Compilation error', 'f', 'f')", "DBNewContest(insert CE answer)"); - DBExec($c, "insert into answertable (contestnumber, answernumber, runanswer, yes, fake) values ". - "($n, 3, 'NO - Runtime error', 'f', 'f')", "DBNewContest(insert RE answer)"); - DBExec($c, "insert into answertable (contestnumber, answernumber, runanswer, yes, fake) values ". - "($n, 4, 'NO - Time limit exceeded', 'f', 'f')", "DBNewContest(insert TLE answer)"); - DBExec($c, "insert into answertable (contestnumber, answernumber, runanswer, yes, fake) values ". - "($n, 5, 'NO - Presentation error', 'f', 'f')", "DBNewContest(insert PE answer)"); - DBExec($c, "insert into answertable (contestnumber, answernumber, runanswer, yes, fake) values ". - "($n, 6, 'NO - Wrong answer', 'f', 'f')", "DBNewContest(insert WA answer)"); - DBExec($c, "insert into answertable (contestnumber, answernumber, runanswer, yes, fake) values ". - "($n, 7, 'NO - Contact staff', 'f', 'f')", "DBNewContest(insert CS answer)"); - DBExec($c, "insert into answertable (contestnumber, answernumber, runanswer, yes, fake) values ". - "($n, 8, 'NO - Name mismatch', 'f', 'f')", "DBNewContest(insert MI answer)"); + DBExec($c, "insert into answertable (contestnumber, answernumber, runanswer, shortname, yes, fake) values ". + "($n, 0, 'Not answered yet', 'NYET', 'f', 't')", "DBNewContest(insert fake answer)"); + DBExec($c, "insert into answertable (contestnumber, answernumber, runanswer, shortname, yes, fake) values ". + "($n, 1, 'YES', 'YES', 't', 'f')", "DBNewContest(insert YES answer)"); + DBExec($c, "insert into answertable (contestnumber, answernumber, runanswer, shortname, yes, fake) values ". + "($n, 2, 'NO - Compilation error', 'CE', 'f', 'f')", "DBNewContest(insert CE answer)"); + DBExec($c, "insert into answertable (contestnumber, answernumber, runanswer, shortname, yes, fake) values ". + "($n, 3, 'NO - Runtime error', 'RE', 'f', 'f')", "DBNewContest(insert RE answer)"); + DBExec($c, "insert into answertable (contestnumber, answernumber, runanswer, shortname, yes, fake) values ". + "($n, 4, 'NO - Time limit exceeded', 'TLE','f', 'f')", "DBNewContest(insert TLE answer)"); + DBExec($c, "insert into answertable (contestnumber, answernumber, runanswer, shortname, yes, fake) values ". + "($n, 5, 'NO - Presentation error', 'PE', 'f', 'f')", "DBNewContest(insert PE answer)"); + DBExec($c, "insert into answertable (contestnumber, answernumber, runanswer, shortname, yes, fake) values ". + "($n, 6, 'NO - Wrong answer', 'WA', 'f', 'f')", "DBNewContest(insert WA answer)"); + DBExec($c, "insert into answertable (contestnumber, answernumber, runanswer, shortname, yes, fake) values ". + "($n, 7, 'NO - Contact staff', 'CS', 'f', 'f')", "DBNewContest(insert CS answer)"); + DBExec($c, "insert into answertable (contestnumber, answernumber, runanswer, shortname, yes, fake) values ". + "($n, 8, 'NO - Name mismatch', 'NMI', 'f', 'f')", "DBNewContest(insert MI answer)"); } function DBNewSite ($contest, $c=null, $param=array()) { $cw = false; diff --git a/src/fproblem.php b/src/fproblem.php index c14a61b..aa8c6d6 100644 --- a/src/fproblem.php +++ b/src/fproblem.php @@ -39,6 +39,7 @@ CREATE TABLE \"problemtable\" ( -- clarification em General, por exemplo) \"problemcolorname\" varchar(100) DEFAULT '', -- nome da cor do problema \"problemcolor\" varchar(6) DEFAULT '', -- cor do problema, formato html (RGB hexadecimal) +\"problemautojudge\" int4 DEFAULT 0 NOT NULL, \"updatetime\" int4 DEFAULT EXTRACT(EPOCH FROM now()) NOT NULL, -- (indica a ultima atualizacao no registro) -- (tabela com os problemas. Se um problema tiver mais que par de arquivos -- entrada/solucao, entao colocamos mais que uma linha para ele aqui.) @@ -70,6 +71,7 @@ function DBGetProblemData($contestnumber, $problemnumber, $c=null) { $r = DBExec($c, "select p.problemname as problemname, p.problemfullname as fullname, p.problembasefilename " . "as basefilename, p.problemnumber as number, " . "p.problemcolor as color, p.problemcolorname as colorname, " . + "p.problemautojudge as autojudge, " . "p.probleminputfilename as inputfilename, p.probleminputfile as inputoid, p.probleminputfilehash as inputhash " . " from problemtable as p where p.contestnumber=$contestnumber and p.problemnumber=$problemnumber and p.fake!='t'", "DBGetProblemData(get problem)"); @@ -111,6 +113,7 @@ function DBGetFullProblemData($contestnumber,$freeproblems=false) { $r = DBExec($c, "select p.problemnumber as number, p.problemname as name, p.problemfullname as fullname, " . "p.problembasefilename as basefilename, p.fake as fake, " . "p.problemcolor as color, p.problemcolorname as colorname, " . + "p.problemautojudge as autojudge, " . "p.probleminputfilename as inputfilename, p.probleminputfile as inputoid, p.probleminputfilehash as inputhash " . " from problemtable as p " . "where p.contestnumber=$contestnumber order by p.problemnumber", @@ -288,6 +291,7 @@ function DBNewProblem($contestnumber, $param, $c=null) { if(isset($param['problembasefilename']) && !isset($param['basename'])) $param['basename']=$param['problembasefilename']; if(isset($param['problemcolorname']) && !isset($param['colorname'])) $param['colorname']=$param['problemcolorname']; if(isset($param['problemcolor']) && !isset($param['color'])) $param['color']=$param['problemcolor']; + if(isset($param['problemautojudge']) && !isset($param['autojudge'])) $param['autojudge']=$param['problemautojudge']; if(isset($param['probleminputfile']) && !isset($param['inputfilepath'])) $param['inputfilepath']=$param['probleminputfile']; if(isset($param['probleminputfilename']) && !isset($param['inputfilename'])) $param['inputfilename']=$param['probleminputfilename']; if(isset($param['basename'])) $param['basename'] = sanitizeFilename($param['basename']); @@ -296,9 +300,10 @@ function DBNewProblem($contestnumber, $param, $c=null) { $type['number']=1; $type['updatetime']=1; $ac1=array('colorname','fake','color','updatetime','fullname', - 'basename','inputfilename','inputfilepath'); + 'basename','inputfilename','inputfilepath', 'autojudge'); $colorname=''; $color=''; + $autojudge=0; $fake='f'; foreach($ac as $key) { if(!isset($param[$key])) { @@ -414,6 +419,9 @@ function DBNewProblem($contestnumber, $param, $c=null) { if ($color != "") DBExec ($c, "update problemtable set problemcolor='$color' where contestnumber=$contestnumber ". "and problemnumber=$number", "DBNewProblem(update color)"); + if ($autojudge != "") + DBExec ($c, "update problemtable set problemautojudge='$autojudge' where contestnumber=$contestnumber ". + "and problemnumber=$number", "DBNewProblem(update autojudge)"); if ($inputfilename != "") { $deservesupdatetime=true; DBExec ($c, "update problemtable set probleminputfilename='$inputfilename' where ". @@ -463,7 +471,8 @@ function DBGetProblems($contest,$showanyway=false) { $c = DBConnect(); $sql = "select distinct p.problemnumber as number, p.problemname as problem, " . "p.problemfullname as fullname, p.problembasefilename as basefilename, " . - "p.problemcolor as color, p.problemcolorname as colorname " . + "p.problemcolor as color, p.problemcolorname as colorname, " . + "p.problemautojudge as autojudge " . "from problemtable as p where p.fake!='t' and p.contestnumber=$contest and p.problembasefilename != '' and p.problemfullname !~ '(DEL)' order by p.problemnumber"; $r = DBExec($c, $sql, "DBGetProblems(get problems)"); $n = DBnlines($r); @@ -492,7 +501,8 @@ function DBGetAllProblems($contest) { $c = DBConnect(); $sql = "select distinct p.problemnumber as number, p.problemname as problem, " . - "p.problemcolor as color, p.problemcolorname as colorname " . + "p.problemcolor as color, p.problemcolorname as colorname, " . + "p.problemautojudge as autojudge " . "from problemtable as p " . "where p.contestnumber=$contest and (p.problembasefilename != '' or p.fake = 't') and p.problemfullname !~ '(DEL)' "; if ($b["currenttime"] < 0) $sql .= "and p.fake='t' "; diff --git a/src/frun.php b/src/frun.php index 10074e8..a386af0 100644 --- a/src/frun.php +++ b/src/frun.php @@ -484,34 +484,28 @@ function DBUpdateRunAutojudging($contest, $site, $number, $ip, $answer, $stdout, "DBUpdateRunAutojudging(update run)"); $b = DBSiteInfo($contest, $site, $c); - - if($b["siteautojudge"]!="t") { + + /* If the global config for this site says "NO Autojudge" return the script now */ + if($b["siteautojudge"]=="f") { DBExec($c, "commit work", "DBUpdateRunAutojudging(commit)"); LOGLevel("Autojudging answered a run (run=$number, site=$site, contest=$contest, answer='$answer', retval=$retval)", 3); return true; } - /* // tricks that can be used to make automatic answering for some problems and types of answers. However, this should be integrated into the system in a smart way soon - if(true || //cassiopc remove the true here if you want this to take effect - (($retval != 1 || // for some problems, 1:YES is not automatic - $a["runproblem"] == 1 || - $a["runproblem"] == 2 || - $a["runproblem"] == 3 || - $a["runproblem"] == 4 || - $a["runproblem"] == 5 || - $a["runproblem"] == 6 || - $a["runproblem"] == 7 || - $a["runproblem"] == 8 || - $a["runproblem"] == 9 || - $a["runproblem"] == 10 || - $a["runproblem"] == 11 || - $a["runproblem"] == 12 || - $a["runproblem"] == 13) - && $retval != 4 && $retval != 6)) { // but WA:6 and TLE:4 are automatic for all problems - if($retval != 1 && $retval != 6 && $retval != 4) { - } - } + + /* Next, check the problem setting, let's read what the autojudge config says about this problem */ + $problem_data = DBGetProblemData($contest, $a['runproblem']); + /* Compare the bit field from problem data to our answer, + * if the bit on the problem data is set, it means that it should be auto-judged + * if zero, do nothing + */ + $autojudge_setting = ((integer) $problem_data[0]['autojudge']); + $mask = pow (2, $retval); + if (($autojudge_setting & $mask) == 0) { + DBExec($c, "commit work", "DBUpdateRunAutojudging(commit)"); + LOGLevel("Autojudging answered a run (run=$number, site=$site, contest=$contest, answer='$answer', retval=$retval)", 3); + return true; } - */ + //echo "DEBUG: $contest, $site, " .$a["usernumber"].", $site, $number, $retval\n"; if(DBUpdateRunO($contest, $site, $a["usernumber"], $site, $number, $retval, $c)==false) { DBExec($c, "rollback work", "DBUpdateRunAutoJudging(rollback)"); -- cgit v1.2.3