aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/admin/answer.php13
-rw-r--r--src/admin/problem.php200
-rw-r--r--src/admin/report/webcast.php19
-rw-r--r--src/fanswer.php24
-rw-r--r--src/fcontest.php36
-rw-r--r--src/fproblem.php16
-rw-r--r--src/frun.php40
7 files changed, 289 insertions, 59 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
<tr>
<td><b>Answer #</b></td>
<td><b>Description</b></td>
+ <td><b>Shortname</b></td>
<td><b>Yes/No</b></td>
</tr>
<?php
@@ -82,8 +84,13 @@ for ($i=0; $i<count($ans); $i++) {
echo " <td nowrap>".$ans[$i]["number"]." (fake)</td>\n";
}
echo " <td nowrap>" . $ans[$i]["desc"] . "</td>\n";
+
+ if ($ans[$i]["short"]=="") echo " <td nowrap>&lt;EMPTY&gt;</td>\n";
+ else echo " <td nowrap>".$ans[$i]["short"]."</td>\n";
+
if($ans[$i]["yes"]=="t") echo " <td nowrap>Yes</td>\n";
else echo " <td nowrap>No</td>\n";
+
echo " </tr>\n";
$n++;
}
@@ -114,6 +121,12 @@ if ($n == 0) echo "<br><center><b><font color=\"#ff0000\">NO ANSWERS DEFINED</fo
</td>
</tr>
<tr>
+ <td width="35%" align=right>Shortname (usually 2 or 3 letters):</td>
+ <td width="65%">
+ <input type="text" name="answershort" value="" size="20" maxlength="20" />
+ </td>
+ </tr>
+ <tr>
<td width="35%" align=right>Type:</td>
<td width="65%">
<select name="answeryes">
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<count($prob); $i++) {
}
}
}
+
+// Update AutoJudge Setting
+for ($i=0; $i<count($prob); $i++) {
+ if($prob[$i]["fake"]=='t') continue;
+
+ $sel_name = "autojudge_" . $prob[$i]['number']. "_sel";
+ if (isset($_POST["SubmitProblemAJ" . $prob[$i]['number']]) && $_POST["SubmitProblemAJ" . $prob[$i]['number']] == 'Update' && isset ($_POST[$sel_name]) && in_array ($_POST[$sel_name], array ('all', 'custom', 'none'))) {
+ $all_answers = DBGetAnswers($_SESSION["usertable"]["contestnumber"]);
+ $value = 0;
+ for ($g = 0; $g < count ($all_answers); $g++) {
+ if ($all_answers[$g]['fake'] == 't') continue;
+ $campo = 'autojudge_chc_'.$prob[$i]['number'].'_'.$all_answers[$g]['number'];
+
+ if ($_POST[$sel_name] == 'all') {
+ $value |= pow (2, $g);
+ } else if ($_POST[$sel_name] == 'custom' && isset ($_POST[$campo]) && $_POST[$campo] == "1") {
+ $value |= pow (2, $g);
+ }
+ }
+ $param = array();
+ $param['number'] = $prob[$i]['number'];
+ $param['name'] = trim($prob[$i]['name']);
+ $param['fake'] = 'f';
+ $param['colorname'] = trim($prob[$i]['colorname']);
+ $param['color'] = trim($prob[$i]['color']);
+ $param['autojudge'] = ((integer) $value);
+ DBNewProblem ($_SESSION["usertable"]["contestnumber"], $param);
+ ForceLoad("problem.php");
+ }
+}
?>
<br>
<script language="javascript">
@@ -256,8 +301,10 @@ for ($i=0; $i<count($prob); $i++) {
<!-- <td><b>Compare file</b></td>
<td><b>Timelimit</b></td>-->
<td><b>Color</b></td>
+ <td><b>AutoJudge Setting</b></td>
</tr>
<?php
+$all_answers = DBGetAnswers($_SESSION["usertable"]["contestnumber"]);
for ($i=0; $i<count($prob); $i++) {
echo " <tr>\n";
if($prob[$i]["fake"]!='t') {
@@ -322,6 +369,105 @@ for ($i=0; $i<count($prob); $i++) {
echo "<input type=\"submit\" name=\"SubmitProblem" . $prob[$i]["number"] . "\" value=\"Update\">";
} else echo "&nbsp;";
echo "</td>\n";
+
+ // Print the autojudge setting with a INPUT SELECT BOX + small boxes
+ echo " <td nowrap>";
+ if($prob[$i]["fake"]!='t') {
+ $autojudge_int_val = ((integer) $prob[$i]['autojudge']);
+ $sel_name = "autojudge_" . $prob[$i]['number']. "_sel";
+ printf ('<select id="%s" name="%s">', $sel_name, $sel_name);
+
+ $all_mask = 0;
+ for ($g = 0; $g < count($all_answers); $g++) {
+ if ($all_answers[$g]['fake'] == 't') continue;
+ $all_mask |= pow (2, $g);
+ }
+ if ($autojudge_int_val == $all_mask) {
+ $dis = true;
+ $dis_value = true;
+ $sel_value = 'all';
+ } else if ($autojudge_int_val == 0) {
+ $dis = true;
+ $dis_value = false;
+ $sel_value = 'none';
+ } else {
+ $dis = false;
+ $sel_value = 'custom';
+ }
+
+ $opts = array ('Everything' => 'all', 'Custom' => 'custom', 'None' => 'none');
+ foreach ($opts as $display_name => $opt) {
+ if ($opt == $sel_value) {
+ printf ('<option value="%s" selected="selected">%s</option>', $opt, $display_name);
+ } else {
+ printf ('<option value="%s">%s</option>', $opt, $display_name);
+ }
+ }
+
+ echo "</select><br />\n";
+
+ echo "<table><tr>\n";
+
+ for ($g = 0; $g < count($all_answers); $g++) {
+ if ($all_answers[$g]['fake'] == 't') continue;
+ echo "<td>\n";
+ printf ('<input type="checkbox" id=autojudge_chc_%s_%s name="autojudge_chc_%s_%s" value="1" ', $i, $g, $i, $g);
+ if ($sel_value == 'all') {
+ printf ('disabled="disabled" checked="checked" />');
+ } else if ($sel_value == 'none') {
+ printf ('disabled="disabled" />');
+ } else {
+ $mask = pow (2, $all_answers[$g]['number']);
+ if (($autojudge_int_val & $mask) == $mask) {
+ printf ('checked="checked" />');
+ } else {
+ printf (' />');
+ }
+ }
+ echo "\n</td>\n";
+ }
+ echo "</tr><tr>\n";
+ for ($g = 0; $g < count($all_answers); $g++) {
+ if ($all_answers[$g]['fake'] == 't') continue;
+ printf ('<td><label for="autojudge_chc_%s_%s">', $i, $g);
+ printf ('<abbr title="%s">%s</abbr>', $all_answers[$g]['desc'], $all_answers[$g]['short']);
+ echo "</label></td>\n";
+ }
+ echo "</tr></table>\n";
+ ?>
+ <script type="text/javascript">
+ function <?php echo "f_change_".$sel_name; ?> () {
+ var sel = document.getElementById("<?php echo $sel_name; ?>");
+ var v = sel.value;
+ var max_ans = <?php echo count($all_answers) ?>;
+ var dis = false;
+ if (v == "all") {
+ dis = true;
+ sel = true;
+ } else if (v == "none") {
+ dis = true;
+ sel = false;
+ }
+
+ for (g = 1; g < max_ans; g++) {
+ var c = document.getElementById ("<?php echo 'autojudge_chc_'.$prob[$i]['number'].'_';?>" + g);
+ if (dis == true) {
+ c.checked = sel;
+ c.disabled = true;
+ } else {
+ c.disabled = false;
+ }
+ }
+ }
+ var sel = document.getElementById("<?php echo $sel_name; ?>");
+ sel.onchange = <?php echo "f_change_".$sel_name; ?>;
+ <?php echo "f_change_".$sel_name; ?> ();
+ </script>
+<?php
+ echo "<input type=\"submit\" name=\"SubmitProblemAJ" . $prob[$i]["number"] . "\" value=\"Update\">";
+ } else echo "&nbsp;";
+ echo "</td>\n";
+
echo " </tr>\n";
}
echo "</table></form>";
@@ -438,6 +584,60 @@ To replace the data of a problem, proceed as if it did not exist (data will be r
<input type="text" name="color" value="" size="6" maxlength="6" />
</td>
</tr>
+ <tr>
+ <td width="35%" align=right>Autojudge Setting:</td>
+ <td width="65%">
+ <select name="autojudge_new_sel" id="autojudge_new_sel">
+ <option value="all" selected="selected">Everything</option>
+ <option value="custom">Custom</option>
+ <option value="none">None</option>
+ </select>
+ <table><tr>
+<?php
+ for ($g = 0; $g < count($all_answers); $g++) {
+ if ($all_answers[$g]['fake'] == 't') continue;
+ echo "<td>\n";
+ printf ('<input type="checkbox" id=autojudge_chc_new_%s name="autojudge_chc_new_%s" value="1" disabled="disabled" checked="checked" />', $g, $g);
+ echo "\n</td>\n";
+ }
+ echo "</tr><tr>\n";
+ for ($g = 0; $g < count($all_answers); $g++) {
+ if ($all_answers[$g]['fake'] == 't') continue;
+ printf ('<td><label for="autojudge_chc_new_%s">', $g);
+ printf ('<abbr title="%s">%s</abbr>', $all_answers[$g]['desc'], $all_answers[$g]['short']);
+ echo "</label></td>\n";
+ }
+ echo "</tr></table>\n";
+ ?>
+ <script type="text/javascript">
+ function f_change_new () {
+ var sel = document.getElementById("autojudge_new_sel");
+ var v = sel.value;
+ var max_ans = <?php echo count($all_answers) ?>;
+ var dis = false;
+ if (v == "all") {
+ dis = true;
+ sel = true;
+ } else if (v == "none") {
+ dis = true;
+ sel = false;
+ }
+
+ for (g = 1; g < max_ans; g++) {
+ var c = document.getElementById ("autojudge_chc_new_" + g);
+ if (dis == true) {
+ c.checked = sel;
+ c.disabled = true;
+ } else {
+ c.disabled = false;
+ }
+ }
+ }
+ var sel = document.getElementById("autojudge_new_sel");
+ sel.onchange = f_change_new;
+ </script>
+ </td>
+ </tr>
</table>
</center>
<center>
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
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)");