檢視 TOJ 的原始碼
←
TOJ
跳至導覽
跳至搜尋
由於以下原因,您無權編輯此頁面:
您請求的操作只有這個群組的使用者能使用:
已確認的使用者
您可以檢視並複製此頁面的原始碼。
[[Category:TOJ]] https://toj.tfcis.org/oj/ * 社團練習用的Online Judge * 由[[T13]]的[[吳哲宇]]([[pzread]])開發 * [[T19]]的[[lys0829]]於2017年將judge更新 * [[T24]]的[[tobiichi3227]]與[[ccccchhhheeenng]]於2022年將後端Server的軟硬體更新 == 出題 == 以下內容均為 Problem Package 的形式,TOJ 已經支援用 UI 新增題目了 === 一般題目 === limit欄位的 default 一定要存在,其餘可以填寫 TOJ 支援的編譯器 (gcc, g++, clang, clang++, python3, rust, java) 記憶體限制的單位是 KB <syntaxhighlight lang="JSON"> { "limit": { "default": { "timelimit": 1000, "memlimit": 65536 }, "python3": { "timelimit": 2500, "memlimit": 524288, } } </syntaxhighlight> check欄位可以填 "diff", "diff-strict" {| class="wikitable" |- ! Type !! 解釋 |- | diff || 寬鬆比對 |- | diff-strict || 嚴格比對 |} ;/conf.json <syntaxhighlight lang="JSON"> { "limit": { "default": { "timelimit": 1000, "memlimit": 65536 } }, "is_makefile": false, "check": "diff", "test": [ { "data": [ 1, 2, 3, 4, 5 ], "weight": 100 } ] } </syntaxhighlight> === Makefile題目 (編譯互動題) === ;/conf.json <syntaxhighlight lang="JSON"> { "limit": { "default": { "timelimit": 1000, "memlimit": 65536 } }, "is_makefile": true, "check": "diff", "test": [ { "data": [ 1, 2, 3, 4, 5 ], "weight": 100 } ] } </syntaxhighlight> 在 res/make 新增 Makefile 與 要編譯的檔案 ;/res/make/Makefile <syntaxhighlight lang="make"> default: g++ main.cpp stub.cpp -o $(OUT) </syntaxhighlight> stub.cpp 可以自己換成其他要一起編譯的檔案,編譯選項可以自行修改 === CMS/Testlib Checker === ;/conf.json <syntaxhighlight lang="JSON"> { "limit": { "default": { "timelimit": 1000, "memlimit": 65536 } }, "check": "cms", "test": [ { "data": [ 1, 2, 3, 4, 5 ], "weight": 100 } ] } </syntaxhighlight> ;/res/check/check.cpp 會傳入三個參數,分別為測資輸入,測資輸出,答案輸入 <syntaxhighlight lang="C++"> #include <fstream> int main(int argc, char** argv) { std::ifstream test_in(argv[1]); std::ifstream test_out(argv[2]); std::ifstream ans_in(argv[3]); // C FILE* test_in_ptr = fopen(argv[1], "r"); FILE* test_out_ptr = fopen(argv[2], "r"); FILE* ans_in_ptr = fopen(argv[3], "r"); fclose(test_in_ptr); fclose(test_out_ptr); fclose(ans_in_ptr); } </syntaxhighlight> ;/res/check/check.py <syntaxhighlight lang="Python"> import sys test_in = open(sys.argv[1]) test_out = open(sys.argv[2]) ans_in = open(sys.argv[3]) test_in.close() test_out.close() ans_in.close() </syntaxhighlight> ==== Verdict Message (Checker Message) ==== 對標準錯誤 (STDERR) 輸出 verdict message C/C++ <syntaxhighlight lang="C++"> #include <iostream> std::cerr << "checker message" << std::endl; #include <cstdio> fprintf(stderr, "checker message"); </syntaxhighlight> Python <syntaxhighlight lang="Python"> import sys print("checker message", sys.stderr) </syntaxhighlight> ==== Special Score & Status ==== 對標準輸出 (STDOUT) 輸出 Special Score & Status,輸出標準如下 ScoreType;Score;Status ===== Score ===== ScoreType 可以是 NONE, CMS, CF NONE 代表 Judge 不會理會 Score 的值 CMS 代表 Judge 會將 該題子任務分數乘上 Score (與 CMS 的 GroupMin 相同),且 Score 範圍應該從 0.0 到 1.0,大於 1.0 將設定為 1.0,小於 0.0 將設定為 0.0 CF 代表 Judge 會直接用 Score 覆蓋該子任務分數 ===== Status ===== Status 可以是 TOJ 所支援的所有 Status (AC, PC, WA, RE, RESIG, TLE, MLE, OLE, CE, CLE, SJE, IE) 如果 Status 為空 或 不在支援的 Status 中將按照 Checker 回傳值決定狀態 (return 0 為 AC,其餘為 WA) 下面列出幾個作為參考 {| class="wikitable" |- ! STDOUT String !! Score !! Status |- | CMS;0.5;PC || 子任務分數 * 0.5 || PC (Partial Correct) |- | CF;32.27;AC || 32.27 || AC (Answer Correct) |- | NONE;3131;WA || 子任務分數 || WA (Wrong Answer) |- | CF;32.27; || 32.27 || 按照 Return 值決定是 AC 或 WA |- | ;; || 子任務分數 || 按照 Return 值決定是 AC 或 WA |- | (沒有任何輸出) || 子任務分數 || 按照 Return 值決定是 AC 或 WA |} ;/res/check/build <syntaxhighlight lang="Bash"> #!/bin/sh g++ -o check check.cpp # python # cp check.py check # chmod +x check </syntaxhighlight> === IORedir === 將[https://github.com/TFcis/Problem-setting-tools/blob/master/TOJ-problem-example/conf.json conf.json]中的 check 從 diff 改成 ioredir,及設定 metadata 如下。 如果 Checker 的 STDOUT 或 STDERR 沒有被佔用且有輸出內容,那 Verdict Message (Checker Message) 將會為該內容 (如果兩個同時都有,STDERR 優先於 STDOUT ;/conf.json <syntaxhighlight lang="JSON">{ "check": "ioredir", "metadata": { "redir_test": { "pipeout": 1, "testin": 0, "testout": -1, "pipein": -1 }, "redir_check": { "ansin": 2, "testin": -1, "pipeout": 0, "pipein": -1 } } }</syntaxhighlight> 如果要用 ioredir 實現互動題, metadata 可以這樣寫 從 STDERR 讀入測資,對 STDOUT 輸出測資 從 STDIN 讀入答案 <syntaxhighlight lang="JSON"> { "redir_test": { "pipein": 0, "testin": -1, "pipeout": 1, "testout": -1 }, "redir_check": { "ansin": -1, "pipein": 1, "testin": 2, "pipeout": 0 } } </syntaxhighlight> ;/res/check/check.cpp 分別從答案及輸出分別讀入long double。 <syntaxhighlight lang="C++"> long double Answer, Output; FILE *ansf = fdopen(2, "r"); scanf("%Lf", &Output); fscanf(ansf, "%Lf", &Answer); </syntaxhighlight> ;/res/check/build <syntaxhighlight lang="Bash"> #!/bin/sh g++ -o check check.cpp </syntaxhighlight> 參考 https://hackmd.io/s/BkHdt57I === Polygon to TOJ === 請參考 [https://github.com/TFcis/cf2toj cf2toj] === TPS to TOJ === 請參考 [https://github.com/TFcis/tps2toj tps2toj] === CMS to TOJ === 請參考 [https://github.com/TFcis/cms2toj cms2toj] == 參見 == * [[TOJ API]]:API文檔 * [https://github.com/pzread/judge judge原始碼]
返回到「
TOJ
」。
導覽選單
個人工具
建立帳號
登入
命名空間
頁面
討論
臺灣正體
視圖
閱讀
檢視原始碼
檢視歷史
更多
搜尋
導覽
首頁
近期變更
隨機頁面
建立頁面
工具
連結至此的頁面
相關變更
特殊頁面
頁面資訊