「TOJ」:修訂間差異

出自TFcisWiki
跳至導覽 跳至搜尋
(新增出題)
行 264: 行 264:


=== Polygon to TOJ ===
=== Polygon to TOJ ===
請參考 [https://github.com/TFcis/cf2toj]
請參考 [https://github.com/TFcis/cf2toj cf2toj]


=== TPS to TOJ ===
=== TPS to TOJ ===

於 2024年10月15日 (二) 10:20 的修訂


https://toj.tfcis.org/oj/

出題

以下內容均為 Problem Package 的形式,TOJ 已經支援用 UI 新增題目了

一般題目

limit欄位的 default 一定要存在,其餘可以填寫 TOJ 支援的編譯器 (gcc, g++, clang, clang++, python3, rust, java)

記憶體限制的單位是 KB

{
    "limit": {
        "default": {
            "timelimit": 1000,
            "memlimit": 65536
        },
        "python3": {
            "timelimit": 2500,
            "memlimit": 524288,
        }
    }

check欄位可以填 "diff", "diff-strict"

Type 解釋
diff 寬鬆比對
diff-strict 嚴格比對
/conf.json
{
    "limit": {
        "default": {
            "timelimit": 1000,
            "memlimit": 65536
        }
    },
    "is_makefile": false,
    "check": "diff",
    "test": [
        {
            "data": [
                1, 2, 3, 4, 5
            ],
            "weight": 100
        }
    ]
}

Makefile題目 (編譯互動題)

/conf.json
{
    "limit": {
        "default": {
            "timelimit": 1000,
            "memlimit": 65536
        }
    },
    "is_makefile": true,
    "check": "diff",
    "test": [
        {
            "data": [
                1, 2, 3, 4, 5
            ],
            "weight": 100
        }
    ]
}

CMS/Testlib Checker

/conf.json
{
    "limit": {
        "default": {
            "timelimit": 1000,
            "memlimit": 65536
        }
    },
    "check": "cms",
    "test": [
        {
            "data": [
                1, 2, 3, 4, 5
            ],
            "weight": 100
        }
    ]
}
/res/check/check.cpp

會傳入三個參數,分別為測資輸入,測資輸出,答案輸入

#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);
}
/res/check/check.py
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()

Verdict Message (Checker Message)

對標準錯誤 (STDERR) 輸出 verdict message

C/C++

#include <iostream>
std::cerr << "checker message" << std::endl;

#include <cstdio>
fprintf(stderr, "checker message");

Python

import sys
print("checker message", sys.stderr)

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)

下面列出幾個作為參考

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
#!/bin/sh
g++ -o check check.cpp
# python
# cp check.py check
# chmod +x check

IORedir

conf.json中的 check 從 diff 改成 ioredir,及設定 metadata 如下。 如果 Checker 的 STDOUT 或 STDERR 沒有被佔用且有輸出內容,那 Verdict Message (Checker Message) 將會為該內容 (如果兩個同時都有,STDERR 優先於 STDOUT

/conf.json
{
    "check": "ioredir",
    "metadata": {
        "redir_test": {
            "pipeout": 1,
            "testin": 0,
            "testout": -1,
            "pipein": -1
        },
        "redir_check": {
            "ansin": 2,
            "testin": -1,
            "pipeout": 0,
            "pipein": -1
        }
    }
}

如果要用 ioredir 實現互動題, metadata 可以這樣寫

從 STDERR 讀入測資,對 STDOUT 輸出測資 從 STDIN 讀入答案

{
    "redir_test": {
        "pipein": 0,
        "testin": -1,
        "pipeout": 1,
        "testout": -1
    },
    "redir_check": {
        "ansin": -1,
        "pipein": 1,
        "testin": 2,
        "pipeout": 0
    }
}
/res/check/check.cpp

分別從答案及輸出分別讀入long double。

long double Answer, Output;
FILE *ansf = fdopen(2, "r");

scanf("%Lf", &Output);
fscanf(ansf, "%Lf", &Answer);
/res/check/build
#!/bin/sh
g++ -o check check.cpp

參考 https://hackmd.io/s/BkHdt57I

Polygon to TOJ

請參考 cf2toj

TPS to TOJ

請參考 [1]

CMS to TOJ

請參考 [2]

參見