<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hant-TW">
	<id>https://wiki.tfcis.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tobiichi3227</id>
	<title>TFcisWiki - 使用者貢獻 [zh-tw]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.tfcis.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tobiichi3227"/>
	<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/%E7%89%B9%E6%AE%8A:%E4%BD%BF%E7%94%A8%E8%80%85%E8%B2%A2%E7%8D%BB/Tobiichi3227"/>
	<updated>2026-04-15T01:51:23Z</updated>
	<subtitle>使用者貢獻</subtitle>
	<generator>MediaWiki 1.39.2</generator>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=TOJ&amp;diff=471</id>
		<title>TOJ</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=TOJ&amp;diff=471"/>
		<updated>2025-08-09T05:45:25Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:TOJ]]&lt;br /&gt;
&lt;br /&gt;
https://toj.tfcis.org/oj/&lt;br /&gt;
&lt;br /&gt;
* 社團練習用的Online Judge&lt;br /&gt;
* 由[[T13]]的[[吳哲宇]]([[pzread]])開發&lt;br /&gt;
* [[T19]]的[[lys0829]]於2017年將judge更新&lt;br /&gt;
* [[T24]]的[[tobiichi3227]]與[[ccccchhhheeenng]]於2022年將後端Server的軟硬體更新&lt;br /&gt;
&lt;br /&gt;
== 出題 ==&lt;br /&gt;
以下內容均為 Problem Package 的形式，TOJ 已經支援用 UI 新增題目了&lt;br /&gt;
=== 一般題目 ===&lt;br /&gt;
limit欄位的 default 一定要存在，其餘可以填寫 TOJ 支援的編譯器 (gcc, g++, clang, clang++, python3, rust, java)&lt;br /&gt;
&lt;br /&gt;
記憶體與輸出限制的單位是 KiB, 時間限制的單位是 ms&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;time&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memory&amp;quot;: 65536,&lt;br /&gt;
            &amp;quot;output&amp;quot;: 65536,&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;python3&amp;quot;: {&lt;br /&gt;
            &amp;quot;time&amp;quot;: 2500,&lt;br /&gt;
            &amp;quot;memory&amp;quot;: 524288,&lt;br /&gt;
            &amp;quot;output&amp;quot;: 65536,&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
check欄位可以填 &amp;quot;diff&amp;quot;, &amp;quot;diff-strict&amp;quot;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! 解釋&lt;br /&gt;
|-&lt;br /&gt;
| diff || 寬鬆比對&lt;br /&gt;
|-&lt;br /&gt;
| diff-strict || 嚴格比對&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;is_makefile&amp;quot;: false,&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;diff&amp;quot;,&lt;br /&gt;
    &amp;quot;test&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;data&amp;quot;: [&lt;br /&gt;
                1, 2, 3, 4, 5, &amp;quot;hard-1&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;weight&amp;quot;: 100&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
data的部份是測資檔案名稱&lt;br /&gt;
需將檔案放到 /res/testdata 下面&lt;br /&gt;
&lt;br /&gt;
輸入輸出檔都需要 (.in, .out)&lt;br /&gt;
&lt;br /&gt;
=== Makefile題目 (編譯互動題) ===&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;is_makefile&amp;quot;: true,&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;diff&amp;quot;,&lt;br /&gt;
    &amp;quot;test&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;data&amp;quot;: [&lt;br /&gt;
                1, 2, 3, 4, 5&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;weight&amp;quot;: 100&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 res/make 新增 Makefile 與 要編譯的檔案&lt;br /&gt;
;/res/make/Makefile&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
default:&lt;br /&gt;
    g++ main.cpp stub.cpp -o $(OUT)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
stub.cpp 可以自己換成其他要一起編譯的檔案，編譯選項可以自行修改&lt;br /&gt;
&lt;br /&gt;
=== CMS/Testlib Checker ===&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;cms&amp;quot;,&lt;br /&gt;
    &amp;quot;test&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;data&amp;quot;: [&lt;br /&gt;
                1, 2, 3, 4, 5&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;weight&amp;quot;: 100&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/check.cpp&lt;br /&gt;
會傳入三個參數，分別為測資輸入，測資輸出，答案輸入&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
int main(int argc, char** argv) {&lt;br /&gt;
    std::ifstream test_in(argv[1]);&lt;br /&gt;
    std::ifstream test_out(argv[2]);&lt;br /&gt;
    std::ifstream ans_in(argv[3]);&lt;br /&gt;
&lt;br /&gt;
    // C&lt;br /&gt;
    FILE* test_in_ptr = fopen(argv[1], &amp;quot;r&amp;quot;);&lt;br /&gt;
    FILE* test_out_ptr = fopen(argv[2], &amp;quot;r&amp;quot;);&lt;br /&gt;
    FILE* ans_in_ptr = fopen(argv[3], &amp;quot;r&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    fclose(test_in_ptr);&lt;br /&gt;
    fclose(test_out_ptr);&lt;br /&gt;
    fclose(ans_in_ptr);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/check.py&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/python3&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
test_in = open(sys.argv[1])&lt;br /&gt;
test_out = open(sys.argv[2])&lt;br /&gt;
ans_in = open(sys.argv[3])&lt;br /&gt;
&lt;br /&gt;
test_in.close()&lt;br /&gt;
test_out.close()&lt;br /&gt;
ans_in.close()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Verdict Message (Checker Message) ====&lt;br /&gt;
對標準錯誤 (STDERR) 輸出 verdict message&lt;br /&gt;
&lt;br /&gt;
C/C++&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
std::cerr &amp;lt;&amp;lt; &amp;quot;checker message&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;cstdio&amp;gt;&lt;br /&gt;
fprintf(stderr, &amp;quot;checker message&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
print(&amp;quot;checker message&amp;quot;, sys.stderr)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Special Score &amp;amp; Status ====&lt;br /&gt;
對標準輸出 (STDOUT) 輸出 Special Score &amp;amp; Status，輸出標準如下&lt;br /&gt;
ScoreType;Score;Status&lt;br /&gt;
&lt;br /&gt;
===== Score =====&lt;br /&gt;
ScoreType 可以是 NONE, CMS, CF&lt;br /&gt;
&lt;br /&gt;
NONE 代表 Judge 不會理會 Score 的值&lt;br /&gt;
&lt;br /&gt;
CMS 代表 Judge 會將 該題子任務分數乘上 Score (與 CMS 的 GroupMin 相同)，且 Score 範圍應該從 0.0 到 1.0，大於 1.0 將設定為 1.0，小於 0.0 將設定為 0.0&lt;br /&gt;
&lt;br /&gt;
CF 代表 Judge 會直接用 Score 覆蓋該子任務分數&lt;br /&gt;
&lt;br /&gt;
===== Status =====&lt;br /&gt;
Status 可以是 TOJ 所支援的所有 Status (AC, PC, WA, RE, RESIG, TLE, MLE, OLE, CE, CLE, SJE, IE)&lt;br /&gt;
&lt;br /&gt;
如果 Status 為空 或 不在支援的 Status 中將按照 Checker 回傳值決定狀態 (return 0 為 AC，其餘為 WA)&lt;br /&gt;
&lt;br /&gt;
下面列出幾個作為參考&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! STDOUT String !! Score !! Status&lt;br /&gt;
|-&lt;br /&gt;
| CMS;0.5;PC || 子任務分數 * 0.5 || PC (Partial Correct)&lt;br /&gt;
|-&lt;br /&gt;
| CF;32.27;AC || 32.27 || AC (Answer Correct)&lt;br /&gt;
|-&lt;br /&gt;
| NONE;3131;WA || 子任務分數 || WA (Wrong Answer)&lt;br /&gt;
|-&lt;br /&gt;
| CF;32.27; || 32.27 || 按照 Return 值決定是 AC 或 WA&lt;br /&gt;
|-&lt;br /&gt;
| ;; || 子任務分數 || 按照 Return 值決定是 AC 或 WA&lt;br /&gt;
|-&lt;br /&gt;
| (沒有任何輸出) || 子任務分數 || 按照 Return 值決定是 AC 或 WA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;/res/check/build&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
g++ -o check check.cpp&lt;br /&gt;
# python&lt;br /&gt;
# cp check.py check&lt;br /&gt;
# chmod +x check&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== IORedir ===&lt;br /&gt;
將[https://github.com/TFcis/Problem-setting-tools/blob/master/TOJ-problem-example/conf.json conf.json]中的 check 從 diff 改成 ioredir，及設定 metadata 如下。&lt;br /&gt;
如果 Checker 的 STDOUT 或 STDERR 沒有被佔用且有輸出內容，那 Verdict Message (Checker Message) 將會為該內容 (如果兩個同時都有，STDERR 優先於 STDOUT&lt;br /&gt;
&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;ioredir&amp;quot;,&lt;br /&gt;
    &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
        &amp;quot;redir_test&amp;quot;: {&lt;br /&gt;
            &amp;quot;pipeout&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;testin&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;testout&amp;quot;: -1,&lt;br /&gt;
            &amp;quot;pipein&amp;quot;: -1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;redir_check&amp;quot;: {&lt;br /&gt;
            &amp;quot;ansin&amp;quot;: 2,&lt;br /&gt;
            &amp;quot;testin&amp;quot;: -1,&lt;br /&gt;
            &amp;quot;pipeout&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;pipein&amp;quot;: -1&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果要用 ioredir 實現互動題， metadata 可以這樣寫&lt;br /&gt;
&lt;br /&gt;
從 STDERR 讀入測資，對 STDOUT 輸出測資&lt;br /&gt;
從 STDIN 讀入答案&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;redir_test&amp;quot;: {&lt;br /&gt;
        &amp;quot;pipein&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;testin&amp;quot;: -1,&lt;br /&gt;
        &amp;quot;pipeout&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;testout&amp;quot;: -1&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;redir_check&amp;quot;: {&lt;br /&gt;
        &amp;quot;ansin&amp;quot;: -1,&lt;br /&gt;
        &amp;quot;pipein&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;testin&amp;quot;: 2,&lt;br /&gt;
        &amp;quot;pipeout&amp;quot;: 0&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/check.cpp&lt;br /&gt;
分別從答案及輸出分別讀入long double。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
long double Answer, Output;&lt;br /&gt;
FILE *ansf = fdopen(2, &amp;quot;r&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
scanf(&amp;quot;%Lf&amp;quot;, &amp;amp;Output);&lt;br /&gt;
fscanf(ansf, &amp;quot;%Lf&amp;quot;, &amp;amp;Answer);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/build&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
g++ -o check check.cpp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
參考 https://hackmd.io/s/BkHdt57I&lt;br /&gt;
&lt;br /&gt;
=== Polygon to TOJ ===&lt;br /&gt;
請參考 [https://github.com/TFcis/cf2toj cf2toj]&lt;br /&gt;
&lt;br /&gt;
=== TPS to TOJ ===&lt;br /&gt;
請參考 [https://github.com/TFcis/tps2toj tps2toj]&lt;br /&gt;
&lt;br /&gt;
=== CMS to TOJ ===&lt;br /&gt;
請參考 [https://github.com/TFcis/cms2toj cms2toj]&lt;br /&gt;
&lt;br /&gt;
=== 小技巧 ===&lt;br /&gt;
==== OI制 (APCS) ====&lt;br /&gt;
可以只上傳範例測資，並把該子任務分數設定為 0&lt;br /&gt;
&lt;br /&gt;
==== 負分 ====&lt;br /&gt;
TOJ其實可以設定子任務分數為負數，但可能會有很多問題&lt;br /&gt;
Scoreboard 應該選擇 IOI2013&lt;br /&gt;
&lt;br /&gt;
== 參見 ==&lt;br /&gt;
* [[TOJ API]]：API文檔&lt;br /&gt;
* [https://github.com/pzread/judge judge原始碼]&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=TPS&amp;diff=470</id>
		<title>TPS</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=TPS&amp;diff=470"/>
		<updated>2025-08-01T06:36:09Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;TPS（Task Preparation System）是一套可以方便產生題目測試資料以及題本的工具，關於 TPS 可以參考以下的 GitHub Repo：&lt;br /&gt;
* TPS Example：https://github.com/TNFSH-Programming-Contest/TPS-example&lt;br /&gt;
* IOI 2017 TPS：https://github.com/ioi-2017/tps&lt;br /&gt;
&lt;br /&gt;
{{Memo|本頁面主要使用 TNFSH-Programming-Contest/cms-environment-testing-problem&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem&amp;lt;/ref&amp;gt; 的 pB&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/tree/main/pB&amp;lt;/ref&amp;gt; 作為範本。|}}&lt;br /&gt;
&lt;br /&gt;
[[File:Icon tools.svg|20px]] 以下有此標誌的說明需要 CMS 系統管理員操作，出題者可忽略此說明。&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
== 資料夾結構 ==&lt;br /&gt;
=== 根目錄 ===&lt;br /&gt;
==== .github/workflows ====&lt;br /&gt;
GitHub 自動化流程設定檔。&lt;br /&gt;
&lt;br /&gt;
==== pX ====&lt;br /&gt;
pA、pB 等{{slink||題目資料夾}}。&lt;br /&gt;
&lt;br /&gt;
==== .problems.json ====&lt;br /&gt;
記錄{{slink||題目資料夾}}列表，供 GitHub Actions {{slink||自動建置}}使用，通常不應手動修改。&lt;br /&gt;
&lt;br /&gt;
==== Makefile ====&lt;br /&gt;
[[File:Icon tools.svg|20px]] 匯入 CMS 的指令&lt;br /&gt;
&lt;br /&gt;
==== README.md ====&lt;br /&gt;
主要在 GitHub 頁面上提供常用連結。&lt;br /&gt;
&lt;br /&gt;
==== cover.tex ====&lt;br /&gt;
題本封面。&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/cover.tex&lt;br /&gt;
&lt;br /&gt;
==== appendix.tex ====&lt;br /&gt;
題本附錄。&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/tps-starter/blob/main/appendix.tex&lt;br /&gt;
&lt;br /&gt;
==== template.tex ====&lt;br /&gt;
題本內文模板，通常無需修改。&lt;br /&gt;
&lt;br /&gt;
=== 題目資料夾 ===&lt;br /&gt;
==== attachments ====&lt;br /&gt;
放在此處的所有檔案將會上傳到 CMS 上，供參賽者在題目敘述頁的「附件」，通常僅會在 pA 的附件放置{{slink||合併題本}}。&lt;br /&gt;
&lt;br /&gt;
[[File:Crystal Clear action run.png|20px]] 本目錄內容通常由程式自動產生。&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/tree/main/pA/attachments&lt;br /&gt;
&lt;br /&gt;
==== gen ====&lt;br /&gt;
放置{{slink||產測資}}相關的所有檔案。&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/tree/main/pB/gen&lt;br /&gt;
&lt;br /&gt;
==== gen/manual ====&lt;br /&gt;
{{See also|#手產測資檔}}&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/tree/main/pB/gen/manual&lt;br /&gt;
&lt;br /&gt;
==== gen/data ====&lt;br /&gt;
{{See also|#產測資指令}}&lt;br /&gt;
&lt;br /&gt;
==== scripts ====&lt;br /&gt;
[[File:Crystal Clear action run.png|20px]] 本目錄保存 TPS scripts，不需修改。&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/tree/main/pB/scripts&lt;br /&gt;
&lt;br /&gt;
==== solution ====&lt;br /&gt;
{{See also|#標程}}&lt;br /&gt;
&lt;br /&gt;
==== statement ====&lt;br /&gt;
題本相關檔案，包含原始碼、圖片、{{slink||建置題本}}產生的 PDF。&lt;br /&gt;
&lt;br /&gt;
==== statement/index.md ====&lt;br /&gt;
{{See also|#題目敘述}}&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/statement/index.md&lt;br /&gt;
&lt;br /&gt;
==== tests ====&lt;br /&gt;
{{slink||產測資}}後的檔案會存放於此，參見{{slink||建置測資}}。&lt;br /&gt;
&lt;br /&gt;
[[File:Crystal Clear action run.png|20px]] 本目錄內容由程式自動產生，不應手動編輯。&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/tree/main/pB/tests&lt;br /&gt;
&lt;br /&gt;
==== validator ====&lt;br /&gt;
{{See also|#驗測資程式}}&lt;br /&gt;
&lt;br /&gt;
==== problem.json ====&lt;br /&gt;
題目的相關設定，參見{{slink||競賽名稱|題目名稱|題目英文名稱|題目編號|記憶體限制|時間限制}}。&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/problem.json&lt;br /&gt;
&lt;br /&gt;
==== solutions-check.txt ====&lt;br /&gt;
所有標程的執行結果報告。&lt;br /&gt;
&lt;br /&gt;
[[File:Crystal Clear action run.png|20px]] 本檔案由程式自動產生，不應手動編輯。&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/solutions-check.txt&lt;br /&gt;
&lt;br /&gt;
==== solutions.json ====&lt;br /&gt;
列出所有{{slink||標程}}及其 verdict，標記為 model_solution 的標程會用於{{slink||產測資}}。&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/solutions.json&lt;br /&gt;
&lt;br /&gt;
==== subtasks.json ====&lt;br /&gt;
列出所有的{{slink||子任務}}，及每個子任務所使用的{{slink||驗測資程式}}。&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/subtasks.json&lt;br /&gt;
&lt;br /&gt;
== 準備GitHub Repo ==&lt;br /&gt;
=== 建立GitHub Repo ===&lt;br /&gt;
# 進入 tps-starter。&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/tps-starter&amp;lt;/ref&amp;gt;&lt;br /&gt;
# 點擊 Use this template。&amp;lt;ref&amp;gt;直接連結：https://github.com/TNFSH-Programming-Contest/tps-starter/generate&amp;lt;/ref&amp;gt;&lt;br /&gt;
# 填寫Repo資訊&lt;br /&gt;
#* Repository name 填入競賽英文名，例如「cms-environment-testing-problem」。&lt;br /&gt;
#* Description 填入競賽中文名，例如「CMS環境測試題目通用版」。&lt;br /&gt;
#* [[File:OOjs UI icon alert-destructive.svg|20px]] &#039;&#039;&#039;注意：&#039;&#039;&#039;可見度必須選擇 &#039;&#039;&#039;Private&#039;&#039;&#039;。&lt;br /&gt;
#* 點擊 Create repository from template。&lt;br /&gt;
# 開啟 Github Action 權限&lt;br /&gt;
## 前往 Settings -&amp;gt; Actions -&amp;gt; General&lt;br /&gt;
## 找到 Workflow permissions &lt;br /&gt;
## 選取 Read and write Permissions 並保存設定&lt;br /&gt;
# （可選）若要將 GitHub Repo 更新傳送到 Discord，請參考 [https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks Intro to Webhooks – Discord] 操作。&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 建立題目資料夾 ===&lt;br /&gt;
此操作在每個競賽通常僅需執行 1 次。&lt;br /&gt;
# 進入由 tps-starter 建立的 GitHub repo。&lt;br /&gt;
# 點擊 Actions。&lt;br /&gt;
# 在 Workflows 段落，點擊 New problem。&amp;lt;ref&amp;gt;參考連結：https://github.com/TNFSH-Programming-Contest/TPS-example/actions/workflows/new-problem.yml&amp;lt;/ref&amp;gt;&lt;br /&gt;
# 點擊 Run workflow，在 How many problems in this contest? 輸入要建立的題目數量。&lt;br /&gt;
#* 如果已有 3 題，要再新增 1 題，直接輸入 4 即可，已建立的目錄會直接被略過。&lt;br /&gt;
# 點擊藍色 Run workflow 按鈕。&lt;br /&gt;
# 等待題目資料夾建立完成，約 1 分鐘。&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 刪除題目資料夾 ===&lt;br /&gt;
雖然這通常不會發生，但如果誤建過多題目等情況，需要刪除題目資料夾時，請務必完成以下所有操作：&lt;br /&gt;
# 刪除{{slink||題目資料夾}}。&lt;br /&gt;
# 從{{slink||.problems.json}}刪除題目編號。&lt;br /&gt;
# 從{{slink||Makefile}}刪除對應題目的匯入指令。&lt;br /&gt;
# 從{{slink||README.md}}刪除對應題目的連結。&lt;br /&gt;
&lt;br /&gt;
== 準備TPS資料 ==&lt;br /&gt;
=== 競賽名稱 ===&lt;br /&gt;
競賽名稱使用於：&lt;br /&gt;
# CMS 參賽介面左上角。&lt;br /&gt;
# 題本封面第一行。&lt;br /&gt;
# 題本內文各頁的左上角。&lt;br /&gt;
&lt;br /&gt;
需寫入於：（範例為「CMS環境測試題目通用版 v1.1」）&lt;br /&gt;
# {{slink||cover.tex}}。&lt;br /&gt;
# 各題目{{slink||problem.json}}的 contest_name 欄位。&lt;br /&gt;
# [[File:Icon tools.svg|20px]] CMS 管理系統的 Description 欄位。&lt;br /&gt;
&lt;br /&gt;
=== 題目名稱 ===&lt;br /&gt;
題目名稱（problem title）使用於：&lt;br /&gt;
# CMS 競賽概況的題目列表。&lt;br /&gt;
# CMS 題目敘述頁面。&lt;br /&gt;
# 題目標題（第一頁第一行）。&lt;br /&gt;
# 該題目各頁右上角。&lt;br /&gt;
&lt;br /&gt;
需寫入於{{slink||problem.json}}的 title 欄位，範例為「Piñata」。&lt;br /&gt;
&lt;br /&gt;
=== 題目英文名稱 ===&lt;br /&gt;
題目英文名稱（problem name）應足以讓所有命題人員識別個別題目即可，通常取自於中文題目名稱，並盡量僅使用一個英文詞，首字大寫，若需要兩個英文詞以上，則使用[[zhwiki:駝峰式大小寫|PascalCase]]。使用於：&lt;br /&gt;
# CMS 競賽概況的題目列表。&lt;br /&gt;
# CMS 題目敘述。&lt;br /&gt;
# CMS 系統內部用來識別題目的 [[zhwiki:主鍵|Primary key]]。&lt;br /&gt;
#* [[File:Icon tools.svg|20px]] 由於同一 CMS 系統上的名稱無法重複，若與其他競賽題目衝突&amp;lt;ref&amp;gt;https://github.com/cms-dev/cms/issues/765&amp;lt;/ref&amp;gt;，建議加上競賽名稱的英文縮寫作為前綴（例如「2022P-」）。&lt;br /&gt;
# 可能作為 GitHub repo 內的題目資料夾名稱。&lt;br /&gt;
&lt;br /&gt;
需寫入於{{slink||problem.json}}的 name 欄位，範例為「Pinata」。&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 題目編號 ===&lt;br /&gt;
題目編號（problem label）為 A, B, C... 的流水號，在決定題目順序後才會確定，使用於：（範例為「B」）&lt;br /&gt;
# CMS 競賽概況的題目列表。&lt;br /&gt;
# 題目標題（第一頁第一行）。&lt;br /&gt;
# 該題目各頁右上角。&lt;br /&gt;
# 該題目各頁頁碼處。&lt;br /&gt;
&lt;br /&gt;
=== 記憶體限制 ===&lt;br /&gt;
需寫入於{{slink||problem.json}}的 memory_limit 欄位，單位為MB，範例為「512」MB。&lt;br /&gt;
&lt;br /&gt;
=== 時間限制 ===&lt;br /&gt;
需寫入於{{slink||problem.json}}的 time_limit 欄位，單位為秒，範例為「1.0」秒。&lt;br /&gt;
&lt;br /&gt;
=== 標程 ===&lt;br /&gt;
AC code（又稱官方解法、標程等）需放置在{{slink||solution}}資料夾內，檔名無限制。同時將該檔名寫入{{slink||solutions.json}}，格式請參照範本，verdict 必須標記為 model_solution，範例檔名為「ac.cpp」&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/tree/main/pB/solution/ac.cpp&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
其他 AC code 亦按照前述方式操作，verdict 必須標記為 correct。&lt;br /&gt;
&lt;br /&gt;
其他類型的錯誤解法亦按照前述方式操作，verdict 標記方式請參考官方說明&amp;lt;ref&amp;gt;https://github.com/ioi-2017/tps/tree/master/docs#solutionsjson&amp;lt;/ref&amp;gt;及 tps script&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/tps-task-templates/blob/93cff7e64a43f57450b26568194432e7b662be38/default/scripts/internal/invoke.py#L18&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 產測資 ===&lt;br /&gt;
TPS 產測資方式與 Codeforces polygon 相同。測資可以使用手產測資檔案，亦可由程式亂數產生，亦可混合兩者。&lt;br /&gt;
&lt;br /&gt;
==== 手產測資檔 ====&lt;br /&gt;
{{Memo|&#039;&#039;&#039;最佳實踐：&#039;&#039;&#039;&lt;br /&gt;
# 僅在 [[:zhwiki:en:Edge case|edge case]] 使用手產測資檔，其他使用產測程式。&lt;br /&gt;
# 範例測資亦可隨機產生，若想要手動指定，亦可使用手產測資檔。&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
手產測資檔應放置在{{slink||gen/manual}}資料夾內，檔名無限制，但建議副檔名為 .in。&lt;br /&gt;
&lt;br /&gt;
本範例有 2 個範例測資，其中一個使用手產測資檔 sample-01.in&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/gen/manual/sample-01.in&amp;lt;/ref&amp;gt;，另一個為隨機測資。&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
==== 產測資程式 ====&lt;br /&gt;
{{Memo|&#039;&#039;&#039;重要：&#039;&#039;&#039;產測資程式必須&lt;br /&gt;
# 使用命令列參數讀入測資組及測資點&amp;lt;ref&amp;gt;[https://en.cppreference.com/w/cpp/language/main_function Main function - cppreference.com]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[https://stackoverflow.com/questions/3024197/what-does-int-argc-char-argv-mean c++ - What does int argc, char *argv&amp;amp;#x5B;&amp;amp;#x5D; mean? - Stack Overflow]&amp;lt;/ref&amp;gt;。&lt;br /&gt;
# 使用[[zhwiki:stdout|標準輸出（stdout）]]，不可直接寫入檔案。&lt;br /&gt;
# 執行一次僅輸出一筆測資。&lt;br /&gt;
# 使用 testlib.h&amp;lt;ref&amp;gt;[https://codeforces.com/blog/entry/18291 Generators with testlib.h]&amp;lt;/ref&amp;gt; 等設定亂數種子的方式，使得每次產生的測資都是相同的。&lt;br /&gt;
|inline:notice}}&lt;br /&gt;
&lt;br /&gt;
產測資程式（generator）應放置在{{slink||gen}}資料夾內，檔名無限制。‎&lt;br /&gt;
&lt;br /&gt;
以下說明請配合範例檔案 gen/gen.cpp&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/gen/gen.cpp&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
使用 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; inline&amp;gt;#include &amp;quot;testlib.h&amp;quot;&amp;lt;/syntaxhighlight&amp;gt; 引入 testlib 函式庫。&lt;br /&gt;
&lt;br /&gt;
main 函數務必寫成 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; inline&amp;gt;int main(int argc, char* argv[])&amp;lt;/syntaxhighlight&amp;gt; 來接收命令列參數。&lt;br /&gt;
&lt;br /&gt;
在 main 函數的第一行使用 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; inline&amp;gt;registerGen(argc, argv, 1);&amp;lt;/syntaxhighlight&amp;gt; 將命令列參數作為亂數種子。&lt;br /&gt;
&lt;br /&gt;
命令列參數會保存在 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; inline&amp;gt;argv&amp;lt;/syntaxhighlight&amp;gt; 內，可將其保存在 string 內： &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; inline&amp;gt;string task = argv[1];&amp;lt;/syntaxhighlight&amp;gt;，或是使用 atoi&amp;lt;ref&amp;gt;https://en.cppreference.com/w/cpp/string/byte/atoi&amp;lt;/ref&amp;gt; 等函數轉換為整數。例如範例中第一個參數用來判斷是第幾組測資，將其轉換為 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; inline&amp;gt;int taskN&amp;lt;/syntaxhighlight&amp;gt; 用於判斷。若為第一筆測資，測資範圍則為 87，若為其他測資，測資範圍則為 10^9。&lt;br /&gt;
&lt;br /&gt;
使用 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; inline&amp;gt;rnd.next(-maxN, maxN)&amp;lt;/syntaxhighlight&amp;gt; 來隨機產生範圍在 -maxN 到 maxN 之間的整數，保存在變數上用於之後輸出。&lt;br /&gt;
&lt;br /&gt;
最後將產生的測資輸出。&lt;br /&gt;
&lt;br /&gt;
{{Memo}} 由於 cout 中執行順序屬未定義行為，請勿將多個 rnd.next 合併在一個 cout 中使用，請分開 cout 或事先保存在變數上。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
cout &amp;lt;&amp;lt; rnd.next (1, n) &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| {{Y}} &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
cout &amp;lt;&amp;lt; rnd.next (1, n) &amp;lt;&amp;lt; &amp;quot; &amp;quot; &amp;lt;&amp;lt; rnd.next (1, n) &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| {{N}} 未定義行為&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
cout &amp;lt;&amp;lt; rnd.next (1, n) &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
cout &amp;lt;&amp;lt; rnd.next (1, n) &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| {{Y}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
int a = rnd.next (1, n), b = rnd.next (1, n);&lt;br /&gt;
cout &amp;lt;&amp;lt; a &amp;lt;&amp;lt; &amp;quot; &amp;quot; &amp;lt;&amp;lt; b &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| {{Y}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
完成產測資程式後，編譯成檔名為 gen 的執行檔（在 Windows 上的 gen.exe），在命令列使用：&lt;br /&gt;
* &amp;lt;code&amp;gt;gen 1&amp;lt;/code&amp;gt; 會隨機產生 4 個 -87 ~ 87 之間的數字（格式參見題目敘述）&lt;br /&gt;
* &amp;lt;code&amp;gt;gen 2&amp;lt;/code&amp;gt; 會隨機產生 4 個 -10^9 ~ 10^9 之間的數字&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
==== 產測資指令 ====&lt;br /&gt;
產測資指令應放置在{{slink||gen/data}}，以下說明請配合範例。‎&lt;br /&gt;
&lt;br /&gt;
每一個測資點以 @subtask 接測資點代號為開頭，這個測資點代號亦會使用在{{slink||子任務}}。&lt;br /&gt;
&lt;br /&gt;
接下來每個測資點可以有多筆測資，每筆測資可以使用手產測資檔，也可使用產測資程式。&lt;br /&gt;
* 使用手產測資檔則為 manual 接續放在{{slink||gen/manual}}資料夾內的測資檔名。&lt;br /&gt;
* 使用產測資程式則為呼叫在命令列中的指令。&lt;br /&gt;
&lt;br /&gt;
範例中第一行為 @subtask samples 為範例測資（samples 為固定名稱不可更改），包含一個手動測資檔 sample-01.in&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/gen/manual/sample-01.in&amp;lt;/ref&amp;gt;。&lt;br /&gt;
{{Memo|&#039;&#039;&#039;重要：&#039;&#039;&#039;將範例測資作為配分為 0 的第一筆測資點，名稱為 samples。|}}&lt;br /&gt;
&lt;br /&gt;
範例中除了範例測資外，共有 2 個測資點，名稱分別為 small 跟 all。兩個測資點都包含 5 筆自動測資。&lt;br /&gt;
&lt;br /&gt;
{{Memo}} 如果呼叫產測程式，但在指令中輸入了兩行一模一樣的內容，那麼這兩個測資就會相同（在設定亂數種子的情況下）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
@subtask small&lt;br /&gt;
gen 1&lt;br /&gt;
gen 1&lt;br /&gt;
gen 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| {{N}} 會產生 3 筆相同測資&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
@subtask small&lt;br /&gt;
gen 1 1&lt;br /&gt;
gen 1 2&lt;br /&gt;
gen 1 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| {{Y}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
@subtask small&lt;br /&gt;
gen 1 pewfw&lt;br /&gt;
gen 1 qrewx&lt;br /&gt;
gen 1 xckxk&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| {{Y}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
因此通常會在後面放上隨機文字作為亂數種子的一部分，亦可透過更換亂數種子來重新產生測資，隨機文字可使用線上工具&amp;lt;ref&amp;gt;例如 [https://www.random.org/strings/ Random String Generator]&amp;lt;/ref&amp;gt;產生。&lt;br /&gt;
&lt;br /&gt;
{{Memo|&#039;&#039;&#039;小技巧：&#039;&#039;&#039;&lt;br /&gt;
# 透過命令列參數直接控制測資範圍，就不需要在產測資程式碼內判斷測資點。&lt;br /&gt;
# 發現不良的測資時，透過修改命令列參數的隨機文字來得到一筆新的隨機測資。&lt;br /&gt;
# 若需要 edge case，使用手產測資檔。&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 驗測資程式 ===&lt;br /&gt;
{{Quote&lt;br /&gt;
| 如果你寫了一個程式解題的問題，並準備好了測試資料，那麼你將可能會遇到一個恐怖的經驗：測試資料是無效的！（即測試資料並未符合題目所規定的限制），例如超過了範圍上限、你的圖實際上沒有連通、或是你的圖不是一棵樹……你很可能會有這種經驗，就算是有經驗的出題者也可能有時會出錯（知名案例像是 ACM ICPC World final 2007）。&lt;br /&gt;
| 翻譯自 [https://codeforces.com/blog/entry/18426 Codeforces 上對於 Validator 的引言]。&lt;br /&gt;
}}&lt;br /&gt;
{{Memo|&#039;&#039;&#039;最佳實踐：&#039;&#039;&#039;撰寫驗測資程式來自動檢查測資範圍及其他條件是否有符合題目的規定，避免測資範圍錯誤。|}}&lt;br /&gt;
&lt;br /&gt;
驗測資程式（validator）應該放置在{{slink||validator}}資料夾內，檔名無限制，並將檔名寫入{{slink||subtasks.json}}的 global_validators 或 subtasks 的 validators。&lt;br /&gt;
&lt;br /&gt;
本範例包含 2 個 validator。&lt;br /&gt;
&lt;br /&gt;
validator.cpp &amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/validator/validator.cpp&amp;lt;/ref&amp;gt; 用來驗證所有測資的範圍是否在 -10^9 ~ 10^9 內，故在{{slink||subtasks.json}}中設為 global_validators。&lt;br /&gt;
&lt;br /&gt;
validator-small.cpp&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/validator/validator-small.cpp&amp;lt;/ref&amp;gt; 僅用來測試第 2 筆測資（index = 1）範圍是否在 -87 ~ 87，在{{slink||subtasks.json}}中設定為測資 small 的 validators。&lt;br /&gt;
&lt;br /&gt;
除了檢查範圍以外，readInt 等函數會回傳其數值，可以保存到變數上作進一步檢查，例如檢查陣列數值皆相異，檢查是否是圖、樹或其他資料結構。&lt;br /&gt;
&lt;br /&gt;
更多資訊請參見 Codeforces 上的說明&amp;lt;ref&amp;gt;[https://codeforces.com/blog/entry/18426 Validators with testlib.h - Codeforces]&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
{{Memo|&#039;&#039;&#039;小提示：&#039;&#039;&#039;驗測資程式僅檢查與解法無關的輸入資料限制，檢查是否 TLE、得部分分數屬於{{slink||標程}}的範圍。|}}&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 子任務 ===&lt;br /&gt;
子任務（subtask）設定於{{slink||subtasks.json}}，包含各子任務的配分、文字描述、{{slink||驗測資程式}}。以下說明請參考範例。&lt;br /&gt;
&lt;br /&gt;
subtasks.json 最外層包含兩個 key：&lt;br /&gt;
* global_validators：在所有測資使用的{{slink||驗測資程式}}。&lt;br /&gt;
* subtasks：包含所有測資點。&lt;br /&gt;
&lt;br /&gt;
subtasks 是一個 key-value pairs，key 與{{slink||產測資指令}}中設定的相同。value 包含以下 key-value pairs：&lt;br /&gt;
* index：流水號，出現在題本內的順序，從 0 開始；samples 必為 0。&lt;br /&gt;
* score：子任務分數；samples 必為 0。&lt;br /&gt;
* text：子任務描述，使用在題目描述內。&lt;br /&gt;
* validators：僅在該子任務使用的{{slink||驗測資程式}}。&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 題目敘述 ===&lt;br /&gt;
題目敘述（statement）的檔案放置於{{slink||statement/index.md}}。使用 [[zhwiki:Markdown|Markdown]] 及 [[zhwiki:XeTeX|XeTeX]] 語法。&lt;br /&gt;
&lt;br /&gt;
結構由上到下依序為：&lt;br /&gt;
# {{slink||題目圖片}}&lt;br /&gt;
# {{slink||題目本文}}&lt;br /&gt;
# 輸入（說明），參見{{slink||輸入及輸出說明}}&lt;br /&gt;
# 輸出（說明），參見{{slink||輸入及輸出說明}}&lt;br /&gt;
# {{slink||輸入限制}}&lt;br /&gt;
# {{slink||子任務}}說明&lt;br /&gt;
# 範例輸入，參見{{slink||範例輸入及輸出}}&lt;br /&gt;
# 範例輸出，參見{{slink||範例輸入及輸出}}&lt;br /&gt;
# {{slink||提示}}&lt;br /&gt;
&lt;br /&gt;
==== 題目圖片 ====&lt;br /&gt;
參見{{slink|題目敘述故事|插圖}}。&lt;br /&gt;
&lt;br /&gt;
==== 題目本文 ====&lt;br /&gt;
參見[[題目敘述故事]]。&lt;br /&gt;
&lt;br /&gt;
==== 輸入及輸出說明 ====&lt;br /&gt;
輸入輸出說明必須明確說明參賽者要遵守的格式。&lt;br /&gt;
&lt;br /&gt;
應該以一行敘述測資中的一行所代表的資料，例如：&lt;br /&gt;
* 第一行有 1 個整數，代表接下來的測資數量。&lt;br /&gt;
* 第一行有 2 個整數，代表初始座標。&lt;br /&gt;
&lt;br /&gt;
如果需要在其他地方（輸入說明的其他行、輸入限制、題目本文等）提到該變數，應賦予變數代號，例如：&lt;br /&gt;
* 第一行有 2 個整數 &amp;lt;math&amp;gt;V, E&amp;lt;/math&amp;gt;，&amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; 代表點的數量，&amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; 代表邊的數量。&lt;br /&gt;
* 第一行有 1 個整數 &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;，代表有 &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; 個人。...（換行）...接下來有 &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; 行，每一行有 1 個整數代表該人的分數。&lt;br /&gt;
{{Memo|&#039;&#039;&#039;注意：&#039;&#039;&#039;同一個變數代號必須在該題目的任何地方皆相同，大小寫也必須相同。|}}&lt;br /&gt;
&lt;br /&gt;
==== 輸入限制 ====&lt;br /&gt;
輸入限制用來告知參賽者測資的數值範圍限制，&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 原始碼 !! 顯示結果&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;markdown&amp;quot;&amp;gt;&lt;br /&gt;
- $1 \leq N \leq 100$&lt;br /&gt;
- $1 \leq M \leq N$&lt;br /&gt;
- $Y - X$ 必定為 2 個倍數&lt;br /&gt;
- 若 $A = 1$，則 $B &amp;gt; 0$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;math&amp;gt;1 \leq N \leq 100&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;1 \leq M \leq N&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;Y - X&amp;lt;/math&amp;gt; 必定為 2 個倍數&lt;br /&gt;
* 若 &amp;lt;math&amp;gt;A = 1&amp;lt;/math&amp;gt;，則 &amp;lt;math&amp;gt;B &amp;gt; 0&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== 子任務說明 ====&lt;br /&gt;
參見{{slink||子任務}}的操作，即會自動顯示於題本中。&lt;br /&gt;
&lt;br /&gt;
==== 範例輸入及輸出 ====&lt;br /&gt;
範例輸入輸出必須與{{slink||產測資}}中設定的範例測資相同。&lt;br /&gt;
&lt;br /&gt;
{{TOJ side box&lt;br /&gt;
|628|B. 國中會考分&lt;br /&gt;
}}&lt;br /&gt;
如果有多筆範例測資，標題應改命名為「範例輸入1、範例輸出1、範例輸入2、範例輸出2」等。&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
{{TOJ side box&lt;br /&gt;
|631|E. 蓋歐格（單個範例附說明）&lt;br /&gt;
|632|F. 最小生成數（多個範例，僅有 1 個範例有說明）&lt;br /&gt;
|637|D. 本田小狼（有圖片的範例說明）&lt;br /&gt;
}}&lt;br /&gt;
如果有需要說明測資，可加上「範例說明」章節，詳細說明範例測資中的意義，亦可附圖說明。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top&amp;quot; |&lt;br /&gt;
* 範例輸入&lt;br /&gt;
* 範例輸出&lt;br /&gt;
| style=&amp;quot;vertical-align: top&amp;quot; |&lt;br /&gt;
* 範例輸入1&lt;br /&gt;
* 範例輸出1&lt;br /&gt;
* 範例輸入2&lt;br /&gt;
* 範例輸出2&lt;br /&gt;
| style=&amp;quot;vertical-align: top&amp;quot; |&lt;br /&gt;
* 範例輸入1&lt;br /&gt;
* 範例輸出1&lt;br /&gt;
* 範例說明1&lt;br /&gt;
* 範例輸入2&lt;br /&gt;
* 範例輸出2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== 提示 ====&lt;br /&gt;
{{TOJ side box&lt;br /&gt;
|335|F. 參訪者們&lt;br /&gt;
|509|C. Puyo&lt;br /&gt;
}}&lt;br /&gt;
如有需要，可以提供一些額外提示。如果內容為解題必須的，不應撰寫於提示，應寫於本文中。&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
{{TOJ side box&lt;br /&gt;
|330|A. Piñata&lt;br /&gt;
|331|B. 尼莫西妮&lt;br /&gt;
|473|A. 好哈快捷鍵&lt;br /&gt;
}}&lt;br /&gt;
亦可撰寫與解題毫無幫助，但與題目故事相關的小知識。&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
== [[zhwiki:組建自動化|自動建置]] ==&lt;br /&gt;
tps-starter&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/tps-starter&amp;lt;/ref&amp;gt; 使用了 GitHub Actions&amp;lt;ref&amp;gt;https://github.com/features/actions&amp;lt;/ref&amp;gt;，對於建置題本和測資提供了簡易介面來執行構建，並包含自動建置、自動化測試等功能。&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 建置題本 ===&lt;br /&gt;
若要將題本編譯成 PDF，按照以下步驟操作：&lt;br /&gt;
# 進入 GitHub repo。&lt;br /&gt;
# 點擊 Actions。&lt;br /&gt;
# 在 Workflows 段落，點擊 Build pdf。&amp;lt;ref&amp;gt;參考連結：https://github.com/TNFSH-Programming-Contest/TPS-example/actions/workflows/build-pdf.yml&amp;lt;/ref&amp;gt;&lt;br /&gt;
# 點擊 Run workflow，在 Problem labels to build 輸入{{slink||題目編號}}，例如「B」。&lt;br /&gt;
# 點擊藍色 Run workflow 按鈕。&lt;br /&gt;
# 等待 PDF 題本建置完成，約 2 分鐘。&lt;br /&gt;
# 可在對應題目的 statement/index.pdf 找到建置的 PDF。&amp;lt;ref&amp;gt;參考連結：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/statement/index.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 自動建置題本 ===&lt;br /&gt;
若題本已定稿，可開啟自動建置功能，之後對於相關檔案的修改都會觸發自動建置。刪除 statement/DISABLE_AUTO_BUILD&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/tps-task-templates/blob/main/default/statement/DISABLE_AUTO_BUILD&amp;lt;/ref&amp;gt; 即可開啟自動建置題本。&lt;br /&gt;
&lt;br /&gt;
修改以下檔案將會觸發自動建置：&lt;br /&gt;
* scripts/statement.sh&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/scripts/statement.sh&amp;lt;/ref&amp;gt;&lt;br /&gt;
* statement/*.jpg&amp;lt;ref&amp;gt;例如：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/statement/cover.jpg&amp;lt;/ref&amp;gt;&lt;br /&gt;
* statement/index.md&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/statement/index.md&amp;lt;/ref&amp;gt;&lt;br /&gt;
* template.tex&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/template.tex&amp;lt;/ref&amp;gt;&lt;br /&gt;
* {{slink||cover.tex}}僅會構建 pA 的題本&lt;br /&gt;
* {{slink||problem.json}}的&lt;br /&gt;
** contest_name：{{slink||競賽名稱}}&lt;br /&gt;
** problem_label：{{slink||題目編號}}&lt;br /&gt;
** name：{{slink||題目英文名稱}}&lt;br /&gt;
** title：{{slink||題目名稱}}&lt;br /&gt;
** memory_limit：{{slink||記憶體限制}}&lt;br /&gt;
** time_limit：{{slink||時間限制}}&lt;br /&gt;
* {{slink||subtasks.json}}的 index、score、text ，參見{{slink||子任務}}。&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 合併題本 ===&lt;br /&gt;
在所有題目的題本皆完成，才進行合併題本，參考{{slink||建置題本}}的操作，在第 4 步驟的 Problem labels to build 輸入「+」，即會合併題本輸出於 pA/attachments/problems.pdf。&amp;lt;ref&amp;gt;參考連結：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pA/attachments/problems.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 建置測資 ===&lt;br /&gt;
若要自動產生測資 input、output、進行標程比較：&lt;br /&gt;
# 進入 GitHub repo。&lt;br /&gt;
# 點擊 Actions。&lt;br /&gt;
# 在 Workflows 段落，點擊 Build tests。&amp;lt;ref&amp;gt;參考連結：https://github.com/TNFSH-Programming-Contest/TPS-example/actions/workflows/build-tests.yml&amp;lt;/ref&amp;gt;&lt;br /&gt;
# 點擊 Run workflow。&lt;br /&gt;
#* 若修改了{{slink||產測資}}程式，在 Problem labels to build inputs 輸入{{slink||題目編號}}，例如「B」，其他欄位不需重複輸入題號。將會自動建置輸入及輸出，若測資有變動，亦會自動測試標程。&lt;br /&gt;
#* 若僅修改了{{slink||標程}}，導致僅有輸出會變動，在 Problem labels to build outputs 輸入{{slink||題目編號}}，其他欄位不需重複輸入題號。將會自動建置輸出，若測資有變動，亦會自動測試標程。&lt;br /&gt;
#* 若僅要重新執行標程測試，在 Problem labels to run solutions 輸入{{slink||題目編號}}。&lt;br /&gt;
# 點擊藍色 Run workflow 按鈕。&lt;br /&gt;
# 等待測資建置完成。&lt;br /&gt;
# 可在對應題目的{{slink||tests}}資料夾找到建置的測資。標程測試則在{{slink||solutions-check.txt}}。&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 自動建置測資 ===&lt;br /&gt;
若產測資程式和標程皆已定稿，可開啟自動建置功能，之後對於相關檔案的修改都會觸發自動建置。刪除 gen/DISABLE_AUTO_BUILD&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/tps-task-templates/blob/main/default/gen/DISABLE_AUTO_BUILD&amp;lt;/ref&amp;gt; 即可開啟自動建置測資。&lt;br /&gt;
&lt;br /&gt;
修改以下檔案將會觸發自動建置 input：&lt;br /&gt;
* {{slink||gen}}內的所有檔案&lt;br /&gt;
&lt;br /&gt;
修改以下檔案將會觸發自動建置 output：&lt;br /&gt;
* 在{{slink||solutions.json}}內設定的 model_solution 對應檔案。請注意：若變更 model_solution 的目標檔案可能不會觸發自動建置。&lt;br /&gt;
&lt;br /&gt;
修改以下檔案將會觸發自動建置 solutions：&lt;br /&gt;
* {{slink||solution}}內的所有檔案&lt;br /&gt;
* {{slink||solutions.json}}&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 跳過自動建置 ===&lt;br /&gt;
若已經啟用自動建置，但想在特定一筆 Commit 跳過自動建置，請在 Commit message 加上 &amp;lt;code&amp;gt;[no ci]&amp;lt;/code&amp;gt;，例如：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;pA Add wa.cpp&lt;br /&gt;
&lt;br /&gt;
Add WA solution without swap&lt;br /&gt;
[no ci]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完整說明參見 [https://docs.github.com/en/actions/managing-workflow-runs/skipping-workflow-runs Skipping workflow runs - GitHub Docs]。&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=TPS&amp;diff=469</id>
		<title>TPS</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=TPS&amp;diff=469"/>
		<updated>2025-07-15T14:21:44Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​根目錄新增 appendix.tex&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;TPS（Task Preparation System）是一套可以方便產生題目測試資料以及題本的工具，關於 TPS 可以參考以下的 GitHub Repo：&lt;br /&gt;
* TPS Example：https://github.com/TNFSH-Programming-Contest/TPS-example&lt;br /&gt;
* IOI 2017 TPS：https://github.com/ioi-2017/tps&lt;br /&gt;
&lt;br /&gt;
{{Memo|本頁面主要使用 TNFSH-Programming-Contest/cms-environment-testing-problem&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem&amp;lt;/ref&amp;gt; 的 pB&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/tree/main/pB&amp;lt;/ref&amp;gt; 作為範本。|}}&lt;br /&gt;
&lt;br /&gt;
[[File:Icon tools.svg|20px]] 以下有此標誌的說明需要 CMS 系統管理員操作，出題者可忽略此說明。&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
== 資料夾結構 ==&lt;br /&gt;
=== 根目錄 ===&lt;br /&gt;
==== .github/workflows ====&lt;br /&gt;
GitHub 自動化流程設定檔。&lt;br /&gt;
&lt;br /&gt;
==== pX ====&lt;br /&gt;
pA、pB 等{{slink||題目資料夾}}。&lt;br /&gt;
&lt;br /&gt;
==== .problems.json ====&lt;br /&gt;
記錄{{slink||題目資料夾}}列表，供 GitHub Actions {{slink||自動建置}}使用，通常不應手動修改。&lt;br /&gt;
&lt;br /&gt;
==== Makefile ====&lt;br /&gt;
[[File:Icon tools.svg|20px]] 匯入 CMS 的指令&lt;br /&gt;
&lt;br /&gt;
==== README.md ====&lt;br /&gt;
主要在 GitHub 頁面上提供常用連結。&lt;br /&gt;
&lt;br /&gt;
==== cover.tex ====&lt;br /&gt;
題本封面。&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/cover.tex&lt;br /&gt;
&lt;br /&gt;
==== appendix.tex ====&lt;br /&gt;
題本附錄。&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/tps-starter/blob/main/appendix.tex&lt;br /&gt;
&lt;br /&gt;
==== template.tex ====&lt;br /&gt;
題本內文模板，通常無需修改。&lt;br /&gt;
&lt;br /&gt;
=== 題目資料夾 ===&lt;br /&gt;
==== attachments ====&lt;br /&gt;
放在此處的所有檔案將會上傳到 CMS 上，供參賽者在題目敘述頁的「附件」，通常僅會在 pA 的附件放置{{slink||合併題本}}。&lt;br /&gt;
&lt;br /&gt;
[[File:Crystal Clear action run.png|20px]] 本目錄內容通常由程式自動產生。&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/tree/main/pA/attachments&lt;br /&gt;
&lt;br /&gt;
==== gen ====&lt;br /&gt;
放置{{slink||產測資}}相關的所有檔案。&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/tree/main/pB/gen&lt;br /&gt;
&lt;br /&gt;
==== gen/manual ====&lt;br /&gt;
{{See also|#手產測資檔}}&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/tree/main/pB/gen/manual&lt;br /&gt;
&lt;br /&gt;
==== gen/data ====&lt;br /&gt;
{{See also|#產測資指令}}&lt;br /&gt;
&lt;br /&gt;
==== scripts ====&lt;br /&gt;
[[File:Crystal Clear action run.png|20px]] 本目錄保存 TPS scripts，不需修改。&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/tree/main/pB/scripts&lt;br /&gt;
&lt;br /&gt;
==== solution ====&lt;br /&gt;
{{See also|#標程}}&lt;br /&gt;
&lt;br /&gt;
==== statement ====&lt;br /&gt;
題本相關檔案，包含原始碼、圖片、{{slink||建置題本}}產生的 PDF。&lt;br /&gt;
&lt;br /&gt;
==== statement/index.md ====&lt;br /&gt;
{{See also|#題目敘述}}&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/statement/index.md&lt;br /&gt;
&lt;br /&gt;
==== tests ====&lt;br /&gt;
{{slink||產測資}}後的檔案會存放於此，參見{{slink||建置測資}}。&lt;br /&gt;
&lt;br /&gt;
[[File:Crystal Clear action run.png|20px]] 本目錄內容由程式自動產生，不應手動編輯。&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/tree/main/pB/tests&lt;br /&gt;
&lt;br /&gt;
==== validator ====&lt;br /&gt;
{{See also|#驗測資程式}}&lt;br /&gt;
&lt;br /&gt;
==== problem.json ====&lt;br /&gt;
題目的相關設定，參見{{slink||競賽名稱|題目名稱|題目英文名稱|題目編號|記憶體限制|時間限制}}。&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/problem.json&lt;br /&gt;
&lt;br /&gt;
==== solutions-check.txt ====&lt;br /&gt;
所有標程的執行結果報告。&lt;br /&gt;
&lt;br /&gt;
[[File:Crystal Clear action run.png|20px]] 本檔案由程式自動產生，不應手動編輯。&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/solutions-check.txt&lt;br /&gt;
&lt;br /&gt;
==== solutions.json ====&lt;br /&gt;
列出所有{{slink||標程}}及其 verdict，標記為 model_solution 的標程會用於{{slink||產測資}}。&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/solutions.json&lt;br /&gt;
&lt;br /&gt;
==== subtasks.json ====&lt;br /&gt;
列出所有的{{slink||子任務}}，及每個子任務所使用的{{slink||驗測資程式}}。&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/subtasks.json&lt;br /&gt;
&lt;br /&gt;
== 準備GitHub Repo ==&lt;br /&gt;
=== 建立GitHub Repo ===&lt;br /&gt;
# 進入 tps-starter。&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/tps-starter&amp;lt;/ref&amp;gt;&lt;br /&gt;
# 點擊 Use this template。&amp;lt;ref&amp;gt;直接連結：https://github.com/TNFSH-Programming-Contest/tps-starter/generate&amp;lt;/ref&amp;gt;&lt;br /&gt;
# 填寫Repo資訊&lt;br /&gt;
#* Repository name 填入競賽英文名，例如「cms-environment-testing-problem」。&lt;br /&gt;
#* Description 填入競賽中文名，例如「CMS環境測試題目通用版」。&lt;br /&gt;
#* [[File:OOjs UI icon alert-destructive.svg|20px]] &#039;&#039;&#039;注意：&#039;&#039;&#039;可見度必須選擇 &#039;&#039;&#039;Private&#039;&#039;&#039;。&lt;br /&gt;
#* 點擊 Create repository from template。&lt;br /&gt;
# 開啟 Github Action 權限&lt;br /&gt;
## 前往 Settings -&amp;gt; Actions -&amp;gt; General&lt;br /&gt;
## 找到 Workflow permissions &lt;br /&gt;
## 選取 Read repository contents and packages permissions 並保存設定&lt;br /&gt;
# （可選）若要將 GitHub Repo 更新傳送到 Discord，請參考 [https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks Intro to Webhooks – Discord] 操作。&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 建立題目資料夾 ===&lt;br /&gt;
此操作在每個競賽通常僅需執行 1 次。&lt;br /&gt;
# 進入由 tps-starter 建立的 GitHub repo。&lt;br /&gt;
# 點擊 Actions。&lt;br /&gt;
# 在 Workflows 段落，點擊 New problem。&amp;lt;ref&amp;gt;參考連結：https://github.com/TNFSH-Programming-Contest/TPS-example/actions/workflows/new-problem.yml&amp;lt;/ref&amp;gt;&lt;br /&gt;
# 點擊 Run workflow，在 How many problems in this contest? 輸入要建立的題目數量。&lt;br /&gt;
#* 如果已有 3 題，要再新增 1 題，直接輸入 4 即可，已建立的目錄會直接被略過。&lt;br /&gt;
# 點擊藍色 Run workflow 按鈕。&lt;br /&gt;
# 等待題目資料夾建立完成，約 1 分鐘。&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 刪除題目資料夾 ===&lt;br /&gt;
雖然這通常不會發生，但如果誤建過多題目等情況，需要刪除題目資料夾時，請務必完成以下所有操作：&lt;br /&gt;
# 刪除{{slink||題目資料夾}}。&lt;br /&gt;
# 從{{slink||.problems.json}}刪除題目編號。&lt;br /&gt;
# 從{{slink||Makefile}}刪除對應題目的匯入指令。&lt;br /&gt;
# 從{{slink||README.md}}刪除對應題目的連結。&lt;br /&gt;
&lt;br /&gt;
== 準備TPS資料 ==&lt;br /&gt;
=== 競賽名稱 ===&lt;br /&gt;
競賽名稱使用於：&lt;br /&gt;
# CMS 參賽介面左上角。&lt;br /&gt;
# 題本封面第一行。&lt;br /&gt;
# 題本內文各頁的左上角。&lt;br /&gt;
&lt;br /&gt;
需寫入於：（範例為「CMS環境測試題目通用版 v1.1」）&lt;br /&gt;
# {{slink||cover.tex}}。&lt;br /&gt;
# 各題目{{slink||problem.json}}的 contest_name 欄位。&lt;br /&gt;
# [[File:Icon tools.svg|20px]] CMS 管理系統的 Description 欄位。&lt;br /&gt;
&lt;br /&gt;
=== 題目名稱 ===&lt;br /&gt;
題目名稱（problem title）使用於：&lt;br /&gt;
# CMS 競賽概況的題目列表。&lt;br /&gt;
# CMS 題目敘述頁面。&lt;br /&gt;
# 題目標題（第一頁第一行）。&lt;br /&gt;
# 該題目各頁右上角。&lt;br /&gt;
&lt;br /&gt;
需寫入於{{slink||problem.json}}的 title 欄位，範例為「Piñata」。&lt;br /&gt;
&lt;br /&gt;
=== 題目英文名稱 ===&lt;br /&gt;
題目英文名稱（problem name）應足以讓所有命題人員識別個別題目即可，通常取自於中文題目名稱，並盡量僅使用一個英文詞，首字大寫，若需要兩個英文詞以上，則使用[[zhwiki:駝峰式大小寫|PascalCase]]。使用於：&lt;br /&gt;
# CMS 競賽概況的題目列表。&lt;br /&gt;
# CMS 題目敘述。&lt;br /&gt;
# CMS 系統內部用來識別題目的 [[zhwiki:主鍵|Primary key]]。&lt;br /&gt;
#* [[File:Icon tools.svg|20px]] 由於同一 CMS 系統上的名稱無法重複，若與其他競賽題目衝突&amp;lt;ref&amp;gt;https://github.com/cms-dev/cms/issues/765&amp;lt;/ref&amp;gt;，建議加上競賽名稱的英文縮寫作為前綴（例如「2022P-」）。&lt;br /&gt;
# 可能作為 GitHub repo 內的題目資料夾名稱。&lt;br /&gt;
&lt;br /&gt;
需寫入於{{slink||problem.json}}的 name 欄位，範例為「Pinata」。&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 題目編號 ===&lt;br /&gt;
題目編號（problem label）為 A, B, C... 的流水號，在決定題目順序後才會確定，使用於：（範例為「B」）&lt;br /&gt;
# CMS 競賽概況的題目列表。&lt;br /&gt;
# 題目標題（第一頁第一行）。&lt;br /&gt;
# 該題目各頁右上角。&lt;br /&gt;
# 該題目各頁頁碼處。&lt;br /&gt;
&lt;br /&gt;
=== 記憶體限制 ===&lt;br /&gt;
需寫入於{{slink||problem.json}}的 memory_limit 欄位，單位為MB，範例為「512」MB。&lt;br /&gt;
&lt;br /&gt;
=== 時間限制 ===&lt;br /&gt;
需寫入於{{slink||problem.json}}的 time_limit 欄位，單位為秒，範例為「1.0」秒。&lt;br /&gt;
&lt;br /&gt;
=== 標程 ===&lt;br /&gt;
AC code（又稱官方解法、標程等）需放置在{{slink||solution}}資料夾內，檔名無限制。同時將該檔名寫入{{slink||solutions.json}}，格式請參照範本，verdict 必須標記為 model_solution，範例檔名為「ac.cpp」&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/tree/main/pB/solution/ac.cpp&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
其他 AC code 亦按照前述方式操作，verdict 必須標記為 correct。&lt;br /&gt;
&lt;br /&gt;
其他類型的錯誤解法亦按照前述方式操作，verdict 標記方式請參考官方說明&amp;lt;ref&amp;gt;https://github.com/ioi-2017/tps/tree/master/docs#solutionsjson&amp;lt;/ref&amp;gt;及 tps script&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/tps-task-templates/blob/93cff7e64a43f57450b26568194432e7b662be38/default/scripts/internal/invoke.py#L18&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 產測資 ===&lt;br /&gt;
TPS 產測資方式與 Codeforces polygon 相同。測資可以使用手產測資檔案，亦可由程式亂數產生，亦可混合兩者。&lt;br /&gt;
&lt;br /&gt;
==== 手產測資檔 ====&lt;br /&gt;
{{Memo|&#039;&#039;&#039;最佳實踐：&#039;&#039;&#039;&lt;br /&gt;
# 僅在 [[:zhwiki:en:Edge case|edge case]] 使用手產測資檔，其他使用產測程式。&lt;br /&gt;
# 範例測資亦可隨機產生，若想要手動指定，亦可使用手產測資檔。&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
手產測資檔應放置在{{slink||gen/manual}}資料夾內，檔名無限制，但建議副檔名為 .in。&lt;br /&gt;
&lt;br /&gt;
本範例有 2 個範例測資，其中一個使用手產測資檔 sample-01.in&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/gen/manual/sample-01.in&amp;lt;/ref&amp;gt;，另一個為隨機測資。&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
==== 產測資程式 ====&lt;br /&gt;
{{Memo|&#039;&#039;&#039;重要：&#039;&#039;&#039;產測資程式必須&lt;br /&gt;
# 使用命令列參數讀入測資組及測資點&amp;lt;ref&amp;gt;[https://en.cppreference.com/w/cpp/language/main_function Main function - cppreference.com]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[https://stackoverflow.com/questions/3024197/what-does-int-argc-char-argv-mean c++ - What does int argc, char *argv&amp;amp;#x5B;&amp;amp;#x5D; mean? - Stack Overflow]&amp;lt;/ref&amp;gt;。&lt;br /&gt;
# 使用[[zhwiki:stdout|標準輸出（stdout）]]，不可直接寫入檔案。&lt;br /&gt;
# 執行一次僅輸出一筆測資。&lt;br /&gt;
# 使用 testlib.h&amp;lt;ref&amp;gt;[https://codeforces.com/blog/entry/18291 Generators with testlib.h]&amp;lt;/ref&amp;gt; 等設定亂數種子的方式，使得每次產生的測資都是相同的。&lt;br /&gt;
|inline:notice}}&lt;br /&gt;
&lt;br /&gt;
產測資程式（generator）應放置在{{slink||gen}}資料夾內，檔名無限制。‎&lt;br /&gt;
&lt;br /&gt;
以下說明請配合範例檔案 gen/gen.cpp&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/gen/gen.cpp&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
使用 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; inline&amp;gt;#include &amp;quot;testlib.h&amp;quot;&amp;lt;/syntaxhighlight&amp;gt; 引入 testlib 函式庫。&lt;br /&gt;
&lt;br /&gt;
main 函數務必寫成 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; inline&amp;gt;int main(int argc, char* argv[])&amp;lt;/syntaxhighlight&amp;gt; 來接收命令列參數。&lt;br /&gt;
&lt;br /&gt;
在 main 函數的第一行使用 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; inline&amp;gt;registerGen(argc, argv, 1);&amp;lt;/syntaxhighlight&amp;gt; 將命令列參數作為亂數種子。&lt;br /&gt;
&lt;br /&gt;
命令列參數會保存在 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; inline&amp;gt;argv&amp;lt;/syntaxhighlight&amp;gt; 內，可將其保存在 string 內： &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; inline&amp;gt;string task = argv[1];&amp;lt;/syntaxhighlight&amp;gt;，或是使用 atoi&amp;lt;ref&amp;gt;https://en.cppreference.com/w/cpp/string/byte/atoi&amp;lt;/ref&amp;gt; 等函數轉換為整數。例如範例中第一個參數用來判斷是第幾組測資，將其轉換為 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; inline&amp;gt;int taskN&amp;lt;/syntaxhighlight&amp;gt; 用於判斷。若為第一筆測資，測資範圍則為 87，若為其他測資，測資範圍則為 10^9。&lt;br /&gt;
&lt;br /&gt;
使用 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; inline&amp;gt;rnd.next(-maxN, maxN)&amp;lt;/syntaxhighlight&amp;gt; 來隨機產生範圍在 -maxN 到 maxN 之間的整數，保存在變數上用於之後輸出。&lt;br /&gt;
&lt;br /&gt;
最後將產生的測資輸出。&lt;br /&gt;
&lt;br /&gt;
{{Memo}} 由於 cout 中執行順序屬未定義行為，請勿將多個 rnd.next 合併在一個 cout 中使用，請分開 cout 或事先保存在變數上。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
cout &amp;lt;&amp;lt; rnd.next (1, n) &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| {{Y}} &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
cout &amp;lt;&amp;lt; rnd.next (1, n) &amp;lt;&amp;lt; &amp;quot; &amp;quot; &amp;lt;&amp;lt; rnd.next (1, n) &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| {{N}} 未定義行為&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
cout &amp;lt;&amp;lt; rnd.next (1, n) &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
cout &amp;lt;&amp;lt; rnd.next (1, n) &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| {{Y}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
int a = rnd.next (1, n), b = rnd.next (1, n);&lt;br /&gt;
cout &amp;lt;&amp;lt; a &amp;lt;&amp;lt; &amp;quot; &amp;quot; &amp;lt;&amp;lt; b &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| {{Y}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
完成產測資程式後，編譯成檔名為 gen 的執行檔（在 Windows 上的 gen.exe），在命令列使用：&lt;br /&gt;
* &amp;lt;code&amp;gt;gen 1&amp;lt;/code&amp;gt; 會隨機產生 4 個 -87 ~ 87 之間的數字（格式參見題目敘述）&lt;br /&gt;
* &amp;lt;code&amp;gt;gen 2&amp;lt;/code&amp;gt; 會隨機產生 4 個 -10^9 ~ 10^9 之間的數字&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
==== 產測資指令 ====&lt;br /&gt;
產測資指令應放置在{{slink||gen/data}}，以下說明請配合範例。‎&lt;br /&gt;
&lt;br /&gt;
每一個測資點以 @subtask 接測資點代號為開頭，這個測資點代號亦會使用在{{slink||子任務}}。&lt;br /&gt;
&lt;br /&gt;
接下來每個測資點可以有多筆測資，每筆測資可以使用手產測資檔，也可使用產測資程式。&lt;br /&gt;
* 使用手產測資檔則為 manual 接續放在{{slink||gen/manual}}資料夾內的測資檔名。&lt;br /&gt;
* 使用產測資程式則為呼叫在命令列中的指令。&lt;br /&gt;
&lt;br /&gt;
範例中第一行為 @subtask samples 為範例測資（samples 為固定名稱不可更改），包含一個手動測資檔 sample-01.in&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/gen/manual/sample-01.in&amp;lt;/ref&amp;gt;。&lt;br /&gt;
{{Memo|&#039;&#039;&#039;重要：&#039;&#039;&#039;將範例測資作為配分為 0 的第一筆測資點，名稱為 samples。|}}&lt;br /&gt;
&lt;br /&gt;
範例中除了範例測資外，共有 2 個測資點，名稱分別為 small 跟 all。兩個測資點都包含 5 筆自動測資。&lt;br /&gt;
&lt;br /&gt;
{{Memo}} 如果呼叫產測程式，但在指令中輸入了兩行一模一樣的內容，那麼這兩個測資就會相同（在設定亂數種子的情況下）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
@subtask small&lt;br /&gt;
gen 1&lt;br /&gt;
gen 1&lt;br /&gt;
gen 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| {{N}} 會產生 3 筆相同測資&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
@subtask small&lt;br /&gt;
gen 1 1&lt;br /&gt;
gen 1 2&lt;br /&gt;
gen 1 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| {{Y}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
@subtask small&lt;br /&gt;
gen 1 pewfw&lt;br /&gt;
gen 1 qrewx&lt;br /&gt;
gen 1 xckxk&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| {{Y}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
因此通常會在後面放上隨機文字作為亂數種子的一部分，亦可透過更換亂數種子來重新產生測資，隨機文字可使用線上工具&amp;lt;ref&amp;gt;例如 [https://www.random.org/strings/ Random String Generator]&amp;lt;/ref&amp;gt;產生。&lt;br /&gt;
&lt;br /&gt;
{{Memo|&#039;&#039;&#039;小技巧：&#039;&#039;&#039;&lt;br /&gt;
# 透過命令列參數直接控制測資範圍，就不需要在產測資程式碼內判斷測資點。&lt;br /&gt;
# 發現不良的測資時，透過修改命令列參數的隨機文字來得到一筆新的隨機測資。&lt;br /&gt;
# 若需要 edge case，使用手產測資檔。&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 驗測資程式 ===&lt;br /&gt;
{{Quote&lt;br /&gt;
| 如果你寫了一個程式解題的問題，並準備好了測試資料，那麼你將可能會遇到一個恐怖的經驗：測試資料是無效的！（即測試資料並未符合題目所規定的限制），例如超過了範圍上限、你的圖實際上沒有連通、或是你的圖不是一棵樹……你很可能會有這種經驗，就算是有經驗的出題者也可能有時會出錯（知名案例像是 ACM ICPC World final 2007）。&lt;br /&gt;
| 翻譯自 [https://codeforces.com/blog/entry/18426 Codeforces 上對於 Validator 的引言]。&lt;br /&gt;
}}&lt;br /&gt;
{{Memo|&#039;&#039;&#039;最佳實踐：&#039;&#039;&#039;撰寫驗測資程式來自動檢查測資範圍及其他條件是否有符合題目的規定，避免測資範圍錯誤。|}}&lt;br /&gt;
&lt;br /&gt;
驗測資程式（validator）應該放置在{{slink||validator}}資料夾內，檔名無限制，並將檔名寫入{{slink||subtasks.json}}的 global_validators 或 subtasks 的 validators。&lt;br /&gt;
&lt;br /&gt;
本範例包含 2 個 validator。&lt;br /&gt;
&lt;br /&gt;
validator.cpp &amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/validator/validator.cpp&amp;lt;/ref&amp;gt; 用來驗證所有測資的範圍是否在 -10^9 ~ 10^9 內，故在{{slink||subtasks.json}}中設為 global_validators。&lt;br /&gt;
&lt;br /&gt;
validator-small.cpp&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/validator/validator-small.cpp&amp;lt;/ref&amp;gt; 僅用來測試第 2 筆測資（index = 1）範圍是否在 -87 ~ 87，在{{slink||subtasks.json}}中設定為測資 small 的 validators。&lt;br /&gt;
&lt;br /&gt;
除了檢查範圍以外，readInt 等函數會回傳其數值，可以保存到變數上作進一步檢查，例如檢查陣列數值皆相異，檢查是否是圖、樹或其他資料結構。&lt;br /&gt;
&lt;br /&gt;
更多資訊請參見 Codeforces 上的說明&amp;lt;ref&amp;gt;[https://codeforces.com/blog/entry/18426 Validators with testlib.h - Codeforces]&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
{{Memo|&#039;&#039;&#039;小提示：&#039;&#039;&#039;驗測資程式僅檢查與解法無關的輸入資料限制，檢查是否 TLE、得部分分數屬於{{slink||標程}}的範圍。|}}&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 子任務 ===&lt;br /&gt;
子任務（subtask）設定於{{slink||subtasks.json}}，包含各子任務的配分、文字描述、{{slink||驗測資程式}}。以下說明請參考範例。&lt;br /&gt;
&lt;br /&gt;
subtasks.json 最外層包含兩個 key：&lt;br /&gt;
* global_validators：在所有測資使用的{{slink||驗測資程式}}。&lt;br /&gt;
* subtasks：包含所有測資點。&lt;br /&gt;
&lt;br /&gt;
subtasks 是一個 key-value pairs，key 與{{slink||產測資指令}}中設定的相同。value 包含以下 key-value pairs：&lt;br /&gt;
* index：流水號，出現在題本內的順序，從 0 開始；samples 必為 0。&lt;br /&gt;
* score：子任務分數；samples 必為 0。&lt;br /&gt;
* text：子任務描述，使用在題目描述內。&lt;br /&gt;
* validators：僅在該子任務使用的{{slink||驗測資程式}}。&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 題目敘述 ===&lt;br /&gt;
題目敘述（statement）的檔案放置於{{slink||statement/index.md}}。使用 [[zhwiki:Markdown|Markdown]] 及 [[zhwiki:XeTeX|XeTeX]] 語法。&lt;br /&gt;
&lt;br /&gt;
結構由上到下依序為：&lt;br /&gt;
# {{slink||題目圖片}}&lt;br /&gt;
# {{slink||題目本文}}&lt;br /&gt;
# 輸入（說明），參見{{slink||輸入及輸出說明}}&lt;br /&gt;
# 輸出（說明），參見{{slink||輸入及輸出說明}}&lt;br /&gt;
# {{slink||輸入限制}}&lt;br /&gt;
# {{slink||子任務}}說明&lt;br /&gt;
# 範例輸入，參見{{slink||範例輸入及輸出}}&lt;br /&gt;
# 範例輸出，參見{{slink||範例輸入及輸出}}&lt;br /&gt;
# {{slink||提示}}&lt;br /&gt;
&lt;br /&gt;
==== 題目圖片 ====&lt;br /&gt;
參見{{slink|題目敘述故事|插圖}}。&lt;br /&gt;
&lt;br /&gt;
==== 題目本文 ====&lt;br /&gt;
參見[[題目敘述故事]]。&lt;br /&gt;
&lt;br /&gt;
==== 輸入及輸出說明 ====&lt;br /&gt;
輸入輸出說明必須明確說明參賽者要遵守的格式。&lt;br /&gt;
&lt;br /&gt;
應該以一行敘述測資中的一行所代表的資料，例如：&lt;br /&gt;
* 第一行有 1 個整數，代表接下來的測資數量。&lt;br /&gt;
* 第一行有 2 個整數，代表初始座標。&lt;br /&gt;
&lt;br /&gt;
如果需要在其他地方（輸入說明的其他行、輸入限制、題目本文等）提到該變數，應賦予變數代號，例如：&lt;br /&gt;
* 第一行有 2 個整數 &amp;lt;math&amp;gt;V, E&amp;lt;/math&amp;gt;，&amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; 代表點的數量，&amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; 代表邊的數量。&lt;br /&gt;
* 第一行有 1 個整數 &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;，代表有 &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; 個人。...（換行）...接下來有 &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; 行，每一行有 1 個整數代表該人的分數。&lt;br /&gt;
{{Memo|&#039;&#039;&#039;注意：&#039;&#039;&#039;同一個變數代號必須在該題目的任何地方皆相同，大小寫也必須相同。|}}&lt;br /&gt;
&lt;br /&gt;
==== 輸入限制 ====&lt;br /&gt;
輸入限制用來告知參賽者測資的數值範圍限制，&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 原始碼 !! 顯示結果&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;markdown&amp;quot;&amp;gt;&lt;br /&gt;
- $1 \leq N \leq 100$&lt;br /&gt;
- $1 \leq M \leq N$&lt;br /&gt;
- $Y - X$ 必定為 2 個倍數&lt;br /&gt;
- 若 $A = 1$，則 $B &amp;gt; 0$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;math&amp;gt;1 \leq N \leq 100&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;1 \leq M \leq N&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;Y - X&amp;lt;/math&amp;gt; 必定為 2 個倍數&lt;br /&gt;
* 若 &amp;lt;math&amp;gt;A = 1&amp;lt;/math&amp;gt;，則 &amp;lt;math&amp;gt;B &amp;gt; 0&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== 子任務說明 ====&lt;br /&gt;
參見{{slink||子任務}}的操作，即會自動顯示於題本中。&lt;br /&gt;
&lt;br /&gt;
==== 範例輸入及輸出 ====&lt;br /&gt;
範例輸入輸出必須與{{slink||產測資}}中設定的範例測資相同。&lt;br /&gt;
&lt;br /&gt;
{{TOJ side box&lt;br /&gt;
|628|B. 國中會考分&lt;br /&gt;
}}&lt;br /&gt;
如果有多筆範例測資，標題應改命名為「範例輸入1、範例輸出1、範例輸入2、範例輸出2」等。&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
{{TOJ side box&lt;br /&gt;
|631|E. 蓋歐格（單個範例附說明）&lt;br /&gt;
|632|F. 最小生成數（多個範例，僅有 1 個範例有說明）&lt;br /&gt;
|637|D. 本田小狼（有圖片的範例說明）&lt;br /&gt;
}}&lt;br /&gt;
如果有需要說明測資，可加上「範例說明」章節，詳細說明範例測資中的意義，亦可附圖說明。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top&amp;quot; |&lt;br /&gt;
* 範例輸入&lt;br /&gt;
* 範例輸出&lt;br /&gt;
| style=&amp;quot;vertical-align: top&amp;quot; |&lt;br /&gt;
* 範例輸入1&lt;br /&gt;
* 範例輸出1&lt;br /&gt;
* 範例輸入2&lt;br /&gt;
* 範例輸出2&lt;br /&gt;
| style=&amp;quot;vertical-align: top&amp;quot; |&lt;br /&gt;
* 範例輸入1&lt;br /&gt;
* 範例輸出1&lt;br /&gt;
* 範例說明1&lt;br /&gt;
* 範例輸入2&lt;br /&gt;
* 範例輸出2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== 提示 ====&lt;br /&gt;
{{TOJ side box&lt;br /&gt;
|335|F. 參訪者們&lt;br /&gt;
|509|C. Puyo&lt;br /&gt;
}}&lt;br /&gt;
如有需要，可以提供一些額外提示。如果內容為解題必須的，不應撰寫於提示，應寫於本文中。&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
{{TOJ side box&lt;br /&gt;
|330|A. Piñata&lt;br /&gt;
|331|B. 尼莫西妮&lt;br /&gt;
|473|A. 好哈快捷鍵&lt;br /&gt;
}}&lt;br /&gt;
亦可撰寫與解題毫無幫助，但與題目故事相關的小知識。&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
== [[zhwiki:組建自動化|自動建置]] ==&lt;br /&gt;
tps-starter&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/tps-starter&amp;lt;/ref&amp;gt; 使用了 GitHub Actions&amp;lt;ref&amp;gt;https://github.com/features/actions&amp;lt;/ref&amp;gt;，對於建置題本和測資提供了簡易介面來執行構建，並包含自動建置、自動化測試等功能。&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 建置題本 ===&lt;br /&gt;
若要將題本編譯成 PDF，按照以下步驟操作：&lt;br /&gt;
# 進入 GitHub repo。&lt;br /&gt;
# 點擊 Actions。&lt;br /&gt;
# 在 Workflows 段落，點擊 Build pdf。&amp;lt;ref&amp;gt;參考連結：https://github.com/TNFSH-Programming-Contest/TPS-example/actions/workflows/build-pdf.yml&amp;lt;/ref&amp;gt;&lt;br /&gt;
# 點擊 Run workflow，在 Problem labels to build 輸入{{slink||題目編號}}，例如「B」。&lt;br /&gt;
# 點擊藍色 Run workflow 按鈕。&lt;br /&gt;
# 等待 PDF 題本建置完成，約 2 分鐘。&lt;br /&gt;
# 可在對應題目的 statement/index.pdf 找到建置的 PDF。&amp;lt;ref&amp;gt;參考連結：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/statement/index.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 自動建置題本 ===&lt;br /&gt;
若題本已定稿，可開啟自動建置功能，之後對於相關檔案的修改都會觸發自動建置。刪除 statement/DISABLE_AUTO_BUILD&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/tps-task-templates/blob/main/default/statement/DISABLE_AUTO_BUILD&amp;lt;/ref&amp;gt; 即可開啟自動建置題本。&lt;br /&gt;
&lt;br /&gt;
修改以下檔案將會觸發自動建置：&lt;br /&gt;
* scripts/statement.sh&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/scripts/statement.sh&amp;lt;/ref&amp;gt;&lt;br /&gt;
* statement/*.jpg&amp;lt;ref&amp;gt;例如：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/statement/cover.jpg&amp;lt;/ref&amp;gt;&lt;br /&gt;
* statement/index.md&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/statement/index.md&amp;lt;/ref&amp;gt;&lt;br /&gt;
* template.tex&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/template.tex&amp;lt;/ref&amp;gt;&lt;br /&gt;
* {{slink||cover.tex}}僅會構建 pA 的題本&lt;br /&gt;
* {{slink||problem.json}}的&lt;br /&gt;
** contest_name：{{slink||競賽名稱}}&lt;br /&gt;
** problem_label：{{slink||題目編號}}&lt;br /&gt;
** name：{{slink||題目英文名稱}}&lt;br /&gt;
** title：{{slink||題目名稱}}&lt;br /&gt;
** memory_limit：{{slink||記憶體限制}}&lt;br /&gt;
** time_limit：{{slink||時間限制}}&lt;br /&gt;
* {{slink||subtasks.json}}的 index、score、text ，參見{{slink||子任務}}。&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 合併題本 ===&lt;br /&gt;
在所有題目的題本皆完成，才進行合併題本，參考{{slink||建置題本}}的操作，在第 4 步驟的 Problem labels to build 輸入「+」，即會合併題本輸出於 pA/attachments/problems.pdf。&amp;lt;ref&amp;gt;參考連結：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pA/attachments/problems.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 建置測資 ===&lt;br /&gt;
若要自動產生測資 input、output、進行標程比較：&lt;br /&gt;
# 進入 GitHub repo。&lt;br /&gt;
# 點擊 Actions。&lt;br /&gt;
# 在 Workflows 段落，點擊 Build tests。&amp;lt;ref&amp;gt;參考連結：https://github.com/TNFSH-Programming-Contest/TPS-example/actions/workflows/build-tests.yml&amp;lt;/ref&amp;gt;&lt;br /&gt;
# 點擊 Run workflow。&lt;br /&gt;
#* 若修改了{{slink||產測資}}程式，在 Problem labels to build inputs 輸入{{slink||題目編號}}，例如「B」，其他欄位不需重複輸入題號。將會自動建置輸入及輸出，若測資有變動，亦會自動測試標程。&lt;br /&gt;
#* 若僅修改了{{slink||標程}}，導致僅有輸出會變動，在 Problem labels to build outputs 輸入{{slink||題目編號}}，其他欄位不需重複輸入題號。將會自動建置輸出，若測資有變動，亦會自動測試標程。&lt;br /&gt;
#* 若僅要重新執行標程測試，在 Problem labels to run solutions 輸入{{slink||題目編號}}。&lt;br /&gt;
# 點擊藍色 Run workflow 按鈕。&lt;br /&gt;
# 等待測資建置完成。&lt;br /&gt;
# 可在對應題目的{{slink||tests}}資料夾找到建置的測資。標程測試則在{{slink||solutions-check.txt}}。&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 自動建置測資 ===&lt;br /&gt;
若產測資程式和標程皆已定稿，可開啟自動建置功能，之後對於相關檔案的修改都會觸發自動建置。刪除 gen/DISABLE_AUTO_BUILD&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/tps-task-templates/blob/main/default/gen/DISABLE_AUTO_BUILD&amp;lt;/ref&amp;gt; 即可開啟自動建置測資。&lt;br /&gt;
&lt;br /&gt;
修改以下檔案將會觸發自動建置 input：&lt;br /&gt;
* {{slink||gen}}內的所有檔案&lt;br /&gt;
&lt;br /&gt;
修改以下檔案將會觸發自動建置 output：&lt;br /&gt;
* 在{{slink||solutions.json}}內設定的 model_solution 對應檔案。請注意：若變更 model_solution 的目標檔案可能不會觸發自動建置。&lt;br /&gt;
&lt;br /&gt;
修改以下檔案將會觸發自動建置 solutions：&lt;br /&gt;
* {{slink||solution}}內的所有檔案&lt;br /&gt;
* {{slink||solutions.json}}&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 跳過自動建置 ===&lt;br /&gt;
若已經啟用自動建置，但想在特定一筆 Commit 跳過自動建置，請在 Commit message 加上 &amp;lt;code&amp;gt;[no ci]&amp;lt;/code&amp;gt;，例如：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;pA Add wa.cpp&lt;br /&gt;
&lt;br /&gt;
Add WA solution without swap&lt;br /&gt;
[no ci]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完整說明參見 [https://docs.github.com/en/actions/managing-workflow-runs/skipping-workflow-runs Skipping workflow runs - GitHub Docs]。&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=TPS&amp;diff=468</id>
		<title>TPS</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=TPS&amp;diff=468"/>
		<updated>2025-03-28T02:56:15Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​建立 Github Repo 加入修改 Github Action 權限教學&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;TPS（Task Preparation System）是一套可以方便產生題目測試資料以及題本的工具，關於 TPS 可以參考以下的 GitHub Repo：&lt;br /&gt;
* TPS Example：https://github.com/TNFSH-Programming-Contest/TPS-example&lt;br /&gt;
* IOI 2017 TPS：https://github.com/ioi-2017/tps&lt;br /&gt;
&lt;br /&gt;
{{Memo|本頁面主要使用 TNFSH-Programming-Contest/cms-environment-testing-problem&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem&amp;lt;/ref&amp;gt; 的 pB&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/tree/main/pB&amp;lt;/ref&amp;gt; 作為範本。|}}&lt;br /&gt;
&lt;br /&gt;
[[File:Icon tools.svg|20px]] 以下有此標誌的說明需要 CMS 系統管理員操作，出題者可忽略此說明。&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
== 資料夾結構 ==&lt;br /&gt;
=== 根目錄 ===&lt;br /&gt;
==== .github/workflows ====&lt;br /&gt;
GitHub 自動化流程設定檔。&lt;br /&gt;
&lt;br /&gt;
==== pX ====&lt;br /&gt;
pA、pB 等{{slink||題目資料夾}}。&lt;br /&gt;
&lt;br /&gt;
==== .problems.json ====&lt;br /&gt;
記錄{{slink||題目資料夾}}列表，供 GitHub Actions {{slink||自動建置}}使用，通常不應手動修改。&lt;br /&gt;
&lt;br /&gt;
==== Makefile ====&lt;br /&gt;
[[File:Icon tools.svg|20px]] 匯入 CMS 的指令&lt;br /&gt;
&lt;br /&gt;
==== README.md ====&lt;br /&gt;
主要在 GitHub 頁面上提供常用連結。&lt;br /&gt;
&lt;br /&gt;
==== cover.tex ====&lt;br /&gt;
題本封面。&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/cover.tex&lt;br /&gt;
&lt;br /&gt;
==== template.tex ====&lt;br /&gt;
題本內文模板，通常無需修改。&lt;br /&gt;
&lt;br /&gt;
=== 題目資料夾 ===&lt;br /&gt;
==== attachments ====&lt;br /&gt;
放在此處的所有檔案將會上傳到 CMS 上，供參賽者在題目敘述頁的「附件」，通常僅會在 pA 的附件放置{{slink||合併題本}}。&lt;br /&gt;
&lt;br /&gt;
[[File:Crystal Clear action run.png|20px]] 本目錄內容通常由程式自動產生。&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/tree/main/pA/attachments&lt;br /&gt;
&lt;br /&gt;
==== gen ====&lt;br /&gt;
放置{{slink||產測資}}相關的所有檔案。&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/tree/main/pB/gen&lt;br /&gt;
&lt;br /&gt;
==== gen/manual ====&lt;br /&gt;
{{See also|#手產測資檔}}&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/tree/main/pB/gen/manual&lt;br /&gt;
&lt;br /&gt;
==== gen/data ====&lt;br /&gt;
{{See also|#產測資指令}}&lt;br /&gt;
&lt;br /&gt;
==== scripts ====&lt;br /&gt;
[[File:Crystal Clear action run.png|20px]] 本目錄保存 TPS scripts，不需修改。&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/tree/main/pB/scripts&lt;br /&gt;
&lt;br /&gt;
==== solution ====&lt;br /&gt;
{{See also|#標程}}&lt;br /&gt;
&lt;br /&gt;
==== statement ====&lt;br /&gt;
題本相關檔案，包含原始碼、圖片、{{slink||建置題本}}產生的 PDF。&lt;br /&gt;
&lt;br /&gt;
==== statement/index.md ====&lt;br /&gt;
{{See also|#題目敘述}}&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/statement/index.md&lt;br /&gt;
&lt;br /&gt;
==== tests ====&lt;br /&gt;
{{slink||產測資}}後的檔案會存放於此，參見{{slink||建置測資}}。&lt;br /&gt;
&lt;br /&gt;
[[File:Crystal Clear action run.png|20px]] 本目錄內容由程式自動產生，不應手動編輯。&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/tree/main/pB/tests&lt;br /&gt;
&lt;br /&gt;
==== validator ====&lt;br /&gt;
{{See also|#驗測資程式}}&lt;br /&gt;
&lt;br /&gt;
==== problem.json ====&lt;br /&gt;
題目的相關設定，參見{{slink||競賽名稱|題目名稱|題目英文名稱|題目編號|記憶體限制|時間限制}}。&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/problem.json&lt;br /&gt;
&lt;br /&gt;
==== solutions-check.txt ====&lt;br /&gt;
所有標程的執行結果報告。&lt;br /&gt;
&lt;br /&gt;
[[File:Crystal Clear action run.png|20px]] 本檔案由程式自動產生，不應手動編輯。&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/solutions-check.txt&lt;br /&gt;
&lt;br /&gt;
==== solutions.json ====&lt;br /&gt;
列出所有{{slink||標程}}及其 verdict，標記為 model_solution 的標程會用於{{slink||產測資}}。&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/solutions.json&lt;br /&gt;
&lt;br /&gt;
==== subtasks.json ====&lt;br /&gt;
列出所有的{{slink||子任務}}，及每個子任務所使用的{{slink||驗測資程式}}。&lt;br /&gt;
&lt;br /&gt;
範例：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/subtasks.json&lt;br /&gt;
&lt;br /&gt;
== 準備GitHub Repo ==&lt;br /&gt;
=== 建立GitHub Repo ===&lt;br /&gt;
# 進入 tps-starter。&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/tps-starter&amp;lt;/ref&amp;gt;&lt;br /&gt;
# 點擊 Use this template。&amp;lt;ref&amp;gt;直接連結：https://github.com/TNFSH-Programming-Contest/tps-starter/generate&amp;lt;/ref&amp;gt;&lt;br /&gt;
# 填寫Repo資訊&lt;br /&gt;
#* Repository name 填入競賽英文名，例如「cms-environment-testing-problem」。&lt;br /&gt;
#* Description 填入競賽中文名，例如「CMS環境測試題目通用版」。&lt;br /&gt;
#* [[File:OOjs UI icon alert-destructive.svg|20px]] &#039;&#039;&#039;注意：&#039;&#039;&#039;可見度必須選擇 &#039;&#039;&#039;Private&#039;&#039;&#039;。&lt;br /&gt;
#* 點擊 Create repository from template。&lt;br /&gt;
# 開啟 Github Action 權限&lt;br /&gt;
## 前往 Settings -&amp;gt; Actions -&amp;gt; General&lt;br /&gt;
## 找到 Workflow permissions &lt;br /&gt;
## 選取 Read repository contents and packages permissions 並保存設定&lt;br /&gt;
# （可選）若要將 GitHub Repo 更新傳送到 Discord，請參考 [https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks Intro to Webhooks – Discord] 操作。&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 建立題目資料夾 ===&lt;br /&gt;
此操作在每個競賽通常僅需執行 1 次。&lt;br /&gt;
# 進入由 tps-starter 建立的 GitHub repo。&lt;br /&gt;
# 點擊 Actions。&lt;br /&gt;
# 在 Workflows 段落，點擊 New problem。&amp;lt;ref&amp;gt;參考連結：https://github.com/TNFSH-Programming-Contest/TPS-example/actions/workflows/new-problem.yml&amp;lt;/ref&amp;gt;&lt;br /&gt;
# 點擊 Run workflow，在 How many problems in this contest? 輸入要建立的題目數量。&lt;br /&gt;
#* 如果已有 3 題，要再新增 1 題，直接輸入 4 即可，已建立的目錄會直接被略過。&lt;br /&gt;
# 點擊藍色 Run workflow 按鈕。&lt;br /&gt;
# 等待題目資料夾建立完成，約 1 分鐘。&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 刪除題目資料夾 ===&lt;br /&gt;
雖然這通常不會發生，但如果誤建過多題目等情況，需要刪除題目資料夾時，請務必完成以下所有操作：&lt;br /&gt;
# 刪除{{slink||題目資料夾}}。&lt;br /&gt;
# 從{{slink||.problems.json}}刪除題目編號。&lt;br /&gt;
# 從{{slink||Makefile}}刪除對應題目的匯入指令。&lt;br /&gt;
# 從{{slink||README.md}}刪除對應題目的連結。&lt;br /&gt;
&lt;br /&gt;
== 準備TPS資料 ==&lt;br /&gt;
=== 競賽名稱 ===&lt;br /&gt;
競賽名稱使用於：&lt;br /&gt;
# CMS 參賽介面左上角。&lt;br /&gt;
# 題本封面第一行。&lt;br /&gt;
# 題本內文各頁的左上角。&lt;br /&gt;
&lt;br /&gt;
需寫入於：（範例為「CMS環境測試題目通用版 v1.1」）&lt;br /&gt;
# {{slink||cover.tex}}。&lt;br /&gt;
# 各題目{{slink||problem.json}}的 contest_name 欄位。&lt;br /&gt;
# [[File:Icon tools.svg|20px]] CMS 管理系統的 Description 欄位。&lt;br /&gt;
&lt;br /&gt;
=== 題目名稱 ===&lt;br /&gt;
題目名稱（problem title）使用於：&lt;br /&gt;
# CMS 競賽概況的題目列表。&lt;br /&gt;
# CMS 題目敘述頁面。&lt;br /&gt;
# 題目標題（第一頁第一行）。&lt;br /&gt;
# 該題目各頁右上角。&lt;br /&gt;
&lt;br /&gt;
需寫入於{{slink||problem.json}}的 title 欄位，範例為「Piñata」。&lt;br /&gt;
&lt;br /&gt;
=== 題目英文名稱 ===&lt;br /&gt;
題目英文名稱（problem name）應足以讓所有命題人員識別個別題目即可，通常取自於中文題目名稱，並盡量僅使用一個英文詞，首字大寫，若需要兩個英文詞以上，則使用[[zhwiki:駝峰式大小寫|PascalCase]]。使用於：&lt;br /&gt;
# CMS 競賽概況的題目列表。&lt;br /&gt;
# CMS 題目敘述。&lt;br /&gt;
# CMS 系統內部用來識別題目的 [[zhwiki:主鍵|Primary key]]。&lt;br /&gt;
#* [[File:Icon tools.svg|20px]] 由於同一 CMS 系統上的名稱無法重複，若與其他競賽題目衝突&amp;lt;ref&amp;gt;https://github.com/cms-dev/cms/issues/765&amp;lt;/ref&amp;gt;，建議加上競賽名稱的英文縮寫作為前綴（例如「2022P-」）。&lt;br /&gt;
# 可能作為 GitHub repo 內的題目資料夾名稱。&lt;br /&gt;
&lt;br /&gt;
需寫入於{{slink||problem.json}}的 name 欄位，範例為「Pinata」。&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 題目編號 ===&lt;br /&gt;
題目編號（problem label）為 A, B, C... 的流水號，在決定題目順序後才會確定，使用於：（範例為「B」）&lt;br /&gt;
# CMS 競賽概況的題目列表。&lt;br /&gt;
# 題目標題（第一頁第一行）。&lt;br /&gt;
# 該題目各頁右上角。&lt;br /&gt;
# 該題目各頁頁碼處。&lt;br /&gt;
&lt;br /&gt;
=== 記憶體限制 ===&lt;br /&gt;
需寫入於{{slink||problem.json}}的 memory_limit 欄位，單位為MB，範例為「512」MB。&lt;br /&gt;
&lt;br /&gt;
=== 時間限制 ===&lt;br /&gt;
需寫入於{{slink||problem.json}}的 time_limit 欄位，單位為秒，範例為「1.0」秒。&lt;br /&gt;
&lt;br /&gt;
=== 標程 ===&lt;br /&gt;
AC code（又稱官方解法、標程等）需放置在{{slink||solution}}資料夾內，檔名無限制。同時將該檔名寫入{{slink||solutions.json}}，格式請參照範本，verdict 必須標記為 model_solution，範例檔名為「ac.cpp」&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/tree/main/pB/solution/ac.cpp&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
其他 AC code 亦按照前述方式操作，verdict 必須標記為 correct。&lt;br /&gt;
&lt;br /&gt;
其他類型的錯誤解法亦按照前述方式操作，verdict 標記方式請參考官方說明&amp;lt;ref&amp;gt;https://github.com/ioi-2017/tps/tree/master/docs#solutionsjson&amp;lt;/ref&amp;gt;及 tps script&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/tps-task-templates/blob/93cff7e64a43f57450b26568194432e7b662be38/default/scripts/internal/invoke.py#L18&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 產測資 ===&lt;br /&gt;
TPS 產測資方式與 Codeforces polygon 相同。測資可以使用手產測資檔案，亦可由程式亂數產生，亦可混合兩者。&lt;br /&gt;
&lt;br /&gt;
==== 手產測資檔 ====&lt;br /&gt;
{{Memo|&#039;&#039;&#039;最佳實踐：&#039;&#039;&#039;&lt;br /&gt;
# 僅在 [[:zhwiki:en:Edge case|edge case]] 使用手產測資檔，其他使用產測程式。&lt;br /&gt;
# 範例測資亦可隨機產生，若想要手動指定，亦可使用手產測資檔。&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
手產測資檔應放置在{{slink||gen/manual}}資料夾內，檔名無限制，但建議副檔名為 .in。&lt;br /&gt;
&lt;br /&gt;
本範例有 2 個範例測資，其中一個使用手產測資檔 sample-01.in&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/gen/manual/sample-01.in&amp;lt;/ref&amp;gt;，另一個為隨機測資。&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
==== 產測資程式 ====&lt;br /&gt;
{{Memo|&#039;&#039;&#039;重要：&#039;&#039;&#039;產測資程式必須&lt;br /&gt;
# 使用命令列參數讀入測資組及測資點&amp;lt;ref&amp;gt;[https://en.cppreference.com/w/cpp/language/main_function Main function - cppreference.com]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[https://stackoverflow.com/questions/3024197/what-does-int-argc-char-argv-mean c++ - What does int argc, char *argv&amp;amp;#x5B;&amp;amp;#x5D; mean? - Stack Overflow]&amp;lt;/ref&amp;gt;。&lt;br /&gt;
# 使用[[zhwiki:stdout|標準輸出（stdout）]]，不可直接寫入檔案。&lt;br /&gt;
# 執行一次僅輸出一筆測資。&lt;br /&gt;
# 使用 testlib.h&amp;lt;ref&amp;gt;[https://codeforces.com/blog/entry/18291 Generators with testlib.h]&amp;lt;/ref&amp;gt; 等設定亂數種子的方式，使得每次產生的測資都是相同的。&lt;br /&gt;
|inline:notice}}&lt;br /&gt;
&lt;br /&gt;
產測資程式（generator）應放置在{{slink||gen}}資料夾內，檔名無限制。‎&lt;br /&gt;
&lt;br /&gt;
以下說明請配合範例檔案 gen/gen.cpp&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/gen/gen.cpp&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
使用 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; inline&amp;gt;#include &amp;quot;testlib.h&amp;quot;&amp;lt;/syntaxhighlight&amp;gt; 引入 testlib 函式庫。&lt;br /&gt;
&lt;br /&gt;
main 函數務必寫成 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; inline&amp;gt;int main(int argc, char* argv[])&amp;lt;/syntaxhighlight&amp;gt; 來接收命令列參數。&lt;br /&gt;
&lt;br /&gt;
在 main 函數的第一行使用 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; inline&amp;gt;registerGen(argc, argv, 1);&amp;lt;/syntaxhighlight&amp;gt; 將命令列參數作為亂數種子。&lt;br /&gt;
&lt;br /&gt;
命令列參數會保存在 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; inline&amp;gt;argv&amp;lt;/syntaxhighlight&amp;gt; 內，可將其保存在 string 內： &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; inline&amp;gt;string task = argv[1];&amp;lt;/syntaxhighlight&amp;gt;，或是使用 atoi&amp;lt;ref&amp;gt;https://en.cppreference.com/w/cpp/string/byte/atoi&amp;lt;/ref&amp;gt; 等函數轉換為整數。例如範例中第一個參數用來判斷是第幾組測資，將其轉換為 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; inline&amp;gt;int taskN&amp;lt;/syntaxhighlight&amp;gt; 用於判斷。若為第一筆測資，測資範圍則為 87，若為其他測資，測資範圍則為 10^9。&lt;br /&gt;
&lt;br /&gt;
使用 &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; inline&amp;gt;rnd.next(-maxN, maxN)&amp;lt;/syntaxhighlight&amp;gt; 來隨機產生範圍在 -maxN 到 maxN 之間的整數，保存在變數上用於之後輸出。&lt;br /&gt;
&lt;br /&gt;
最後將產生的測資輸出。&lt;br /&gt;
&lt;br /&gt;
{{Memo}} 由於 cout 中執行順序屬未定義行為，請勿將多個 rnd.next 合併在一個 cout 中使用，請分開 cout 或事先保存在變數上。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
cout &amp;lt;&amp;lt; rnd.next (1, n) &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| {{Y}} &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
cout &amp;lt;&amp;lt; rnd.next (1, n) &amp;lt;&amp;lt; &amp;quot; &amp;quot; &amp;lt;&amp;lt; rnd.next (1, n) &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| {{N}} 未定義行為&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
cout &amp;lt;&amp;lt; rnd.next (1, n) &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
cout &amp;lt;&amp;lt; rnd.next (1, n) &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| {{Y}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
int a = rnd.next (1, n), b = rnd.next (1, n);&lt;br /&gt;
cout &amp;lt;&amp;lt; a &amp;lt;&amp;lt; &amp;quot; &amp;quot; &amp;lt;&amp;lt; b &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| {{Y}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
完成產測資程式後，編譯成檔名為 gen 的執行檔（在 Windows 上的 gen.exe），在命令列使用：&lt;br /&gt;
* &amp;lt;code&amp;gt;gen 1&amp;lt;/code&amp;gt; 會隨機產生 4 個 -87 ~ 87 之間的數字（格式參見題目敘述）&lt;br /&gt;
* &amp;lt;code&amp;gt;gen 2&amp;lt;/code&amp;gt; 會隨機產生 4 個 -10^9 ~ 10^9 之間的數字&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
==== 產測資指令 ====&lt;br /&gt;
產測資指令應放置在{{slink||gen/data}}，以下說明請配合範例。‎&lt;br /&gt;
&lt;br /&gt;
每一個測資點以 @subtask 接測資點代號為開頭，這個測資點代號亦會使用在{{slink||子任務}}。&lt;br /&gt;
&lt;br /&gt;
接下來每個測資點可以有多筆測資，每筆測資可以使用手產測資檔，也可使用產測資程式。&lt;br /&gt;
* 使用手產測資檔則為 manual 接續放在{{slink||gen/manual}}資料夾內的測資檔名。&lt;br /&gt;
* 使用產測資程式則為呼叫在命令列中的指令。&lt;br /&gt;
&lt;br /&gt;
範例中第一行為 @subtask samples 為範例測資（samples 為固定名稱不可更改），包含一個手動測資檔 sample-01.in&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/gen/manual/sample-01.in&amp;lt;/ref&amp;gt;。&lt;br /&gt;
{{Memo|&#039;&#039;&#039;重要：&#039;&#039;&#039;將範例測資作為配分為 0 的第一筆測資點，名稱為 samples。|}}&lt;br /&gt;
&lt;br /&gt;
範例中除了範例測資外，共有 2 個測資點，名稱分別為 small 跟 all。兩個測資點都包含 5 筆自動測資。&lt;br /&gt;
&lt;br /&gt;
{{Memo}} 如果呼叫產測程式，但在指令中輸入了兩行一模一樣的內容，那麼這兩個測資就會相同（在設定亂數種子的情況下）。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
@subtask small&lt;br /&gt;
gen 1&lt;br /&gt;
gen 1&lt;br /&gt;
gen 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| {{N}} 會產生 3 筆相同測資&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
@subtask small&lt;br /&gt;
gen 1 1&lt;br /&gt;
gen 1 2&lt;br /&gt;
gen 1 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| {{Y}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
@subtask small&lt;br /&gt;
gen 1 pewfw&lt;br /&gt;
gen 1 qrewx&lt;br /&gt;
gen 1 xckxk&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| {{Y}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
因此通常會在後面放上隨機文字作為亂數種子的一部分，亦可透過更換亂數種子來重新產生測資，隨機文字可使用線上工具&amp;lt;ref&amp;gt;例如 [https://www.random.org/strings/ Random String Generator]&amp;lt;/ref&amp;gt;產生。&lt;br /&gt;
&lt;br /&gt;
{{Memo|&#039;&#039;&#039;小技巧：&#039;&#039;&#039;&lt;br /&gt;
# 透過命令列參數直接控制測資範圍，就不需要在產測資程式碼內判斷測資點。&lt;br /&gt;
# 發現不良的測資時，透過修改命令列參數的隨機文字來得到一筆新的隨機測資。&lt;br /&gt;
# 若需要 edge case，使用手產測資檔。&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 驗測資程式 ===&lt;br /&gt;
{{Quote&lt;br /&gt;
| 如果你寫了一個程式解題的問題，並準備好了測試資料，那麼你將可能會遇到一個恐怖的經驗：測試資料是無效的！（即測試資料並未符合題目所規定的限制），例如超過了範圍上限、你的圖實際上沒有連通、或是你的圖不是一棵樹……你很可能會有這種經驗，就算是有經驗的出題者也可能有時會出錯（知名案例像是 ACM ICPC World final 2007）。&lt;br /&gt;
| 翻譯自 [https://codeforces.com/blog/entry/18426 Codeforces 上對於 Validator 的引言]。&lt;br /&gt;
}}&lt;br /&gt;
{{Memo|&#039;&#039;&#039;最佳實踐：&#039;&#039;&#039;撰寫驗測資程式來自動檢查測資範圍及其他條件是否有符合題目的規定，避免測資範圍錯誤。|}}&lt;br /&gt;
&lt;br /&gt;
驗測資程式（validator）應該放置在{{slink||validator}}資料夾內，檔名無限制，並將檔名寫入{{slink||subtasks.json}}的 global_validators 或 subtasks 的 validators。&lt;br /&gt;
&lt;br /&gt;
本範例包含 2 個 validator。&lt;br /&gt;
&lt;br /&gt;
validator.cpp &amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/validator/validator.cpp&amp;lt;/ref&amp;gt; 用來驗證所有測資的範圍是否在 -10^9 ~ 10^9 內，故在{{slink||subtasks.json}}中設為 global_validators。&lt;br /&gt;
&lt;br /&gt;
validator-small.cpp&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/validator/validator-small.cpp&amp;lt;/ref&amp;gt; 僅用來測試第 2 筆測資（index = 1）範圍是否在 -87 ~ 87，在{{slink||subtasks.json}}中設定為測資 small 的 validators。&lt;br /&gt;
&lt;br /&gt;
除了檢查範圍以外，readInt 等函數會回傳其數值，可以保存到變數上作進一步檢查，例如檢查陣列數值皆相異，檢查是否是圖、樹或其他資料結構。&lt;br /&gt;
&lt;br /&gt;
更多資訊請參見 Codeforces 上的說明&amp;lt;ref&amp;gt;[https://codeforces.com/blog/entry/18426 Validators with testlib.h - Codeforces]&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
{{Memo|&#039;&#039;&#039;小提示：&#039;&#039;&#039;驗測資程式僅檢查與解法無關的輸入資料限制，檢查是否 TLE、得部分分數屬於{{slink||標程}}的範圍。|}}&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 子任務 ===&lt;br /&gt;
子任務（subtask）設定於{{slink||subtasks.json}}，包含各子任務的配分、文字描述、{{slink||驗測資程式}}。以下說明請參考範例。&lt;br /&gt;
&lt;br /&gt;
subtasks.json 最外層包含兩個 key：&lt;br /&gt;
* global_validators：在所有測資使用的{{slink||驗測資程式}}。&lt;br /&gt;
* subtasks：包含所有測資點。&lt;br /&gt;
&lt;br /&gt;
subtasks 是一個 key-value pairs，key 與{{slink||產測資指令}}中設定的相同。value 包含以下 key-value pairs：&lt;br /&gt;
* index：流水號，出現在題本內的順序，從 0 開始；samples 必為 0。&lt;br /&gt;
* score：子任務分數；samples 必為 0。&lt;br /&gt;
* text：子任務描述，使用在題目描述內。&lt;br /&gt;
* validators：僅在該子任務使用的{{slink||驗測資程式}}。&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 題目敘述 ===&lt;br /&gt;
題目敘述（statement）的檔案放置於{{slink||statement/index.md}}。使用 [[zhwiki:Markdown|Markdown]] 及 [[zhwiki:XeTeX|XeTeX]] 語法。&lt;br /&gt;
&lt;br /&gt;
結構由上到下依序為：&lt;br /&gt;
# {{slink||題目圖片}}&lt;br /&gt;
# {{slink||題目本文}}&lt;br /&gt;
# 輸入（說明），參見{{slink||輸入及輸出說明}}&lt;br /&gt;
# 輸出（說明），參見{{slink||輸入及輸出說明}}&lt;br /&gt;
# {{slink||輸入限制}}&lt;br /&gt;
# {{slink||子任務}}說明&lt;br /&gt;
# 範例輸入，參見{{slink||範例輸入及輸出}}&lt;br /&gt;
# 範例輸出，參見{{slink||範例輸入及輸出}}&lt;br /&gt;
# {{slink||提示}}&lt;br /&gt;
&lt;br /&gt;
==== 題目圖片 ====&lt;br /&gt;
參見{{slink|題目敘述故事|插圖}}。&lt;br /&gt;
&lt;br /&gt;
==== 題目本文 ====&lt;br /&gt;
參見[[題目敘述故事]]。&lt;br /&gt;
&lt;br /&gt;
==== 輸入及輸出說明 ====&lt;br /&gt;
輸入輸出說明必須明確說明參賽者要遵守的格式。&lt;br /&gt;
&lt;br /&gt;
應該以一行敘述測資中的一行所代表的資料，例如：&lt;br /&gt;
* 第一行有 1 個整數，代表接下來的測資數量。&lt;br /&gt;
* 第一行有 2 個整數，代表初始座標。&lt;br /&gt;
&lt;br /&gt;
如果需要在其他地方（輸入說明的其他行、輸入限制、題目本文等）提到該變數，應賦予變數代號，例如：&lt;br /&gt;
* 第一行有 2 個整數 &amp;lt;math&amp;gt;V, E&amp;lt;/math&amp;gt;，&amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; 代表點的數量，&amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; 代表邊的數量。&lt;br /&gt;
* 第一行有 1 個整數 &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;，代表有 &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; 個人。...（換行）...接下來有 &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; 行，每一行有 1 個整數代表該人的分數。&lt;br /&gt;
{{Memo|&#039;&#039;&#039;注意：&#039;&#039;&#039;同一個變數代號必須在該題目的任何地方皆相同，大小寫也必須相同。|}}&lt;br /&gt;
&lt;br /&gt;
==== 輸入限制 ====&lt;br /&gt;
輸入限制用來告知參賽者測資的數值範圍限制，&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 原始碼 !! 顯示結果&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;markdown&amp;quot;&amp;gt;&lt;br /&gt;
- $1 \leq N \leq 100$&lt;br /&gt;
- $1 \leq M \leq N$&lt;br /&gt;
- $Y - X$ 必定為 2 個倍數&lt;br /&gt;
- 若 $A = 1$，則 $B &amp;gt; 0$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;math&amp;gt;1 \leq N \leq 100&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;1 \leq M \leq N&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;Y - X&amp;lt;/math&amp;gt; 必定為 2 個倍數&lt;br /&gt;
* 若 &amp;lt;math&amp;gt;A = 1&amp;lt;/math&amp;gt;，則 &amp;lt;math&amp;gt;B &amp;gt; 0&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== 子任務說明 ====&lt;br /&gt;
參見{{slink||子任務}}的操作，即會自動顯示於題本中。&lt;br /&gt;
&lt;br /&gt;
==== 範例輸入及輸出 ====&lt;br /&gt;
範例輸入輸出必須與{{slink||產測資}}中設定的範例測資相同。&lt;br /&gt;
&lt;br /&gt;
{{TOJ side box&lt;br /&gt;
|628|B. 國中會考分&lt;br /&gt;
}}&lt;br /&gt;
如果有多筆範例測資，標題應改命名為「範例輸入1、範例輸出1、範例輸入2、範例輸出2」等。&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
{{TOJ side box&lt;br /&gt;
|631|E. 蓋歐格（單個範例附說明）&lt;br /&gt;
|632|F. 最小生成數（多個範例，僅有 1 個範例有說明）&lt;br /&gt;
|637|D. 本田小狼（有圖片的範例說明）&lt;br /&gt;
}}&lt;br /&gt;
如果有需要說明測資，可加上「範例說明」章節，詳細說明範例測資中的意義，亦可附圖說明。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top&amp;quot; |&lt;br /&gt;
* 範例輸入&lt;br /&gt;
* 範例輸出&lt;br /&gt;
| style=&amp;quot;vertical-align: top&amp;quot; |&lt;br /&gt;
* 範例輸入1&lt;br /&gt;
* 範例輸出1&lt;br /&gt;
* 範例輸入2&lt;br /&gt;
* 範例輸出2&lt;br /&gt;
| style=&amp;quot;vertical-align: top&amp;quot; |&lt;br /&gt;
* 範例輸入1&lt;br /&gt;
* 範例輸出1&lt;br /&gt;
* 範例說明1&lt;br /&gt;
* 範例輸入2&lt;br /&gt;
* 範例輸出2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== 提示 ====&lt;br /&gt;
{{TOJ side box&lt;br /&gt;
|335|F. 參訪者們&lt;br /&gt;
|509|C. Puyo&lt;br /&gt;
}}&lt;br /&gt;
如有需要，可以提供一些額外提示。如果內容為解題必須的，不應撰寫於提示，應寫於本文中。&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
{{TOJ side box&lt;br /&gt;
|330|A. Piñata&lt;br /&gt;
|331|B. 尼莫西妮&lt;br /&gt;
|473|A. 好哈快捷鍵&lt;br /&gt;
}}&lt;br /&gt;
亦可撰寫與解題毫無幫助，但與題目故事相關的小知識。&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
== [[zhwiki:組建自動化|自動建置]] ==&lt;br /&gt;
tps-starter&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/tps-starter&amp;lt;/ref&amp;gt; 使用了 GitHub Actions&amp;lt;ref&amp;gt;https://github.com/features/actions&amp;lt;/ref&amp;gt;，對於建置題本和測資提供了簡易介面來執行構建，並包含自動建置、自動化測試等功能。&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 建置題本 ===&lt;br /&gt;
若要將題本編譯成 PDF，按照以下步驟操作：&lt;br /&gt;
# 進入 GitHub repo。&lt;br /&gt;
# 點擊 Actions。&lt;br /&gt;
# 在 Workflows 段落，點擊 Build pdf。&amp;lt;ref&amp;gt;參考連結：https://github.com/TNFSH-Programming-Contest/TPS-example/actions/workflows/build-pdf.yml&amp;lt;/ref&amp;gt;&lt;br /&gt;
# 點擊 Run workflow，在 Problem labels to build 輸入{{slink||題目編號}}，例如「B」。&lt;br /&gt;
# 點擊藍色 Run workflow 按鈕。&lt;br /&gt;
# 等待 PDF 題本建置完成，約 2 分鐘。&lt;br /&gt;
# 可在對應題目的 statement/index.pdf 找到建置的 PDF。&amp;lt;ref&amp;gt;參考連結：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/statement/index.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 自動建置題本 ===&lt;br /&gt;
若題本已定稿，可開啟自動建置功能，之後對於相關檔案的修改都會觸發自動建置。刪除 statement/DISABLE_AUTO_BUILD&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/tps-task-templates/blob/main/default/statement/DISABLE_AUTO_BUILD&amp;lt;/ref&amp;gt; 即可開啟自動建置題本。&lt;br /&gt;
&lt;br /&gt;
修改以下檔案將會觸發自動建置：&lt;br /&gt;
* scripts/statement.sh&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/scripts/statement.sh&amp;lt;/ref&amp;gt;&lt;br /&gt;
* statement/*.jpg&amp;lt;ref&amp;gt;例如：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/statement/cover.jpg&amp;lt;/ref&amp;gt;&lt;br /&gt;
* statement/index.md&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pB/statement/index.md&amp;lt;/ref&amp;gt;&lt;br /&gt;
* template.tex&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/template.tex&amp;lt;/ref&amp;gt;&lt;br /&gt;
* {{slink||cover.tex}}僅會構建 pA 的題本&lt;br /&gt;
* {{slink||problem.json}}的&lt;br /&gt;
** contest_name：{{slink||競賽名稱}}&lt;br /&gt;
** problem_label：{{slink||題目編號}}&lt;br /&gt;
** name：{{slink||題目英文名稱}}&lt;br /&gt;
** title：{{slink||題目名稱}}&lt;br /&gt;
** memory_limit：{{slink||記憶體限制}}&lt;br /&gt;
** time_limit：{{slink||時間限制}}&lt;br /&gt;
* {{slink||subtasks.json}}的 index、score、text ，參見{{slink||子任務}}。&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 合併題本 ===&lt;br /&gt;
在所有題目的題本皆完成，才進行合併題本，參考{{slink||建置題本}}的操作，在第 4 步驟的 Problem labels to build 輸入「+」，即會合併題本輸出於 pA/attachments/problems.pdf。&amp;lt;ref&amp;gt;參考連結：https://github.com/TNFSH-Programming-Contest/cms-environment-testing-problem/blob/main/pA/attachments/problems.pdf&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 建置測資 ===&lt;br /&gt;
若要自動產生測資 input、output、進行標程比較：&lt;br /&gt;
# 進入 GitHub repo。&lt;br /&gt;
# 點擊 Actions。&lt;br /&gt;
# 在 Workflows 段落，點擊 Build tests。&amp;lt;ref&amp;gt;參考連結：https://github.com/TNFSH-Programming-Contest/TPS-example/actions/workflows/build-tests.yml&amp;lt;/ref&amp;gt;&lt;br /&gt;
# 點擊 Run workflow。&lt;br /&gt;
#* 若修改了{{slink||產測資}}程式，在 Problem labels to build inputs 輸入{{slink||題目編號}}，例如「B」，其他欄位不需重複輸入題號。將會自動建置輸入及輸出，若測資有變動，亦會自動測試標程。&lt;br /&gt;
#* 若僅修改了{{slink||標程}}，導致僅有輸出會變動，在 Problem labels to build outputs 輸入{{slink||題目編號}}，其他欄位不需重複輸入題號。將會自動建置輸出，若測資有變動，亦會自動測試標程。&lt;br /&gt;
#* 若僅要重新執行標程測試，在 Problem labels to run solutions 輸入{{slink||題目編號}}。&lt;br /&gt;
# 點擊藍色 Run workflow 按鈕。&lt;br /&gt;
# 等待測資建置完成。&lt;br /&gt;
# 可在對應題目的{{slink||tests}}資料夾找到建置的測資。標程測試則在{{slink||solutions-check.txt}}。&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 自動建置測資 ===&lt;br /&gt;
若產測資程式和標程皆已定稿，可開啟自動建置功能，之後對於相關檔案的修改都會觸發自動建置。刪除 gen/DISABLE_AUTO_BUILD&amp;lt;ref&amp;gt;https://github.com/TNFSH-Programming-Contest/tps-task-templates/blob/main/default/gen/DISABLE_AUTO_BUILD&amp;lt;/ref&amp;gt; 即可開啟自動建置測資。&lt;br /&gt;
&lt;br /&gt;
修改以下檔案將會觸發自動建置 input：&lt;br /&gt;
* {{slink||gen}}內的所有檔案&lt;br /&gt;
&lt;br /&gt;
修改以下檔案將會觸發自動建置 output：&lt;br /&gt;
* 在{{slink||solutions.json}}內設定的 model_solution 對應檔案。請注意：若變更 model_solution 的目標檔案可能不會觸發自動建置。&lt;br /&gt;
&lt;br /&gt;
修改以下檔案將會觸發自動建置 solutions：&lt;br /&gt;
* {{slink||solution}}內的所有檔案&lt;br /&gt;
* {{slink||solutions.json}}&lt;br /&gt;
&lt;br /&gt;
{{reflist-talk}}&lt;br /&gt;
&lt;br /&gt;
=== 跳過自動建置 ===&lt;br /&gt;
若已經啟用自動建置，但想在特定一筆 Commit 跳過自動建置，請在 Commit message 加上 &amp;lt;code&amp;gt;[no ci]&amp;lt;/code&amp;gt;，例如：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;pA Add wa.cpp&lt;br /&gt;
&lt;br /&gt;
Add WA solution without swap&lt;br /&gt;
[no ci]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
完整說明參見 [https://docs.github.com/en/actions/managing-workflow-runs/skipping-workflow-runs Skipping workflow runs - GitHub Docs]。&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=TOJ&amp;diff=467</id>
		<title>TOJ</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=TOJ&amp;diff=467"/>
		<updated>2025-02-02T08:33:12Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​python checker 應指定 shebang&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:TOJ]]&lt;br /&gt;
&lt;br /&gt;
https://toj.tfcis.org/oj/&lt;br /&gt;
&lt;br /&gt;
* 社團練習用的Online Judge&lt;br /&gt;
* 由[[T13]]的[[吳哲宇]]([[pzread]])開發&lt;br /&gt;
* [[T19]]的[[lys0829]]於2017年將judge更新&lt;br /&gt;
* [[T24]]的[[tobiichi3227]]與[[ccccchhhheeenng]]於2022年將後端Server的軟硬體更新&lt;br /&gt;
&lt;br /&gt;
== 出題 ==&lt;br /&gt;
以下內容均為 Problem Package 的形式，TOJ 已經支援用 UI 新增題目了&lt;br /&gt;
=== 一般題目 ===&lt;br /&gt;
limit欄位的 default 一定要存在，其餘可以填寫 TOJ 支援的編譯器 (gcc, g++, clang, clang++, python3, rust, java)&lt;br /&gt;
&lt;br /&gt;
記憶體限制的單位是 KB&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;python3&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 2500,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 524288,&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
check欄位可以填 &amp;quot;diff&amp;quot;, &amp;quot;diff-strict&amp;quot;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! 解釋&lt;br /&gt;
|-&lt;br /&gt;
| diff || 寬鬆比對&lt;br /&gt;
|-&lt;br /&gt;
| diff-strict || 嚴格比對&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;is_makefile&amp;quot;: false,&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;diff&amp;quot;,&lt;br /&gt;
    &amp;quot;test&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;data&amp;quot;: [&lt;br /&gt;
                1, 2, 3, 4, 5, &amp;quot;hard-1&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;weight&amp;quot;: 100&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
data的部份是測資檔案名稱&lt;br /&gt;
需將檔案放到 /res/testdata 下面&lt;br /&gt;
&lt;br /&gt;
輸入輸出檔都需要 (.in, .out)&lt;br /&gt;
&lt;br /&gt;
=== Makefile題目 (編譯互動題) ===&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;is_makefile&amp;quot;: true,&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;diff&amp;quot;,&lt;br /&gt;
    &amp;quot;test&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;data&amp;quot;: [&lt;br /&gt;
                1, 2, 3, 4, 5&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;weight&amp;quot;: 100&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 res/make 新增 Makefile 與 要編譯的檔案&lt;br /&gt;
;/res/make/Makefile&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
default:&lt;br /&gt;
    g++ main.cpp stub.cpp -o $(OUT)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
stub.cpp 可以自己換成其他要一起編譯的檔案，編譯選項可以自行修改&lt;br /&gt;
&lt;br /&gt;
=== CMS/Testlib Checker ===&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;cms&amp;quot;,&lt;br /&gt;
    &amp;quot;test&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;data&amp;quot;: [&lt;br /&gt;
                1, 2, 3, 4, 5&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;weight&amp;quot;: 100&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/check.cpp&lt;br /&gt;
會傳入三個參數，分別為測資輸入，測資輸出，答案輸入&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
int main(int argc, char** argv) {&lt;br /&gt;
    std::ifstream test_in(argv[1]);&lt;br /&gt;
    std::ifstream test_out(argv[2]);&lt;br /&gt;
    std::ifstream ans_in(argv[3]);&lt;br /&gt;
&lt;br /&gt;
    // C&lt;br /&gt;
    FILE* test_in_ptr = fopen(argv[1], &amp;quot;r&amp;quot;);&lt;br /&gt;
    FILE* test_out_ptr = fopen(argv[2], &amp;quot;r&amp;quot;);&lt;br /&gt;
    FILE* ans_in_ptr = fopen(argv[3], &amp;quot;r&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    fclose(test_in_ptr);&lt;br /&gt;
    fclose(test_out_ptr);&lt;br /&gt;
    fclose(ans_in_ptr);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/check.py&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/python3&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
test_in = open(sys.argv[1])&lt;br /&gt;
test_out = open(sys.argv[2])&lt;br /&gt;
ans_in = open(sys.argv[3])&lt;br /&gt;
&lt;br /&gt;
test_in.close()&lt;br /&gt;
test_out.close()&lt;br /&gt;
ans_in.close()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Verdict Message (Checker Message) ====&lt;br /&gt;
對標準錯誤 (STDERR) 輸出 verdict message&lt;br /&gt;
&lt;br /&gt;
C/C++&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
std::cerr &amp;lt;&amp;lt; &amp;quot;checker message&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;cstdio&amp;gt;&lt;br /&gt;
fprintf(stderr, &amp;quot;checker message&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
print(&amp;quot;checker message&amp;quot;, sys.stderr)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Special Score &amp;amp; Status ====&lt;br /&gt;
對標準輸出 (STDOUT) 輸出 Special Score &amp;amp; Status，輸出標準如下&lt;br /&gt;
ScoreType;Score;Status&lt;br /&gt;
&lt;br /&gt;
===== Score =====&lt;br /&gt;
ScoreType 可以是 NONE, CMS, CF&lt;br /&gt;
&lt;br /&gt;
NONE 代表 Judge 不會理會 Score 的值&lt;br /&gt;
&lt;br /&gt;
CMS 代表 Judge 會將 該題子任務分數乘上 Score (與 CMS 的 GroupMin 相同)，且 Score 範圍應該從 0.0 到 1.0，大於 1.0 將設定為 1.0，小於 0.0 將設定為 0.0&lt;br /&gt;
&lt;br /&gt;
CF 代表 Judge 會直接用 Score 覆蓋該子任務分數&lt;br /&gt;
&lt;br /&gt;
===== Status =====&lt;br /&gt;
Status 可以是 TOJ 所支援的所有 Status (AC, PC, WA, RE, RESIG, TLE, MLE, OLE, CE, CLE, SJE, IE)&lt;br /&gt;
&lt;br /&gt;
如果 Status 為空 或 不在支援的 Status 中將按照 Checker 回傳值決定狀態 (return 0 為 AC，其餘為 WA)&lt;br /&gt;
&lt;br /&gt;
下面列出幾個作為參考&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! STDOUT String !! Score !! Status&lt;br /&gt;
|-&lt;br /&gt;
| CMS;0.5;PC || 子任務分數 * 0.5 || PC (Partial Correct)&lt;br /&gt;
|-&lt;br /&gt;
| CF;32.27;AC || 32.27 || AC (Answer Correct)&lt;br /&gt;
|-&lt;br /&gt;
| NONE;3131;WA || 子任務分數 || WA (Wrong Answer)&lt;br /&gt;
|-&lt;br /&gt;
| CF;32.27; || 32.27 || 按照 Return 值決定是 AC 或 WA&lt;br /&gt;
|-&lt;br /&gt;
| ;; || 子任務分數 || 按照 Return 值決定是 AC 或 WA&lt;br /&gt;
|-&lt;br /&gt;
| (沒有任何輸出) || 子任務分數 || 按照 Return 值決定是 AC 或 WA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;/res/check/build&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
g++ -o check check.cpp&lt;br /&gt;
# python&lt;br /&gt;
# cp check.py check&lt;br /&gt;
# chmod +x check&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== IORedir ===&lt;br /&gt;
將[https://github.com/TFcis/Problem-setting-tools/blob/master/TOJ-problem-example/conf.json conf.json]中的 check 從 diff 改成 ioredir，及設定 metadata 如下。&lt;br /&gt;
如果 Checker 的 STDOUT 或 STDERR 沒有被佔用且有輸出內容，那 Verdict Message (Checker Message) 將會為該內容 (如果兩個同時都有，STDERR 優先於 STDOUT&lt;br /&gt;
&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;ioredir&amp;quot;,&lt;br /&gt;
    &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
        &amp;quot;redir_test&amp;quot;: {&lt;br /&gt;
            &amp;quot;pipeout&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;testin&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;testout&amp;quot;: -1,&lt;br /&gt;
            &amp;quot;pipein&amp;quot;: -1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;redir_check&amp;quot;: {&lt;br /&gt;
            &amp;quot;ansin&amp;quot;: 2,&lt;br /&gt;
            &amp;quot;testin&amp;quot;: -1,&lt;br /&gt;
            &amp;quot;pipeout&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;pipein&amp;quot;: -1&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果要用 ioredir 實現互動題， metadata 可以這樣寫&lt;br /&gt;
&lt;br /&gt;
從 STDERR 讀入測資，對 STDOUT 輸出測資&lt;br /&gt;
從 STDIN 讀入答案&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;redir_test&amp;quot;: {&lt;br /&gt;
        &amp;quot;pipein&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;testin&amp;quot;: -1,&lt;br /&gt;
        &amp;quot;pipeout&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;testout&amp;quot;: -1&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;redir_check&amp;quot;: {&lt;br /&gt;
        &amp;quot;ansin&amp;quot;: -1,&lt;br /&gt;
        &amp;quot;pipein&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;testin&amp;quot;: 2,&lt;br /&gt;
        &amp;quot;pipeout&amp;quot;: 0&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/check.cpp&lt;br /&gt;
分別從答案及輸出分別讀入long double。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
long double Answer, Output;&lt;br /&gt;
FILE *ansf = fdopen(2, &amp;quot;r&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
scanf(&amp;quot;%Lf&amp;quot;, &amp;amp;Output);&lt;br /&gt;
fscanf(ansf, &amp;quot;%Lf&amp;quot;, &amp;amp;Answer);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/build&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
g++ -o check check.cpp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
參考 https://hackmd.io/s/BkHdt57I&lt;br /&gt;
&lt;br /&gt;
=== Polygon to TOJ ===&lt;br /&gt;
請參考 [https://github.com/TFcis/cf2toj cf2toj]&lt;br /&gt;
&lt;br /&gt;
=== TPS to TOJ ===&lt;br /&gt;
請參考 [https://github.com/TFcis/tps2toj tps2toj]&lt;br /&gt;
&lt;br /&gt;
=== CMS to TOJ ===&lt;br /&gt;
請參考 [https://github.com/TFcis/cms2toj cms2toj]&lt;br /&gt;
&lt;br /&gt;
=== 小技巧 ===&lt;br /&gt;
==== OI制 (APCS) ====&lt;br /&gt;
可以只上傳範例測資，並把該子任務分數設定為 0&lt;br /&gt;
&lt;br /&gt;
==== Dependency Tree ====&lt;br /&gt;
假設 subtask2 依賴 subtask1&lt;br /&gt;
可以把 subtask1 的所有測資檔名複製到 subtask2 的測資中&lt;br /&gt;
&lt;br /&gt;
==== 偷偷支援目前 TOJ 無法使用的語言 ====&lt;br /&gt;
前提：Judge 本身需要支援&lt;br /&gt;
可以使用 Makefile 類型的題目&lt;br /&gt;
並在編譯時使用其他語言&lt;br /&gt;
&lt;br /&gt;
==== 負分 ====&lt;br /&gt;
TOJ其實可以設定子任務分數為負數，但可能會有很多問題&lt;br /&gt;
Scoreboard 應該選擇 IOI2013&lt;br /&gt;
&lt;br /&gt;
== 參見 ==&lt;br /&gt;
* [[TOJ API]]：API文檔&lt;br /&gt;
* [https://github.com/pzread/judge judge原始碼]&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=TOJ&amp;diff=466</id>
		<title>TOJ</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=TOJ&amp;diff=466"/>
		<updated>2024-10-22T08:08:57Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​小技巧-負分&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:TOJ]]&lt;br /&gt;
&lt;br /&gt;
https://toj.tfcis.org/oj/&lt;br /&gt;
&lt;br /&gt;
* 社團練習用的Online Judge&lt;br /&gt;
* 由[[T13]]的[[吳哲宇]]([[pzread]])開發&lt;br /&gt;
* [[T19]]的[[lys0829]]於2017年將judge更新&lt;br /&gt;
* [[T24]]的[[tobiichi3227]]與[[ccccchhhheeenng]]於2022年將後端Server的軟硬體更新&lt;br /&gt;
&lt;br /&gt;
== 出題 ==&lt;br /&gt;
以下內容均為 Problem Package 的形式，TOJ 已經支援用 UI 新增題目了&lt;br /&gt;
=== 一般題目 ===&lt;br /&gt;
limit欄位的 default 一定要存在，其餘可以填寫 TOJ 支援的編譯器 (gcc, g++, clang, clang++, python3, rust, java)&lt;br /&gt;
&lt;br /&gt;
記憶體限制的單位是 KB&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;python3&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 2500,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 524288,&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
check欄位可以填 &amp;quot;diff&amp;quot;, &amp;quot;diff-strict&amp;quot;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! 解釋&lt;br /&gt;
|-&lt;br /&gt;
| diff || 寬鬆比對&lt;br /&gt;
|-&lt;br /&gt;
| diff-strict || 嚴格比對&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;is_makefile&amp;quot;: false,&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;diff&amp;quot;,&lt;br /&gt;
    &amp;quot;test&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;data&amp;quot;: [&lt;br /&gt;
                1, 2, 3, 4, 5, &amp;quot;hard-1&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;weight&amp;quot;: 100&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
data的部份是測資檔案名稱&lt;br /&gt;
需將檔案放到 /res/testdata 下面&lt;br /&gt;
&lt;br /&gt;
輸入輸出檔都需要 (.in, .out)&lt;br /&gt;
&lt;br /&gt;
=== Makefile題目 (編譯互動題) ===&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;is_makefile&amp;quot;: true,&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;diff&amp;quot;,&lt;br /&gt;
    &amp;quot;test&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;data&amp;quot;: [&lt;br /&gt;
                1, 2, 3, 4, 5&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;weight&amp;quot;: 100&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 res/make 新增 Makefile 與 要編譯的檔案&lt;br /&gt;
;/res/make/Makefile&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
default:&lt;br /&gt;
    g++ main.cpp stub.cpp -o $(OUT)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
stub.cpp 可以自己換成其他要一起編譯的檔案，編譯選項可以自行修改&lt;br /&gt;
&lt;br /&gt;
=== CMS/Testlib Checker ===&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;cms&amp;quot;,&lt;br /&gt;
    &amp;quot;test&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;data&amp;quot;: [&lt;br /&gt;
                1, 2, 3, 4, 5&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;weight&amp;quot;: 100&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/check.cpp&lt;br /&gt;
會傳入三個參數，分別為測資輸入，測資輸出，答案輸入&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
int main(int argc, char** argv) {&lt;br /&gt;
    std::ifstream test_in(argv[1]);&lt;br /&gt;
    std::ifstream test_out(argv[2]);&lt;br /&gt;
    std::ifstream ans_in(argv[3]);&lt;br /&gt;
&lt;br /&gt;
    // C&lt;br /&gt;
    FILE* test_in_ptr = fopen(argv[1], &amp;quot;r&amp;quot;);&lt;br /&gt;
    FILE* test_out_ptr = fopen(argv[2], &amp;quot;r&amp;quot;);&lt;br /&gt;
    FILE* ans_in_ptr = fopen(argv[3], &amp;quot;r&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    fclose(test_in_ptr);&lt;br /&gt;
    fclose(test_out_ptr);&lt;br /&gt;
    fclose(ans_in_ptr);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/check.py&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
test_in = open(sys.argv[1])&lt;br /&gt;
test_out = open(sys.argv[2])&lt;br /&gt;
ans_in = open(sys.argv[3])&lt;br /&gt;
&lt;br /&gt;
test_in.close()&lt;br /&gt;
test_out.close()&lt;br /&gt;
ans_in.close()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Verdict Message (Checker Message) ====&lt;br /&gt;
對標準錯誤 (STDERR) 輸出 verdict message&lt;br /&gt;
&lt;br /&gt;
C/C++&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
std::cerr &amp;lt;&amp;lt; &amp;quot;checker message&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;cstdio&amp;gt;&lt;br /&gt;
fprintf(stderr, &amp;quot;checker message&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
print(&amp;quot;checker message&amp;quot;, sys.stderr)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Special Score &amp;amp; Status ====&lt;br /&gt;
對標準輸出 (STDOUT) 輸出 Special Score &amp;amp; Status，輸出標準如下&lt;br /&gt;
ScoreType;Score;Status&lt;br /&gt;
&lt;br /&gt;
===== Score =====&lt;br /&gt;
ScoreType 可以是 NONE, CMS, CF&lt;br /&gt;
&lt;br /&gt;
NONE 代表 Judge 不會理會 Score 的值&lt;br /&gt;
&lt;br /&gt;
CMS 代表 Judge 會將 該題子任務分數乘上 Score (與 CMS 的 GroupMin 相同)，且 Score 範圍應該從 0.0 到 1.0，大於 1.0 將設定為 1.0，小於 0.0 將設定為 0.0&lt;br /&gt;
&lt;br /&gt;
CF 代表 Judge 會直接用 Score 覆蓋該子任務分數&lt;br /&gt;
&lt;br /&gt;
===== Status =====&lt;br /&gt;
Status 可以是 TOJ 所支援的所有 Status (AC, PC, WA, RE, RESIG, TLE, MLE, OLE, CE, CLE, SJE, IE)&lt;br /&gt;
&lt;br /&gt;
如果 Status 為空 或 不在支援的 Status 中將按照 Checker 回傳值決定狀態 (return 0 為 AC，其餘為 WA)&lt;br /&gt;
&lt;br /&gt;
下面列出幾個作為參考&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! STDOUT String !! Score !! Status&lt;br /&gt;
|-&lt;br /&gt;
| CMS;0.5;PC || 子任務分數 * 0.5 || PC (Partial Correct)&lt;br /&gt;
|-&lt;br /&gt;
| CF;32.27;AC || 32.27 || AC (Answer Correct)&lt;br /&gt;
|-&lt;br /&gt;
| NONE;3131;WA || 子任務分數 || WA (Wrong Answer)&lt;br /&gt;
|-&lt;br /&gt;
| CF;32.27; || 32.27 || 按照 Return 值決定是 AC 或 WA&lt;br /&gt;
|-&lt;br /&gt;
| ;; || 子任務分數 || 按照 Return 值決定是 AC 或 WA&lt;br /&gt;
|-&lt;br /&gt;
| (沒有任何輸出) || 子任務分數 || 按照 Return 值決定是 AC 或 WA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;/res/check/build&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
g++ -o check check.cpp&lt;br /&gt;
# python&lt;br /&gt;
# cp check.py check&lt;br /&gt;
# chmod +x check&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== IORedir ===&lt;br /&gt;
將[https://github.com/TFcis/Problem-setting-tools/blob/master/TOJ-problem-example/conf.json conf.json]中的 check 從 diff 改成 ioredir，及設定 metadata 如下。&lt;br /&gt;
如果 Checker 的 STDOUT 或 STDERR 沒有被佔用且有輸出內容，那 Verdict Message (Checker Message) 將會為該內容 (如果兩個同時都有，STDERR 優先於 STDOUT&lt;br /&gt;
&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;ioredir&amp;quot;,&lt;br /&gt;
    &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
        &amp;quot;redir_test&amp;quot;: {&lt;br /&gt;
            &amp;quot;pipeout&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;testin&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;testout&amp;quot;: -1,&lt;br /&gt;
            &amp;quot;pipein&amp;quot;: -1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;redir_check&amp;quot;: {&lt;br /&gt;
            &amp;quot;ansin&amp;quot;: 2,&lt;br /&gt;
            &amp;quot;testin&amp;quot;: -1,&lt;br /&gt;
            &amp;quot;pipeout&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;pipein&amp;quot;: -1&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果要用 ioredir 實現互動題， metadata 可以這樣寫&lt;br /&gt;
&lt;br /&gt;
從 STDERR 讀入測資，對 STDOUT 輸出測資&lt;br /&gt;
從 STDIN 讀入答案&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;redir_test&amp;quot;: {&lt;br /&gt;
        &amp;quot;pipein&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;testin&amp;quot;: -1,&lt;br /&gt;
        &amp;quot;pipeout&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;testout&amp;quot;: -1&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;redir_check&amp;quot;: {&lt;br /&gt;
        &amp;quot;ansin&amp;quot;: -1,&lt;br /&gt;
        &amp;quot;pipein&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;testin&amp;quot;: 2,&lt;br /&gt;
        &amp;quot;pipeout&amp;quot;: 0&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/check.cpp&lt;br /&gt;
分別從答案及輸出分別讀入long double。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
long double Answer, Output;&lt;br /&gt;
FILE *ansf = fdopen(2, &amp;quot;r&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
scanf(&amp;quot;%Lf&amp;quot;, &amp;amp;Output);&lt;br /&gt;
fscanf(ansf, &amp;quot;%Lf&amp;quot;, &amp;amp;Answer);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/build&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
g++ -o check check.cpp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
參考 https://hackmd.io/s/BkHdt57I&lt;br /&gt;
&lt;br /&gt;
=== Polygon to TOJ ===&lt;br /&gt;
請參考 [https://github.com/TFcis/cf2toj cf2toj]&lt;br /&gt;
&lt;br /&gt;
=== TPS to TOJ ===&lt;br /&gt;
請參考 [https://github.com/TFcis/tps2toj tps2toj]&lt;br /&gt;
&lt;br /&gt;
=== CMS to TOJ ===&lt;br /&gt;
請參考 [https://github.com/TFcis/cms2toj cms2toj]&lt;br /&gt;
&lt;br /&gt;
=== 小技巧 ===&lt;br /&gt;
==== OI制 (APCS) ====&lt;br /&gt;
可以只上傳範例測資，並把該子任務分數設定為 0&lt;br /&gt;
&lt;br /&gt;
==== Dependency Tree ====&lt;br /&gt;
假設 subtask2 依賴 subtask1&lt;br /&gt;
可以把 subtask1 的所有測資檔名複製到 subtask2 的測資中&lt;br /&gt;
&lt;br /&gt;
==== 偷偷支援目前 TOJ 無法使用的語言 ====&lt;br /&gt;
前提：Judge 本身需要支援&lt;br /&gt;
可以使用 Makefile 類型的題目&lt;br /&gt;
並在編譯時使用其他語言&lt;br /&gt;
&lt;br /&gt;
==== 負分 ====&lt;br /&gt;
TOJ其實可以設定子任務分數為負數，但可能會有很多問題&lt;br /&gt;
Scoreboard 應該選擇 IOI2013&lt;br /&gt;
&lt;br /&gt;
== 參見 ==&lt;br /&gt;
* [[TOJ API]]：API文檔&lt;br /&gt;
* [https://github.com/pzread/judge judge原始碼]&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=TOJ&amp;diff=465</id>
		<title>TOJ</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=TOJ&amp;diff=465"/>
		<updated>2024-10-22T07:35:53Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​新增一些小技巧&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:TOJ]]&lt;br /&gt;
&lt;br /&gt;
https://toj.tfcis.org/oj/&lt;br /&gt;
&lt;br /&gt;
* 社團練習用的Online Judge&lt;br /&gt;
* 由[[T13]]的[[吳哲宇]]([[pzread]])開發&lt;br /&gt;
* [[T19]]的[[lys0829]]於2017年將judge更新&lt;br /&gt;
* [[T24]]的[[tobiichi3227]]與[[ccccchhhheeenng]]於2022年將後端Server的軟硬體更新&lt;br /&gt;
&lt;br /&gt;
== 出題 ==&lt;br /&gt;
以下內容均為 Problem Package 的形式，TOJ 已經支援用 UI 新增題目了&lt;br /&gt;
=== 一般題目 ===&lt;br /&gt;
limit欄位的 default 一定要存在，其餘可以填寫 TOJ 支援的編譯器 (gcc, g++, clang, clang++, python3, rust, java)&lt;br /&gt;
&lt;br /&gt;
記憶體限制的單位是 KB&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;python3&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 2500,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 524288,&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
check欄位可以填 &amp;quot;diff&amp;quot;, &amp;quot;diff-strict&amp;quot;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! 解釋&lt;br /&gt;
|-&lt;br /&gt;
| diff || 寬鬆比對&lt;br /&gt;
|-&lt;br /&gt;
| diff-strict || 嚴格比對&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;is_makefile&amp;quot;: false,&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;diff&amp;quot;,&lt;br /&gt;
    &amp;quot;test&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;data&amp;quot;: [&lt;br /&gt;
                1, 2, 3, 4, 5, &amp;quot;hard-1&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;weight&amp;quot;: 100&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
data的部份是測資檔案名稱&lt;br /&gt;
需將檔案放到 /res/testdata 下面&lt;br /&gt;
&lt;br /&gt;
輸入輸出檔都需要 (.in, .out)&lt;br /&gt;
&lt;br /&gt;
=== Makefile題目 (編譯互動題) ===&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;is_makefile&amp;quot;: true,&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;diff&amp;quot;,&lt;br /&gt;
    &amp;quot;test&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;data&amp;quot;: [&lt;br /&gt;
                1, 2, 3, 4, 5&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;weight&amp;quot;: 100&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 res/make 新增 Makefile 與 要編譯的檔案&lt;br /&gt;
;/res/make/Makefile&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
default:&lt;br /&gt;
    g++ main.cpp stub.cpp -o $(OUT)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
stub.cpp 可以自己換成其他要一起編譯的檔案，編譯選項可以自行修改&lt;br /&gt;
&lt;br /&gt;
=== CMS/Testlib Checker ===&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;cms&amp;quot;,&lt;br /&gt;
    &amp;quot;test&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;data&amp;quot;: [&lt;br /&gt;
                1, 2, 3, 4, 5&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;weight&amp;quot;: 100&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/check.cpp&lt;br /&gt;
會傳入三個參數，分別為測資輸入，測資輸出，答案輸入&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
int main(int argc, char** argv) {&lt;br /&gt;
    std::ifstream test_in(argv[1]);&lt;br /&gt;
    std::ifstream test_out(argv[2]);&lt;br /&gt;
    std::ifstream ans_in(argv[3]);&lt;br /&gt;
&lt;br /&gt;
    // C&lt;br /&gt;
    FILE* test_in_ptr = fopen(argv[1], &amp;quot;r&amp;quot;);&lt;br /&gt;
    FILE* test_out_ptr = fopen(argv[2], &amp;quot;r&amp;quot;);&lt;br /&gt;
    FILE* ans_in_ptr = fopen(argv[3], &amp;quot;r&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    fclose(test_in_ptr);&lt;br /&gt;
    fclose(test_out_ptr);&lt;br /&gt;
    fclose(ans_in_ptr);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/check.py&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
test_in = open(sys.argv[1])&lt;br /&gt;
test_out = open(sys.argv[2])&lt;br /&gt;
ans_in = open(sys.argv[3])&lt;br /&gt;
&lt;br /&gt;
test_in.close()&lt;br /&gt;
test_out.close()&lt;br /&gt;
ans_in.close()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Verdict Message (Checker Message) ====&lt;br /&gt;
對標準錯誤 (STDERR) 輸出 verdict message&lt;br /&gt;
&lt;br /&gt;
C/C++&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
std::cerr &amp;lt;&amp;lt; &amp;quot;checker message&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;cstdio&amp;gt;&lt;br /&gt;
fprintf(stderr, &amp;quot;checker message&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
print(&amp;quot;checker message&amp;quot;, sys.stderr)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Special Score &amp;amp; Status ====&lt;br /&gt;
對標準輸出 (STDOUT) 輸出 Special Score &amp;amp; Status，輸出標準如下&lt;br /&gt;
ScoreType;Score;Status&lt;br /&gt;
&lt;br /&gt;
===== Score =====&lt;br /&gt;
ScoreType 可以是 NONE, CMS, CF&lt;br /&gt;
&lt;br /&gt;
NONE 代表 Judge 不會理會 Score 的值&lt;br /&gt;
&lt;br /&gt;
CMS 代表 Judge 會將 該題子任務分數乘上 Score (與 CMS 的 GroupMin 相同)，且 Score 範圍應該從 0.0 到 1.0，大於 1.0 將設定為 1.0，小於 0.0 將設定為 0.0&lt;br /&gt;
&lt;br /&gt;
CF 代表 Judge 會直接用 Score 覆蓋該子任務分數&lt;br /&gt;
&lt;br /&gt;
===== Status =====&lt;br /&gt;
Status 可以是 TOJ 所支援的所有 Status (AC, PC, WA, RE, RESIG, TLE, MLE, OLE, CE, CLE, SJE, IE)&lt;br /&gt;
&lt;br /&gt;
如果 Status 為空 或 不在支援的 Status 中將按照 Checker 回傳值決定狀態 (return 0 為 AC，其餘為 WA)&lt;br /&gt;
&lt;br /&gt;
下面列出幾個作為參考&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! STDOUT String !! Score !! Status&lt;br /&gt;
|-&lt;br /&gt;
| CMS;0.5;PC || 子任務分數 * 0.5 || PC (Partial Correct)&lt;br /&gt;
|-&lt;br /&gt;
| CF;32.27;AC || 32.27 || AC (Answer Correct)&lt;br /&gt;
|-&lt;br /&gt;
| NONE;3131;WA || 子任務分數 || WA (Wrong Answer)&lt;br /&gt;
|-&lt;br /&gt;
| CF;32.27; || 32.27 || 按照 Return 值決定是 AC 或 WA&lt;br /&gt;
|-&lt;br /&gt;
| ;; || 子任務分數 || 按照 Return 值決定是 AC 或 WA&lt;br /&gt;
|-&lt;br /&gt;
| (沒有任何輸出) || 子任務分數 || 按照 Return 值決定是 AC 或 WA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;/res/check/build&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
g++ -o check check.cpp&lt;br /&gt;
# python&lt;br /&gt;
# cp check.py check&lt;br /&gt;
# chmod +x check&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== IORedir ===&lt;br /&gt;
將[https://github.com/TFcis/Problem-setting-tools/blob/master/TOJ-problem-example/conf.json conf.json]中的 check 從 diff 改成 ioredir，及設定 metadata 如下。&lt;br /&gt;
如果 Checker 的 STDOUT 或 STDERR 沒有被佔用且有輸出內容，那 Verdict Message (Checker Message) 將會為該內容 (如果兩個同時都有，STDERR 優先於 STDOUT&lt;br /&gt;
&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;ioredir&amp;quot;,&lt;br /&gt;
    &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
        &amp;quot;redir_test&amp;quot;: {&lt;br /&gt;
            &amp;quot;pipeout&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;testin&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;testout&amp;quot;: -1,&lt;br /&gt;
            &amp;quot;pipein&amp;quot;: -1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;redir_check&amp;quot;: {&lt;br /&gt;
            &amp;quot;ansin&amp;quot;: 2,&lt;br /&gt;
            &amp;quot;testin&amp;quot;: -1,&lt;br /&gt;
            &amp;quot;pipeout&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;pipein&amp;quot;: -1&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果要用 ioredir 實現互動題， metadata 可以這樣寫&lt;br /&gt;
&lt;br /&gt;
從 STDERR 讀入測資，對 STDOUT 輸出測資&lt;br /&gt;
從 STDIN 讀入答案&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;redir_test&amp;quot;: {&lt;br /&gt;
        &amp;quot;pipein&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;testin&amp;quot;: -1,&lt;br /&gt;
        &amp;quot;pipeout&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;testout&amp;quot;: -1&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;redir_check&amp;quot;: {&lt;br /&gt;
        &amp;quot;ansin&amp;quot;: -1,&lt;br /&gt;
        &amp;quot;pipein&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;testin&amp;quot;: 2,&lt;br /&gt;
        &amp;quot;pipeout&amp;quot;: 0&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/check.cpp&lt;br /&gt;
分別從答案及輸出分別讀入long double。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
long double Answer, Output;&lt;br /&gt;
FILE *ansf = fdopen(2, &amp;quot;r&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
scanf(&amp;quot;%Lf&amp;quot;, &amp;amp;Output);&lt;br /&gt;
fscanf(ansf, &amp;quot;%Lf&amp;quot;, &amp;amp;Answer);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/build&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
g++ -o check check.cpp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
參考 https://hackmd.io/s/BkHdt57I&lt;br /&gt;
&lt;br /&gt;
=== Polygon to TOJ ===&lt;br /&gt;
請參考 [https://github.com/TFcis/cf2toj cf2toj]&lt;br /&gt;
&lt;br /&gt;
=== TPS to TOJ ===&lt;br /&gt;
請參考 [https://github.com/TFcis/tps2toj tps2toj]&lt;br /&gt;
&lt;br /&gt;
=== CMS to TOJ ===&lt;br /&gt;
請參考 [https://github.com/TFcis/cms2toj cms2toj]&lt;br /&gt;
&lt;br /&gt;
=== 小技巧 ===&lt;br /&gt;
==== OI制 (APCS) ====&lt;br /&gt;
可以只上傳範例測資，並把該子任務分數設定為 0&lt;br /&gt;
&lt;br /&gt;
==== Dependency Tree ====&lt;br /&gt;
假設 subtask2 依賴 subtask1&lt;br /&gt;
可以把 subtask1 的所有測資檔名複製到 subtask2 的測資中&lt;br /&gt;
&lt;br /&gt;
==== 偷偷支援目前 TOJ 無法使用的語言 ====&lt;br /&gt;
前提：Judge 本身需要支援&lt;br /&gt;
可以使用 Makefile 類型的題目&lt;br /&gt;
並在編譯時使用其他語言&lt;br /&gt;
&lt;br /&gt;
== 參見 ==&lt;br /&gt;
* [[TOJ API]]：API文檔&lt;br /&gt;
* [https://github.com/pzread/judge judge原始碼]&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=TOJ&amp;diff=464</id>
		<title>TOJ</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=TOJ&amp;diff=464"/>
		<updated>2024-10-15T07:38:46Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​新增測資&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:TOJ]]&lt;br /&gt;
&lt;br /&gt;
https://toj.tfcis.org/oj/&lt;br /&gt;
&lt;br /&gt;
* 社團練習用的Online Judge&lt;br /&gt;
* 由[[T13]]的[[吳哲宇]]([[pzread]])開發&lt;br /&gt;
* [[T19]]的[[lys0829]]於2017年將judge更新&lt;br /&gt;
* [[T24]]的[[tobiichi3227]]與[[ccccchhhheeenng]]於2022年將後端Server的軟硬體更新&lt;br /&gt;
&lt;br /&gt;
== 出題 ==&lt;br /&gt;
以下內容均為 Problem Package 的形式，TOJ 已經支援用 UI 新增題目了&lt;br /&gt;
=== 一般題目 ===&lt;br /&gt;
limit欄位的 default 一定要存在，其餘可以填寫 TOJ 支援的編譯器 (gcc, g++, clang, clang++, python3, rust, java)&lt;br /&gt;
&lt;br /&gt;
記憶體限制的單位是 KB&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;python3&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 2500,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 524288,&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
check欄位可以填 &amp;quot;diff&amp;quot;, &amp;quot;diff-strict&amp;quot;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! 解釋&lt;br /&gt;
|-&lt;br /&gt;
| diff || 寬鬆比對&lt;br /&gt;
|-&lt;br /&gt;
| diff-strict || 嚴格比對&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;is_makefile&amp;quot;: false,&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;diff&amp;quot;,&lt;br /&gt;
    &amp;quot;test&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;data&amp;quot;: [&lt;br /&gt;
                1, 2, 3, 4, 5, &amp;quot;hard-1&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;weight&amp;quot;: 100&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
data的部份是測資檔案名稱&lt;br /&gt;
需將檔案放到 /res/testdata 下面&lt;br /&gt;
&lt;br /&gt;
輸入輸出檔都需要 (.in, .out)&lt;br /&gt;
&lt;br /&gt;
=== Makefile題目 (編譯互動題) ===&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;is_makefile&amp;quot;: true,&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;diff&amp;quot;,&lt;br /&gt;
    &amp;quot;test&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;data&amp;quot;: [&lt;br /&gt;
                1, 2, 3, 4, 5&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;weight&amp;quot;: 100&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 res/make 新增 Makefile 與 要編譯的檔案&lt;br /&gt;
;/res/make/Makefile&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
default:&lt;br /&gt;
    g++ main.cpp stub.cpp -o $(OUT)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
stub.cpp 可以自己換成其他要一起編譯的檔案，編譯選項可以自行修改&lt;br /&gt;
&lt;br /&gt;
=== CMS/Testlib Checker ===&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;cms&amp;quot;,&lt;br /&gt;
    &amp;quot;test&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;data&amp;quot;: [&lt;br /&gt;
                1, 2, 3, 4, 5&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;weight&amp;quot;: 100&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/check.cpp&lt;br /&gt;
會傳入三個參數，分別為測資輸入，測資輸出，答案輸入&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
int main(int argc, char** argv) {&lt;br /&gt;
    std::ifstream test_in(argv[1]);&lt;br /&gt;
    std::ifstream test_out(argv[2]);&lt;br /&gt;
    std::ifstream ans_in(argv[3]);&lt;br /&gt;
&lt;br /&gt;
    // C&lt;br /&gt;
    FILE* test_in_ptr = fopen(argv[1], &amp;quot;r&amp;quot;);&lt;br /&gt;
    FILE* test_out_ptr = fopen(argv[2], &amp;quot;r&amp;quot;);&lt;br /&gt;
    FILE* ans_in_ptr = fopen(argv[3], &amp;quot;r&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    fclose(test_in_ptr);&lt;br /&gt;
    fclose(test_out_ptr);&lt;br /&gt;
    fclose(ans_in_ptr);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/check.py&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
test_in = open(sys.argv[1])&lt;br /&gt;
test_out = open(sys.argv[2])&lt;br /&gt;
ans_in = open(sys.argv[3])&lt;br /&gt;
&lt;br /&gt;
test_in.close()&lt;br /&gt;
test_out.close()&lt;br /&gt;
ans_in.close()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Verdict Message (Checker Message) ====&lt;br /&gt;
對標準錯誤 (STDERR) 輸出 verdict message&lt;br /&gt;
&lt;br /&gt;
C/C++&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
std::cerr &amp;lt;&amp;lt; &amp;quot;checker message&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;cstdio&amp;gt;&lt;br /&gt;
fprintf(stderr, &amp;quot;checker message&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
print(&amp;quot;checker message&amp;quot;, sys.stderr)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Special Score &amp;amp; Status ====&lt;br /&gt;
對標準輸出 (STDOUT) 輸出 Special Score &amp;amp; Status，輸出標準如下&lt;br /&gt;
ScoreType;Score;Status&lt;br /&gt;
&lt;br /&gt;
===== Score =====&lt;br /&gt;
ScoreType 可以是 NONE, CMS, CF&lt;br /&gt;
&lt;br /&gt;
NONE 代表 Judge 不會理會 Score 的值&lt;br /&gt;
&lt;br /&gt;
CMS 代表 Judge 會將 該題子任務分數乘上 Score (與 CMS 的 GroupMin 相同)，且 Score 範圍應該從 0.0 到 1.0，大於 1.0 將設定為 1.0，小於 0.0 將設定為 0.0&lt;br /&gt;
&lt;br /&gt;
CF 代表 Judge 會直接用 Score 覆蓋該子任務分數&lt;br /&gt;
&lt;br /&gt;
===== Status =====&lt;br /&gt;
Status 可以是 TOJ 所支援的所有 Status (AC, PC, WA, RE, RESIG, TLE, MLE, OLE, CE, CLE, SJE, IE)&lt;br /&gt;
&lt;br /&gt;
如果 Status 為空 或 不在支援的 Status 中將按照 Checker 回傳值決定狀態 (return 0 為 AC，其餘為 WA)&lt;br /&gt;
&lt;br /&gt;
下面列出幾個作為參考&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! STDOUT String !! Score !! Status&lt;br /&gt;
|-&lt;br /&gt;
| CMS;0.5;PC || 子任務分數 * 0.5 || PC (Partial Correct)&lt;br /&gt;
|-&lt;br /&gt;
| CF;32.27;AC || 32.27 || AC (Answer Correct)&lt;br /&gt;
|-&lt;br /&gt;
| NONE;3131;WA || 子任務分數 || WA (Wrong Answer)&lt;br /&gt;
|-&lt;br /&gt;
| CF;32.27; || 32.27 || 按照 Return 值決定是 AC 或 WA&lt;br /&gt;
|-&lt;br /&gt;
| ;; || 子任務分數 || 按照 Return 值決定是 AC 或 WA&lt;br /&gt;
|-&lt;br /&gt;
| (沒有任何輸出) || 子任務分數 || 按照 Return 值決定是 AC 或 WA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;/res/check/build&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
g++ -o check check.cpp&lt;br /&gt;
# python&lt;br /&gt;
# cp check.py check&lt;br /&gt;
# chmod +x check&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== IORedir ===&lt;br /&gt;
將[https://github.com/TFcis/Problem-setting-tools/blob/master/TOJ-problem-example/conf.json conf.json]中的 check 從 diff 改成 ioredir，及設定 metadata 如下。&lt;br /&gt;
如果 Checker 的 STDOUT 或 STDERR 沒有被佔用且有輸出內容，那 Verdict Message (Checker Message) 將會為該內容 (如果兩個同時都有，STDERR 優先於 STDOUT&lt;br /&gt;
&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;ioredir&amp;quot;,&lt;br /&gt;
    &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
        &amp;quot;redir_test&amp;quot;: {&lt;br /&gt;
            &amp;quot;pipeout&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;testin&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;testout&amp;quot;: -1,&lt;br /&gt;
            &amp;quot;pipein&amp;quot;: -1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;redir_check&amp;quot;: {&lt;br /&gt;
            &amp;quot;ansin&amp;quot;: 2,&lt;br /&gt;
            &amp;quot;testin&amp;quot;: -1,&lt;br /&gt;
            &amp;quot;pipeout&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;pipein&amp;quot;: -1&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果要用 ioredir 實現互動題， metadata 可以這樣寫&lt;br /&gt;
&lt;br /&gt;
從 STDERR 讀入測資，對 STDOUT 輸出測資&lt;br /&gt;
從 STDIN 讀入答案&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;redir_test&amp;quot;: {&lt;br /&gt;
        &amp;quot;pipein&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;testin&amp;quot;: -1,&lt;br /&gt;
        &amp;quot;pipeout&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;testout&amp;quot;: -1&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;redir_check&amp;quot;: {&lt;br /&gt;
        &amp;quot;ansin&amp;quot;: -1,&lt;br /&gt;
        &amp;quot;pipein&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;testin&amp;quot;: 2,&lt;br /&gt;
        &amp;quot;pipeout&amp;quot;: 0&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/check.cpp&lt;br /&gt;
分別從答案及輸出分別讀入long double。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
long double Answer, Output;&lt;br /&gt;
FILE *ansf = fdopen(2, &amp;quot;r&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
scanf(&amp;quot;%Lf&amp;quot;, &amp;amp;Output);&lt;br /&gt;
fscanf(ansf, &amp;quot;%Lf&amp;quot;, &amp;amp;Answer);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/build&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
g++ -o check check.cpp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
參考 https://hackmd.io/s/BkHdt57I&lt;br /&gt;
&lt;br /&gt;
=== Polygon to TOJ ===&lt;br /&gt;
請參考 [https://github.com/TFcis/cf2toj cf2toj]&lt;br /&gt;
&lt;br /&gt;
=== TPS to TOJ ===&lt;br /&gt;
請參考 [https://github.com/TFcis/tps2toj tps2toj]&lt;br /&gt;
&lt;br /&gt;
=== CMS to TOJ ===&lt;br /&gt;
請參考 [https://github.com/TFcis/cms2toj cms2toj]&lt;br /&gt;
&lt;br /&gt;
== 參見 ==&lt;br /&gt;
* [[TOJ API]]：API文檔&lt;br /&gt;
* [https://github.com/pzread/judge judge原始碼]&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=TOJ&amp;diff=463</id>
		<title>TOJ</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=TOJ&amp;diff=463"/>
		<updated>2024-10-15T07:18:16Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​加上 makefile部份&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:TOJ]]&lt;br /&gt;
&lt;br /&gt;
https://toj.tfcis.org/oj/&lt;br /&gt;
&lt;br /&gt;
* 社團練習用的Online Judge&lt;br /&gt;
* 由[[T13]]的[[吳哲宇]]([[pzread]])開發&lt;br /&gt;
* [[T19]]的[[lys0829]]於2017年將judge更新&lt;br /&gt;
* [[T24]]的[[tobiichi3227]]與[[ccccchhhheeenng]]於2022年將後端Server的軟硬體更新&lt;br /&gt;
&lt;br /&gt;
== 出題 ==&lt;br /&gt;
以下內容均為 Problem Package 的形式，TOJ 已經支援用 UI 新增題目了&lt;br /&gt;
=== 一般題目 ===&lt;br /&gt;
limit欄位的 default 一定要存在，其餘可以填寫 TOJ 支援的編譯器 (gcc, g++, clang, clang++, python3, rust, java)&lt;br /&gt;
&lt;br /&gt;
記憶體限制的單位是 KB&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;python3&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 2500,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 524288,&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
check欄位可以填 &amp;quot;diff&amp;quot;, &amp;quot;diff-strict&amp;quot;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! 解釋&lt;br /&gt;
|-&lt;br /&gt;
| diff || 寬鬆比對&lt;br /&gt;
|-&lt;br /&gt;
| diff-strict || 嚴格比對&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;is_makefile&amp;quot;: false,&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;diff&amp;quot;,&lt;br /&gt;
    &amp;quot;test&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;data&amp;quot;: [&lt;br /&gt;
                1, 2, 3, 4, 5&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;weight&amp;quot;: 100&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Makefile題目 (編譯互動題) ===&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;is_makefile&amp;quot;: true,&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;diff&amp;quot;,&lt;br /&gt;
    &amp;quot;test&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;data&amp;quot;: [&lt;br /&gt;
                1, 2, 3, 4, 5&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;weight&amp;quot;: 100&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在 res/make 新增 Makefile 與 要編譯的檔案&lt;br /&gt;
;/res/make/Makefile&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
default:&lt;br /&gt;
    g++ main.cpp stub.cpp -o $(OUT)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
stub.cpp 可以自己換成其他要一起編譯的檔案，編譯選項可以自行修改&lt;br /&gt;
&lt;br /&gt;
=== CMS/Testlib Checker ===&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;cms&amp;quot;,&lt;br /&gt;
    &amp;quot;test&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;data&amp;quot;: [&lt;br /&gt;
                1, 2, 3, 4, 5&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;weight&amp;quot;: 100&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/check.cpp&lt;br /&gt;
會傳入三個參數，分別為測資輸入，測資輸出，答案輸入&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
int main(int argc, char** argv) {&lt;br /&gt;
    std::ifstream test_in(argv[1]);&lt;br /&gt;
    std::ifstream test_out(argv[2]);&lt;br /&gt;
    std::ifstream ans_in(argv[3]);&lt;br /&gt;
&lt;br /&gt;
    // C&lt;br /&gt;
    FILE* test_in_ptr = fopen(argv[1], &amp;quot;r&amp;quot;);&lt;br /&gt;
    FILE* test_out_ptr = fopen(argv[2], &amp;quot;r&amp;quot;);&lt;br /&gt;
    FILE* ans_in_ptr = fopen(argv[3], &amp;quot;r&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    fclose(test_in_ptr);&lt;br /&gt;
    fclose(test_out_ptr);&lt;br /&gt;
    fclose(ans_in_ptr);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/check.py&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
test_in = open(sys.argv[1])&lt;br /&gt;
test_out = open(sys.argv[2])&lt;br /&gt;
ans_in = open(sys.argv[3])&lt;br /&gt;
&lt;br /&gt;
test_in.close()&lt;br /&gt;
test_out.close()&lt;br /&gt;
ans_in.close()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Verdict Message (Checker Message) ====&lt;br /&gt;
對標準錯誤 (STDERR) 輸出 verdict message&lt;br /&gt;
&lt;br /&gt;
C/C++&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
std::cerr &amp;lt;&amp;lt; &amp;quot;checker message&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;cstdio&amp;gt;&lt;br /&gt;
fprintf(stderr, &amp;quot;checker message&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
print(&amp;quot;checker message&amp;quot;, sys.stderr)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Special Score &amp;amp; Status ====&lt;br /&gt;
對標準輸出 (STDOUT) 輸出 Special Score &amp;amp; Status，輸出標準如下&lt;br /&gt;
ScoreType;Score;Status&lt;br /&gt;
&lt;br /&gt;
===== Score =====&lt;br /&gt;
ScoreType 可以是 NONE, CMS, CF&lt;br /&gt;
&lt;br /&gt;
NONE 代表 Judge 不會理會 Score 的值&lt;br /&gt;
&lt;br /&gt;
CMS 代表 Judge 會將 該題子任務分數乘上 Score (與 CMS 的 GroupMin 相同)，且 Score 範圍應該從 0.0 到 1.0，大於 1.0 將設定為 1.0，小於 0.0 將設定為 0.0&lt;br /&gt;
&lt;br /&gt;
CF 代表 Judge 會直接用 Score 覆蓋該子任務分數&lt;br /&gt;
&lt;br /&gt;
===== Status =====&lt;br /&gt;
Status 可以是 TOJ 所支援的所有 Status (AC, PC, WA, RE, RESIG, TLE, MLE, OLE, CE, CLE, SJE, IE)&lt;br /&gt;
&lt;br /&gt;
如果 Status 為空 或 不在支援的 Status 中將按照 Checker 回傳值決定狀態 (return 0 為 AC，其餘為 WA)&lt;br /&gt;
&lt;br /&gt;
下面列出幾個作為參考&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! STDOUT String !! Score !! Status&lt;br /&gt;
|-&lt;br /&gt;
| CMS;0.5;PC || 子任務分數 * 0.5 || PC (Partial Correct)&lt;br /&gt;
|-&lt;br /&gt;
| CF;32.27;AC || 32.27 || AC (Answer Correct)&lt;br /&gt;
|-&lt;br /&gt;
| NONE;3131;WA || 子任務分數 || WA (Wrong Answer)&lt;br /&gt;
|-&lt;br /&gt;
| CF;32.27; || 32.27 || 按照 Return 值決定是 AC 或 WA&lt;br /&gt;
|-&lt;br /&gt;
| ;; || 子任務分數 || 按照 Return 值決定是 AC 或 WA&lt;br /&gt;
|-&lt;br /&gt;
| (沒有任何輸出) || 子任務分數 || 按照 Return 值決定是 AC 或 WA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;/res/check/build&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
g++ -o check check.cpp&lt;br /&gt;
# python&lt;br /&gt;
# cp check.py check&lt;br /&gt;
# chmod +x check&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== IORedir ===&lt;br /&gt;
將[https://github.com/TFcis/Problem-setting-tools/blob/master/TOJ-problem-example/conf.json conf.json]中的 check 從 diff 改成 ioredir，及設定 metadata 如下。&lt;br /&gt;
如果 Checker 的 STDOUT 或 STDERR 沒有被佔用且有輸出內容，那 Verdict Message (Checker Message) 將會為該內容 (如果兩個同時都有，STDERR 優先於 STDOUT&lt;br /&gt;
&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;ioredir&amp;quot;,&lt;br /&gt;
    &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
        &amp;quot;redir_test&amp;quot;: {&lt;br /&gt;
            &amp;quot;pipeout&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;testin&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;testout&amp;quot;: -1,&lt;br /&gt;
            &amp;quot;pipein&amp;quot;: -1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;redir_check&amp;quot;: {&lt;br /&gt;
            &amp;quot;ansin&amp;quot;: 2,&lt;br /&gt;
            &amp;quot;testin&amp;quot;: -1,&lt;br /&gt;
            &amp;quot;pipeout&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;pipein&amp;quot;: -1&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果要用 ioredir 實現互動題， metadata 可以這樣寫&lt;br /&gt;
&lt;br /&gt;
從 STDERR 讀入測資，對 STDOUT 輸出測資&lt;br /&gt;
從 STDIN 讀入答案&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;redir_test&amp;quot;: {&lt;br /&gt;
        &amp;quot;pipein&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;testin&amp;quot;: -1,&lt;br /&gt;
        &amp;quot;pipeout&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;testout&amp;quot;: -1&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;redir_check&amp;quot;: {&lt;br /&gt;
        &amp;quot;ansin&amp;quot;: -1,&lt;br /&gt;
        &amp;quot;pipein&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;testin&amp;quot;: 2,&lt;br /&gt;
        &amp;quot;pipeout&amp;quot;: 0&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/check.cpp&lt;br /&gt;
分別從答案及輸出分別讀入long double。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
long double Answer, Output;&lt;br /&gt;
FILE *ansf = fdopen(2, &amp;quot;r&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
scanf(&amp;quot;%Lf&amp;quot;, &amp;amp;Output);&lt;br /&gt;
fscanf(ansf, &amp;quot;%Lf&amp;quot;, &amp;amp;Answer);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/build&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
g++ -o check check.cpp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
參考 https://hackmd.io/s/BkHdt57I&lt;br /&gt;
&lt;br /&gt;
=== Polygon to TOJ ===&lt;br /&gt;
請參考 [https://github.com/TFcis/cf2toj cf2toj]&lt;br /&gt;
&lt;br /&gt;
=== TPS to TOJ ===&lt;br /&gt;
請參考 [https://github.com/TFcis/tps2toj tps2toj]&lt;br /&gt;
&lt;br /&gt;
=== CMS to TOJ ===&lt;br /&gt;
請參考 [https://github.com/TFcis/cms2toj cms2toj]&lt;br /&gt;
&lt;br /&gt;
== 參見 ==&lt;br /&gt;
* [[TOJ API]]：API文檔&lt;br /&gt;
* [https://github.com/pzread/judge judge原始碼]&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=TOJ&amp;diff=462</id>
		<title>TOJ</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=TOJ&amp;diff=462"/>
		<updated>2024-10-15T02:20:56Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:TOJ]]&lt;br /&gt;
&lt;br /&gt;
https://toj.tfcis.org/oj/&lt;br /&gt;
&lt;br /&gt;
* 社團練習用的Online Judge&lt;br /&gt;
* 由[[T13]]的[[吳哲宇]]([[pzread]])開發&lt;br /&gt;
* [[T19]]的[[lys0829]]於2017年將judge更新&lt;br /&gt;
* [[T24]]的[[tobiichi3227]]與[[ccccchhhheeenng]]於2022年將後端Server的軟硬體更新&lt;br /&gt;
&lt;br /&gt;
== 出題 ==&lt;br /&gt;
以下內容均為 Problem Package 的形式，TOJ 已經支援用 UI 新增題目了&lt;br /&gt;
=== 一般題目 ===&lt;br /&gt;
limit欄位的 default 一定要存在，其餘可以填寫 TOJ 支援的編譯器 (gcc, g++, clang, clang++, python3, rust, java)&lt;br /&gt;
&lt;br /&gt;
記憶體限制的單位是 KB&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;python3&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 2500,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 524288,&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
check欄位可以填 &amp;quot;diff&amp;quot;, &amp;quot;diff-strict&amp;quot;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! 解釋&lt;br /&gt;
|-&lt;br /&gt;
| diff || 寬鬆比對&lt;br /&gt;
|-&lt;br /&gt;
| diff-strict || 嚴格比對&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;is_makefile&amp;quot;: false,&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;diff&amp;quot;,&lt;br /&gt;
    &amp;quot;test&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;data&amp;quot;: [&lt;br /&gt;
                1, 2, 3, 4, 5&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;weight&amp;quot;: 100&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Makefile題目 (編譯互動題) ===&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;is_makefile&amp;quot;: true,&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;diff&amp;quot;,&lt;br /&gt;
    &amp;quot;test&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;data&amp;quot;: [&lt;br /&gt;
                1, 2, 3, 4, 5&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;weight&amp;quot;: 100&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CMS/Testlib Checker ===&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;cms&amp;quot;,&lt;br /&gt;
    &amp;quot;test&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;data&amp;quot;: [&lt;br /&gt;
                1, 2, 3, 4, 5&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;weight&amp;quot;: 100&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/check.cpp&lt;br /&gt;
會傳入三個參數，分別為測資輸入，測資輸出，答案輸入&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
int main(int argc, char** argv) {&lt;br /&gt;
    std::ifstream test_in(argv[1]);&lt;br /&gt;
    std::ifstream test_out(argv[2]);&lt;br /&gt;
    std::ifstream ans_in(argv[3]);&lt;br /&gt;
&lt;br /&gt;
    // C&lt;br /&gt;
    FILE* test_in_ptr = fopen(argv[1], &amp;quot;r&amp;quot;);&lt;br /&gt;
    FILE* test_out_ptr = fopen(argv[2], &amp;quot;r&amp;quot;);&lt;br /&gt;
    FILE* ans_in_ptr = fopen(argv[3], &amp;quot;r&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    fclose(test_in_ptr);&lt;br /&gt;
    fclose(test_out_ptr);&lt;br /&gt;
    fclose(ans_in_ptr);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/check.py&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
test_in = open(sys.argv[1])&lt;br /&gt;
test_out = open(sys.argv[2])&lt;br /&gt;
ans_in = open(sys.argv[3])&lt;br /&gt;
&lt;br /&gt;
test_in.close()&lt;br /&gt;
test_out.close()&lt;br /&gt;
ans_in.close()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Verdict Message (Checker Message) ====&lt;br /&gt;
對標準錯誤 (STDERR) 輸出 verdict message&lt;br /&gt;
&lt;br /&gt;
C/C++&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
std::cerr &amp;lt;&amp;lt; &amp;quot;checker message&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;cstdio&amp;gt;&lt;br /&gt;
fprintf(stderr, &amp;quot;checker message&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
print(&amp;quot;checker message&amp;quot;, sys.stderr)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Special Score &amp;amp; Status ====&lt;br /&gt;
對標準輸出 (STDOUT) 輸出 Special Score &amp;amp; Status，輸出標準如下&lt;br /&gt;
ScoreType;Score;Status&lt;br /&gt;
&lt;br /&gt;
===== Score =====&lt;br /&gt;
ScoreType 可以是 NONE, CMS, CF&lt;br /&gt;
&lt;br /&gt;
NONE 代表 Judge 不會理會 Score 的值&lt;br /&gt;
&lt;br /&gt;
CMS 代表 Judge 會將 該題子任務分數乘上 Score (與 CMS 的 GroupMin 相同)，且 Score 範圍應該從 0.0 到 1.0，大於 1.0 將設定為 1.0，小於 0.0 將設定為 0.0&lt;br /&gt;
&lt;br /&gt;
CF 代表 Judge 會直接用 Score 覆蓋該子任務分數&lt;br /&gt;
&lt;br /&gt;
===== Status =====&lt;br /&gt;
Status 可以是 TOJ 所支援的所有 Status (AC, PC, WA, RE, RESIG, TLE, MLE, OLE, CE, CLE, SJE, IE)&lt;br /&gt;
&lt;br /&gt;
如果 Status 為空 或 不在支援的 Status 中將按照 Checker 回傳值決定狀態 (return 0 為 AC，其餘為 WA)&lt;br /&gt;
&lt;br /&gt;
下面列出幾個作為參考&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! STDOUT String !! Score !! Status&lt;br /&gt;
|-&lt;br /&gt;
| CMS;0.5;PC || 子任務分數 * 0.5 || PC (Partial Correct)&lt;br /&gt;
|-&lt;br /&gt;
| CF;32.27;AC || 32.27 || AC (Answer Correct)&lt;br /&gt;
|-&lt;br /&gt;
| NONE;3131;WA || 子任務分數 || WA (Wrong Answer)&lt;br /&gt;
|-&lt;br /&gt;
| CF;32.27; || 32.27 || 按照 Return 值決定是 AC 或 WA&lt;br /&gt;
|-&lt;br /&gt;
| ;; || 子任務分數 || 按照 Return 值決定是 AC 或 WA&lt;br /&gt;
|-&lt;br /&gt;
| (沒有任何輸出) || 子任務分數 || 按照 Return 值決定是 AC 或 WA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;/res/check/build&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
g++ -o check check.cpp&lt;br /&gt;
# python&lt;br /&gt;
# cp check.py check&lt;br /&gt;
# chmod +x check&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== IORedir ===&lt;br /&gt;
將[https://github.com/TFcis/Problem-setting-tools/blob/master/TOJ-problem-example/conf.json conf.json]中的 check 從 diff 改成 ioredir，及設定 metadata 如下。&lt;br /&gt;
如果 Checker 的 STDOUT 或 STDERR 沒有被佔用且有輸出內容，那 Verdict Message (Checker Message) 將會為該內容 (如果兩個同時都有，STDERR 優先於 STDOUT&lt;br /&gt;
&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;ioredir&amp;quot;,&lt;br /&gt;
    &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
        &amp;quot;redir_test&amp;quot;: {&lt;br /&gt;
            &amp;quot;pipeout&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;testin&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;testout&amp;quot;: -1,&lt;br /&gt;
            &amp;quot;pipein&amp;quot;: -1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;redir_check&amp;quot;: {&lt;br /&gt;
            &amp;quot;ansin&amp;quot;: 2,&lt;br /&gt;
            &amp;quot;testin&amp;quot;: -1,&lt;br /&gt;
            &amp;quot;pipeout&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;pipein&amp;quot;: -1&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果要用 ioredir 實現互動題， metadata 可以這樣寫&lt;br /&gt;
&lt;br /&gt;
從 STDERR 讀入測資，對 STDOUT 輸出測資&lt;br /&gt;
從 STDIN 讀入答案&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;redir_test&amp;quot;: {&lt;br /&gt;
        &amp;quot;pipein&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;testin&amp;quot;: -1,&lt;br /&gt;
        &amp;quot;pipeout&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;testout&amp;quot;: -1&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;redir_check&amp;quot;: {&lt;br /&gt;
        &amp;quot;ansin&amp;quot;: -1,&lt;br /&gt;
        &amp;quot;pipein&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;testin&amp;quot;: 2,&lt;br /&gt;
        &amp;quot;pipeout&amp;quot;: 0&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/check.cpp&lt;br /&gt;
分別從答案及輸出分別讀入long double。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
long double Answer, Output;&lt;br /&gt;
FILE *ansf = fdopen(2, &amp;quot;r&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
scanf(&amp;quot;%Lf&amp;quot;, &amp;amp;Output);&lt;br /&gt;
fscanf(ansf, &amp;quot;%Lf&amp;quot;, &amp;amp;Answer);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/build&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
g++ -o check check.cpp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
參考 https://hackmd.io/s/BkHdt57I&lt;br /&gt;
&lt;br /&gt;
=== Polygon to TOJ ===&lt;br /&gt;
請參考 [https://github.com/TFcis/cf2toj cf2toj]&lt;br /&gt;
&lt;br /&gt;
=== TPS to TOJ ===&lt;br /&gt;
請參考 [https://github.com/TFcis/tps2toj tps2toj]&lt;br /&gt;
&lt;br /&gt;
=== CMS to TOJ ===&lt;br /&gt;
請參考 [https://github.com/TFcis/cms2toj cms2toj]&lt;br /&gt;
&lt;br /&gt;
== 參見 ==&lt;br /&gt;
* [[TOJ API]]：API文檔&lt;br /&gt;
* [https://github.com/pzread/judge judge原始碼]&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=TOJ&amp;diff=461</id>
		<title>TOJ</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=TOJ&amp;diff=461"/>
		<updated>2024-10-15T02:20:37Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​/* Polygon to TOJ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:TOJ]]&lt;br /&gt;
&lt;br /&gt;
https://toj.tfcis.org/oj/&lt;br /&gt;
&lt;br /&gt;
* 社團練習用的Online Judge&lt;br /&gt;
* 由[[T13]]的[[吳哲宇]]([[pzread]])開發&lt;br /&gt;
* [[T19]]的[[lys0829]]於2017年將judge更新&lt;br /&gt;
* [[T24]]的[[tobiichi3227]]與[[ccccchhhheeenng]]於2022年將後端Server的軟硬體更新&lt;br /&gt;
&lt;br /&gt;
== 出題 ==&lt;br /&gt;
以下內容均為 Problem Package 的形式，TOJ 已經支援用 UI 新增題目了&lt;br /&gt;
=== 一般題目 ===&lt;br /&gt;
limit欄位的 default 一定要存在，其餘可以填寫 TOJ 支援的編譯器 (gcc, g++, clang, clang++, python3, rust, java)&lt;br /&gt;
&lt;br /&gt;
記憶體限制的單位是 KB&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;python3&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 2500,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 524288,&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
check欄位可以填 &amp;quot;diff&amp;quot;, &amp;quot;diff-strict&amp;quot;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! 解釋&lt;br /&gt;
|-&lt;br /&gt;
| diff || 寬鬆比對&lt;br /&gt;
|-&lt;br /&gt;
| diff-strict || 嚴格比對&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;is_makefile&amp;quot;: false,&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;diff&amp;quot;,&lt;br /&gt;
    &amp;quot;test&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;data&amp;quot;: [&lt;br /&gt;
                1, 2, 3, 4, 5&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;weight&amp;quot;: 100&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Makefile題目 (編譯互動題) ===&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;is_makefile&amp;quot;: true,&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;diff&amp;quot;,&lt;br /&gt;
    &amp;quot;test&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;data&amp;quot;: [&lt;br /&gt;
                1, 2, 3, 4, 5&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;weight&amp;quot;: 100&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CMS/Testlib Checker ===&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;cms&amp;quot;,&lt;br /&gt;
    &amp;quot;test&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;data&amp;quot;: [&lt;br /&gt;
                1, 2, 3, 4, 5&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;weight&amp;quot;: 100&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/check.cpp&lt;br /&gt;
會傳入三個參數，分別為測資輸入，測資輸出，答案輸入&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
int main(int argc, char** argv) {&lt;br /&gt;
    std::ifstream test_in(argv[1]);&lt;br /&gt;
    std::ifstream test_out(argv[2]);&lt;br /&gt;
    std::ifstream ans_in(argv[3]);&lt;br /&gt;
&lt;br /&gt;
    // C&lt;br /&gt;
    FILE* test_in_ptr = fopen(argv[1], &amp;quot;r&amp;quot;);&lt;br /&gt;
    FILE* test_out_ptr = fopen(argv[2], &amp;quot;r&amp;quot;);&lt;br /&gt;
    FILE* ans_in_ptr = fopen(argv[3], &amp;quot;r&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    fclose(test_in_ptr);&lt;br /&gt;
    fclose(test_out_ptr);&lt;br /&gt;
    fclose(ans_in_ptr);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/check.py&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
test_in = open(sys.argv[1])&lt;br /&gt;
test_out = open(sys.argv[2])&lt;br /&gt;
ans_in = open(sys.argv[3])&lt;br /&gt;
&lt;br /&gt;
test_in.close()&lt;br /&gt;
test_out.close()&lt;br /&gt;
ans_in.close()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Verdict Message (Checker Message) ====&lt;br /&gt;
對標準錯誤 (STDERR) 輸出 verdict message&lt;br /&gt;
&lt;br /&gt;
C/C++&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
std::cerr &amp;lt;&amp;lt; &amp;quot;checker message&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;cstdio&amp;gt;&lt;br /&gt;
fprintf(stderr, &amp;quot;checker message&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
print(&amp;quot;checker message&amp;quot;, sys.stderr)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Special Score &amp;amp; Status ====&lt;br /&gt;
對標準輸出 (STDOUT) 輸出 Special Score &amp;amp; Status，輸出標準如下&lt;br /&gt;
ScoreType;Score;Status&lt;br /&gt;
&lt;br /&gt;
===== Score =====&lt;br /&gt;
ScoreType 可以是 NONE, CMS, CF&lt;br /&gt;
&lt;br /&gt;
NONE 代表 Judge 不會理會 Score 的值&lt;br /&gt;
&lt;br /&gt;
CMS 代表 Judge 會將 該題子任務分數乘上 Score (與 CMS 的 GroupMin 相同)，且 Score 範圍應該從 0.0 到 1.0，大於 1.0 將設定為 1.0，小於 0.0 將設定為 0.0&lt;br /&gt;
&lt;br /&gt;
CF 代表 Judge 會直接用 Score 覆蓋該子任務分數&lt;br /&gt;
&lt;br /&gt;
===== Status =====&lt;br /&gt;
Status 可以是 TOJ 所支援的所有 Status (AC, PC, WA, RE, RESIG, TLE, MLE, OLE, CE, CLE, SJE, IE)&lt;br /&gt;
&lt;br /&gt;
如果 Status 為空 或 不在支援的 Status 中將按照 Checker 回傳值決定狀態 (return 0 為 AC，其餘為 WA)&lt;br /&gt;
&lt;br /&gt;
下面列出幾個作為參考&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! STDOUT String !! Score !! Status&lt;br /&gt;
|-&lt;br /&gt;
| CMS;0.5;PC || 子任務分數 * 0.5 || PC (Partial Correct)&lt;br /&gt;
|-&lt;br /&gt;
| CF;32.27;AC || 32.27 || AC (Answer Correct)&lt;br /&gt;
|-&lt;br /&gt;
| NONE;3131;WA || 子任務分數 || WA (Wrong Answer)&lt;br /&gt;
|-&lt;br /&gt;
| CF;32.27; || 32.27 || 按照 Return 值決定是 AC 或 WA&lt;br /&gt;
|-&lt;br /&gt;
| ;; || 子任務分數 || 按照 Return 值決定是 AC 或 WA&lt;br /&gt;
|-&lt;br /&gt;
| (沒有任何輸出) || 子任務分數 || 按照 Return 值決定是 AC 或 WA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;/res/check/build&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
g++ -o check check.cpp&lt;br /&gt;
# python&lt;br /&gt;
# cp check.py check&lt;br /&gt;
# chmod +x check&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== IORedir ===&lt;br /&gt;
將[https://github.com/TFcis/Problem-setting-tools/blob/master/TOJ-problem-example/conf.json conf.json]中的 check 從 diff 改成 ioredir，及設定 metadata 如下。&lt;br /&gt;
如果 Checker 的 STDOUT 或 STDERR 沒有被佔用且有輸出內容，那 Verdict Message (Checker Message) 將會為該內容 (如果兩個同時都有，STDERR 優先於 STDOUT&lt;br /&gt;
&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;ioredir&amp;quot;,&lt;br /&gt;
    &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
        &amp;quot;redir_test&amp;quot;: {&lt;br /&gt;
            &amp;quot;pipeout&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;testin&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;testout&amp;quot;: -1,&lt;br /&gt;
            &amp;quot;pipein&amp;quot;: -1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;redir_check&amp;quot;: {&lt;br /&gt;
            &amp;quot;ansin&amp;quot;: 2,&lt;br /&gt;
            &amp;quot;testin&amp;quot;: -1,&lt;br /&gt;
            &amp;quot;pipeout&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;pipein&amp;quot;: -1&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果要用 ioredir 實現互動題， metadata 可以這樣寫&lt;br /&gt;
&lt;br /&gt;
從 STDERR 讀入測資，對 STDOUT 輸出測資&lt;br /&gt;
從 STDIN 讀入答案&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;redir_test&amp;quot;: {&lt;br /&gt;
        &amp;quot;pipein&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;testin&amp;quot;: -1,&lt;br /&gt;
        &amp;quot;pipeout&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;testout&amp;quot;: -1&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;redir_check&amp;quot;: {&lt;br /&gt;
        &amp;quot;ansin&amp;quot;: -1,&lt;br /&gt;
        &amp;quot;pipein&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;testin&amp;quot;: 2,&lt;br /&gt;
        &amp;quot;pipeout&amp;quot;: 0&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/check.cpp&lt;br /&gt;
分別從答案及輸出分別讀入long double。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
long double Answer, Output;&lt;br /&gt;
FILE *ansf = fdopen(2, &amp;quot;r&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
scanf(&amp;quot;%Lf&amp;quot;, &amp;amp;Output);&lt;br /&gt;
fscanf(ansf, &amp;quot;%Lf&amp;quot;, &amp;amp;Answer);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/build&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
g++ -o check check.cpp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
參考 https://hackmd.io/s/BkHdt57I&lt;br /&gt;
&lt;br /&gt;
=== Polygon to TOJ ===&lt;br /&gt;
請參考 [https://github.com/TFcis/cf2toj cf2toj]&lt;br /&gt;
&lt;br /&gt;
=== TPS to TOJ ===&lt;br /&gt;
請參考 [https://github.com/TFcis/tps2toj]&lt;br /&gt;
&lt;br /&gt;
=== CMS to TOJ ===&lt;br /&gt;
請參考 [https://github.com/TFcis/cms2toj]&lt;br /&gt;
&lt;br /&gt;
== 參見 ==&lt;br /&gt;
* [[TOJ API]]：API文檔&lt;br /&gt;
* [https://github.com/pzread/judge judge原始碼]&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=TOJ&amp;diff=460</id>
		<title>TOJ</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=TOJ&amp;diff=460"/>
		<updated>2024-10-15T02:20:01Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​新增出題&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:TOJ]]&lt;br /&gt;
&lt;br /&gt;
https://toj.tfcis.org/oj/&lt;br /&gt;
&lt;br /&gt;
* 社團練習用的Online Judge&lt;br /&gt;
* 由[[T13]]的[[吳哲宇]]([[pzread]])開發&lt;br /&gt;
* [[T19]]的[[lys0829]]於2017年將judge更新&lt;br /&gt;
* [[T24]]的[[tobiichi3227]]與[[ccccchhhheeenng]]於2022年將後端Server的軟硬體更新&lt;br /&gt;
&lt;br /&gt;
== 出題 ==&lt;br /&gt;
以下內容均為 Problem Package 的形式，TOJ 已經支援用 UI 新增題目了&lt;br /&gt;
=== 一般題目 ===&lt;br /&gt;
limit欄位的 default 一定要存在，其餘可以填寫 TOJ 支援的編譯器 (gcc, g++, clang, clang++, python3, rust, java)&lt;br /&gt;
&lt;br /&gt;
記憶體限制的單位是 KB&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;python3&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 2500,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 524288,&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
check欄位可以填 &amp;quot;diff&amp;quot;, &amp;quot;diff-strict&amp;quot;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! 解釋&lt;br /&gt;
|-&lt;br /&gt;
| diff || 寬鬆比對&lt;br /&gt;
|-&lt;br /&gt;
| diff-strict || 嚴格比對&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;is_makefile&amp;quot;: false,&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;diff&amp;quot;,&lt;br /&gt;
    &amp;quot;test&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;data&amp;quot;: [&lt;br /&gt;
                1, 2, 3, 4, 5&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;weight&amp;quot;: 100&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Makefile題目 (編譯互動題) ===&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;is_makefile&amp;quot;: true,&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;diff&amp;quot;,&lt;br /&gt;
    &amp;quot;test&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;data&amp;quot;: [&lt;br /&gt;
                1, 2, 3, 4, 5&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;weight&amp;quot;: 100&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CMS/Testlib Checker ===&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;limit&amp;quot;: {&lt;br /&gt;
        &amp;quot;default&amp;quot;: {&lt;br /&gt;
            &amp;quot;timelimit&amp;quot;: 1000,&lt;br /&gt;
            &amp;quot;memlimit&amp;quot;: 65536&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;cms&amp;quot;,&lt;br /&gt;
    &amp;quot;test&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;data&amp;quot;: [&lt;br /&gt;
                1, 2, 3, 4, 5&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;weight&amp;quot;: 100&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/check.cpp&lt;br /&gt;
會傳入三個參數，分別為測資輸入，測資輸出，答案輸入&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
int main(int argc, char** argv) {&lt;br /&gt;
    std::ifstream test_in(argv[1]);&lt;br /&gt;
    std::ifstream test_out(argv[2]);&lt;br /&gt;
    std::ifstream ans_in(argv[3]);&lt;br /&gt;
&lt;br /&gt;
    // C&lt;br /&gt;
    FILE* test_in_ptr = fopen(argv[1], &amp;quot;r&amp;quot;);&lt;br /&gt;
    FILE* test_out_ptr = fopen(argv[2], &amp;quot;r&amp;quot;);&lt;br /&gt;
    FILE* ans_in_ptr = fopen(argv[3], &amp;quot;r&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    fclose(test_in_ptr);&lt;br /&gt;
    fclose(test_out_ptr);&lt;br /&gt;
    fclose(ans_in_ptr);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/check.py&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
test_in = open(sys.argv[1])&lt;br /&gt;
test_out = open(sys.argv[2])&lt;br /&gt;
ans_in = open(sys.argv[3])&lt;br /&gt;
&lt;br /&gt;
test_in.close()&lt;br /&gt;
test_out.close()&lt;br /&gt;
ans_in.close()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Verdict Message (Checker Message) ====&lt;br /&gt;
對標準錯誤 (STDERR) 輸出 verdict message&lt;br /&gt;
&lt;br /&gt;
C/C++&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
std::cerr &amp;lt;&amp;lt; &amp;quot;checker message&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;cstdio&amp;gt;&lt;br /&gt;
fprintf(stderr, &amp;quot;checker message&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
print(&amp;quot;checker message&amp;quot;, sys.stderr)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Special Score &amp;amp; Status ====&lt;br /&gt;
對標準輸出 (STDOUT) 輸出 Special Score &amp;amp; Status，輸出標準如下&lt;br /&gt;
ScoreType;Score;Status&lt;br /&gt;
&lt;br /&gt;
===== Score =====&lt;br /&gt;
ScoreType 可以是 NONE, CMS, CF&lt;br /&gt;
&lt;br /&gt;
NONE 代表 Judge 不會理會 Score 的值&lt;br /&gt;
&lt;br /&gt;
CMS 代表 Judge 會將 該題子任務分數乘上 Score (與 CMS 的 GroupMin 相同)，且 Score 範圍應該從 0.0 到 1.0，大於 1.0 將設定為 1.0，小於 0.0 將設定為 0.0&lt;br /&gt;
&lt;br /&gt;
CF 代表 Judge 會直接用 Score 覆蓋該子任務分數&lt;br /&gt;
&lt;br /&gt;
===== Status =====&lt;br /&gt;
Status 可以是 TOJ 所支援的所有 Status (AC, PC, WA, RE, RESIG, TLE, MLE, OLE, CE, CLE, SJE, IE)&lt;br /&gt;
&lt;br /&gt;
如果 Status 為空 或 不在支援的 Status 中將按照 Checker 回傳值決定狀態 (return 0 為 AC，其餘為 WA)&lt;br /&gt;
&lt;br /&gt;
下面列出幾個作為參考&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! STDOUT String !! Score !! Status&lt;br /&gt;
|-&lt;br /&gt;
| CMS;0.5;PC || 子任務分數 * 0.5 || PC (Partial Correct)&lt;br /&gt;
|-&lt;br /&gt;
| CF;32.27;AC || 32.27 || AC (Answer Correct)&lt;br /&gt;
|-&lt;br /&gt;
| NONE;3131;WA || 子任務分數 || WA (Wrong Answer)&lt;br /&gt;
|-&lt;br /&gt;
| CF;32.27; || 32.27 || 按照 Return 值決定是 AC 或 WA&lt;br /&gt;
|-&lt;br /&gt;
| ;; || 子任務分數 || 按照 Return 值決定是 AC 或 WA&lt;br /&gt;
|-&lt;br /&gt;
| (沒有任何輸出) || 子任務分數 || 按照 Return 值決定是 AC 或 WA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;/res/check/build&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
g++ -o check check.cpp&lt;br /&gt;
# python&lt;br /&gt;
# cp check.py check&lt;br /&gt;
# chmod +x check&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== IORedir ===&lt;br /&gt;
將[https://github.com/TFcis/Problem-setting-tools/blob/master/TOJ-problem-example/conf.json conf.json]中的 check 從 diff 改成 ioredir，及設定 metadata 如下。&lt;br /&gt;
如果 Checker 的 STDOUT 或 STDERR 沒有被佔用且有輸出內容，那 Verdict Message (Checker Message) 將會為該內容 (如果兩個同時都有，STDERR 優先於 STDOUT&lt;br /&gt;
&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;ioredir&amp;quot;,&lt;br /&gt;
    &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
        &amp;quot;redir_test&amp;quot;: {&lt;br /&gt;
            &amp;quot;pipeout&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;testin&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;testout&amp;quot;: -1,&lt;br /&gt;
            &amp;quot;pipein&amp;quot;: -1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;redir_check&amp;quot;: {&lt;br /&gt;
            &amp;quot;ansin&amp;quot;: 2,&lt;br /&gt;
            &amp;quot;testin&amp;quot;: -1,&lt;br /&gt;
            &amp;quot;pipeout&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;pipein&amp;quot;: -1&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果要用 ioredir 實現互動題， metadata 可以這樣寫&lt;br /&gt;
&lt;br /&gt;
從 STDERR 讀入測資，對 STDOUT 輸出測資&lt;br /&gt;
從 STDIN 讀入答案&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;redir_test&amp;quot;: {&lt;br /&gt;
        &amp;quot;pipein&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;testin&amp;quot;: -1,&lt;br /&gt;
        &amp;quot;pipeout&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;testout&amp;quot;: -1&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;redir_check&amp;quot;: {&lt;br /&gt;
        &amp;quot;ansin&amp;quot;: -1,&lt;br /&gt;
        &amp;quot;pipein&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;testin&amp;quot;: 2,&lt;br /&gt;
        &amp;quot;pipeout&amp;quot;: 0&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/check.cpp&lt;br /&gt;
分別從答案及輸出分別讀入long double。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
long double Answer, Output;&lt;br /&gt;
FILE *ansf = fdopen(2, &amp;quot;r&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
scanf(&amp;quot;%Lf&amp;quot;, &amp;amp;Output);&lt;br /&gt;
fscanf(ansf, &amp;quot;%Lf&amp;quot;, &amp;amp;Answer);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/build&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
g++ -o check check.cpp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
參考 https://hackmd.io/s/BkHdt57I&lt;br /&gt;
&lt;br /&gt;
=== Polygon to TOJ ===&lt;br /&gt;
請參考 [https://github.com/TFcis/cf2toj]&lt;br /&gt;
&lt;br /&gt;
=== TPS to TOJ ===&lt;br /&gt;
請參考 [https://github.com/TFcis/tps2toj]&lt;br /&gt;
&lt;br /&gt;
=== CMS to TOJ ===&lt;br /&gt;
請參考 [https://github.com/TFcis/cms2toj]&lt;br /&gt;
&lt;br /&gt;
== 參見 ==&lt;br /&gt;
* [[TOJ API]]：API文檔&lt;br /&gt;
* [https://github.com/pzread/judge judge原始碼]&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=T24&amp;diff=456</id>
		<title>T24</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=T24&amp;diff=456"/>
		<updated>2024-02-15T16:54:33Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;台南一中資訊社第24屆&lt;br /&gt;
&lt;br /&gt;
==社員名單==&lt;br /&gt;
&amp;lt;section begin=club-members&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 職位 !! 名字 !! id&lt;br /&gt;
|-&lt;br /&gt;
| [[社長]] || [[姚政彣]] || [[Vincenttainan]]&lt;br /&gt;
|-&lt;br /&gt;
| [[副社長]] || [[林軒名]]  || &lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[張丞漢]] || [[same0620]]&lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[郭育愷]] || [[bgg0516]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[莊正誠]] || [[ccccchhhheeenng]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[凃思寬]]|| [[YYOuO]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[林大鈞]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[開發教學]] || [[王傑宇]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[網管]] || [[高斐凱]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[總務]] || [[張赫倫]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[美宣]] ||  || &lt;br /&gt;
|-&lt;br /&gt;
| [[文書]] || [[蘇宥恆]] || [[chocomint]]&lt;br /&gt;
|- &lt;br /&gt;
| [[公關]] || [[賴冠學]] || [[LenLai3652]]&lt;br /&gt;
|- &lt;br /&gt;
| [[庶務]] || [[馬道中]] || [[tobiichi3227]]&lt;br /&gt;
|-&lt;br /&gt;
| [[社員]] || [[林恩甫]] || [[EF Lin]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;section end=club-members /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==活動==&lt;br /&gt;
&lt;br /&gt;
==豐功偉業==&lt;br /&gt;
更新[[TOJ]]後端Server的軟硬體&lt;br /&gt;
&lt;br /&gt;
更新社網&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=T24&amp;diff=455</id>
		<title>T24</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=T24&amp;diff=455"/>
		<updated>2024-02-15T16:54:18Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;台南一中資訊社第24屆&lt;br /&gt;
&lt;br /&gt;
==社員名單==&lt;br /&gt;
&amp;lt;section begin=club-members&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 職位 !! 名字 !! id&lt;br /&gt;
|-&lt;br /&gt;
| [[社長]] || [[姚政彣]] || [[Vincenttainan]]&lt;br /&gt;
|-&lt;br /&gt;
| [[副社長]] || [[林軒名]]  || &lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[張丞漢]] || [[same0620]]&lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[郭育愷]] || [[bgg0516]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[莊正誠]] || [[ccccchhhheeenng]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[凃思寬]]|| [[YYOuO]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[林大鈞]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[開發教學]] || [[王傑宇]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[網管]] || [[高斐凱]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[總務]] || [[張赫倫]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[美宣]] ||  || &lt;br /&gt;
|-&lt;br /&gt;
| [[文書]] || [[蘇宥恆]] || [[chocomint]]&lt;br /&gt;
|- &lt;br /&gt;
| [[公關]] || [[賴冠學]] || LenLai3652&lt;br /&gt;
|- &lt;br /&gt;
| [[庶務]] || [[馬道中]] || [[tobiichi3227]]&lt;br /&gt;
|-&lt;br /&gt;
| [[社員]] || [[林恩甫]] || [[EF Lin]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;section end=club-members /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==活動==&lt;br /&gt;
&lt;br /&gt;
==豐功偉業==&lt;br /&gt;
更新[[TOJ]]後端Server的軟硬體&lt;br /&gt;
&lt;br /&gt;
更新社網&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=%E8%87%BA%E5%8D%97%E4%B8%80%E4%B8%AD%E8%B3%87%E8%A8%8A%E7%A4%BE&amp;diff=452</id>
		<title>臺南一中資訊社</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=%E8%87%BA%E5%8D%97%E4%B8%80%E4%B8%AD%E8%B3%87%E8%A8%8A%E7%A4%BE&amp;diff=452"/>
		<updated>2023-11-17T08:00:36Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​Add T25&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;臺南一中資訊社是臺南一中的自然科學類社團。該社團以學術研究為主要發展方向，也是全臺南一中唯一有考試的社團。&amp;lt;br /&amp;gt;&lt;br /&gt;
也因為資訊社強調以學術研討為主，並以程式解題競賽為主要訓練方向之一，該社歷來培養出許多資訊奧林匹亞及資訊能力競賽的好手，亦不乏國手級的人物。&amp;lt;ref&amp;gt;[[xeon]] (第一屆)，〈社團簡介〉，2001 年 08 月18 日更新。&amp;lt;br /&amp;gt;其他[[社員]]或社友的口述歷史&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 簡史 ==&lt;br /&gt;
&lt;br /&gt;
== [[入社考]]與[[留社考]] ==&lt;br /&gt;
在高一社團獨立招生時，會舉辦入社考，來篩選出較有經驗或較有熱誠的學弟入社，並要求高一同學必須通過兩個學期末的留社考，才能在高二生涯中繼續留在社團裡&amp;lt;ref&amp;gt;過去的試題可於[[TOJ]]上找到&amp;lt;/ref&amp;gt;。高一上的[[留社考]]通常會以測驗語法能力為基準命題，高一下的[[留社考]]則會融合所有課程內容及其延伸命題。&lt;br /&gt;
&lt;br /&gt;
== [[暑訓]]與[[寒訓]] ==&lt;br /&gt;
寒暑假都有長達一周的全天集訓(競程)，會有許多超強學長回歸，不乏有友社或是國中生專程前來旁聽。&lt;br /&gt;
&lt;br /&gt;
== 社團幹部 ==&lt;br /&gt;
[[社長]]、[[副社長]]、[[程設教學]]、[[網管教學]]、[[網管]]、[[美工]]、[[總務]]&lt;br /&gt;
各屆幹部請見[[社員名單]]&lt;br /&gt;
&lt;br /&gt;
每屆情況不同，視情況調整{{Fact|（甚至還有出現「[[社寵]]」及「[[社寵長]]」還有「[[總統]]」之類的奇異幹部名稱）}}&lt;br /&gt;
&lt;br /&gt;
== [[社團結構]] ==&lt;br /&gt;
&lt;br /&gt;
=== [[T16]]前 ===&lt;br /&gt;
&lt;br /&gt;
資訊社主要分為三個組：[[程設組]]、[[網頁組]]、[[網管組]]。各組由學長帶領學弟，在社課或空閒時間探討特定領域的知識。資訊社並沒有強制要求同學只能參加一個組，各組同學之間的學習領域也多少有重疊。&lt;br /&gt;
&lt;br /&gt;
==== [[程設組]] ====&lt;br /&gt;
是資訊社2014年時主要的組別，且招收[[T17]][[社員]]時僅招收程設組。以資訊競賽為主要目標，每周的[[社課]]教學C++程式語言。&lt;br /&gt;
&lt;br /&gt;
==== [[網頁組]] ====&lt;br /&gt;
負責HTML語言、CSS以及JavaScript的相關內容。&lt;br /&gt;
&lt;br /&gt;
已於102學年由僅存唯一一名的組員宣布停止招生，期望學弟能在網管組兼顧更多網路方面的能力，以避免偏頗於單純的網頁設計、落入故步自封的境地。且，程設組的許多社員都有涉獵網頁設計的部分。&lt;br /&gt;
&lt;br /&gt;
簡言之，招生困難+教學實力不足&lt;br /&gt;
&lt;br /&gt;
==== [[網管組]] ====&lt;br /&gt;
&lt;br /&gt;
[[網管組]]的前身為[[系統組]]。在社團草創之初，系統組的組員協助維護校內的伺服器，同時也在社內維護起屬於社團的[[伺服器]]群。&lt;br /&gt;
&lt;br /&gt;
在第 6 屆社長[[劉茂宏]]以半實驗性質成立新的 BBS 「[[索尼小站]]」後，網管組的其中一個任務便是維護這個 BBS。從程式原始碼修訂、作業系統管理等等，學習基本的 UNIX 作業系統操作，以及著重於系統程式 （System Program） 的大型程式開發與維護。&lt;br /&gt;
&lt;br /&gt;
目前社內主要實習的作業系統多為 UNIX-like 系列，並以架設各式[[伺服器]]為主要學習方向。&lt;br /&gt;
&lt;br /&gt;
=== [[T17]] ===&lt;br /&gt;
&lt;br /&gt;
由[[T16]]社長[[domen111]]提出，主要分為[[程設組]]和[[開發組]]。&lt;br /&gt;
&lt;br /&gt;
====[[程設組]]====&lt;br /&gt;
即為先前的[[程設組]]。&lt;br /&gt;
&lt;br /&gt;
====[[開發組]]====&lt;br /&gt;
由先前的[[網頁組]]和[[網管組]]整併而來，著重於網頁設計及[[伺服器]]架設。&lt;br /&gt;
&lt;br /&gt;
=== 現行分組方式（[[T21]]之後） ===&lt;br /&gt;
&lt;br /&gt;
====[[競賽組]]====&lt;br /&gt;
即為先前的[[程設組]]。&lt;br /&gt;
&lt;br /&gt;
====[[網管組]]====&lt;br /&gt;
著重於網頁設計及[[伺服器]]架設、資安相關領域研究。&lt;br /&gt;
&lt;br /&gt;
====[[開發組]]====&lt;br /&gt;
著重開發Unity遊戲。&lt;br /&gt;
&lt;br /&gt;
==[[國中生程式設計營]]==&lt;br /&gt;
&lt;br /&gt;
==[[高一生程式設計排名賽]]==&lt;br /&gt;
&lt;br /&gt;
==各屆條目==&lt;br /&gt;
可參考已經建立的頁面 &amp;lt;br&amp;gt;&lt;br /&gt;
[[T25]]&lt;br /&gt;
[[T24]]&lt;br /&gt;
[[T23]]&lt;br /&gt;
[[T22]]&lt;br /&gt;
[[T21]]&lt;br /&gt;
[[T20]]&lt;br /&gt;
[[T19]]&lt;br /&gt;
[[T18]]&lt;br /&gt;
[[T17]]&lt;br /&gt;
[[T16]]&lt;br /&gt;
[[T15]]&lt;br /&gt;
[[T14]]&lt;br /&gt;
[[T13]]&lt;br /&gt;
[[T12]]&lt;br /&gt;
[[T11]]&lt;br /&gt;
[[T10]]&lt;br /&gt;
[[T9]]&lt;br /&gt;
[[T8]]&lt;br /&gt;
[[T7]]&lt;br /&gt;
[[T6]]&lt;br /&gt;
[[T5]]&lt;br /&gt;
[[T4]]&lt;br /&gt;
[[T3]]&lt;br /&gt;
[[T2]]&lt;br /&gt;
[[T1]]&lt;br /&gt;
[[T0]]&lt;br /&gt;
&lt;br /&gt;
== 參考資料 ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
== 外部連結 ==&lt;br /&gt;
* [http://www.tfcis.org 社團網站]&lt;br /&gt;
* [telnet://sony.tfcis.org 索尼小站BBS] 請使用BBS軟體連線，建議使用[http://pcman.openfoundry.org/ PCMan]&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=T25&amp;diff=451</id>
		<title>T25</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=T25&amp;diff=451"/>
		<updated>2023-11-17T07:59:00Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;台南一中資訊社第25屆&lt;br /&gt;
&lt;br /&gt;
==社員名單==&lt;br /&gt;
&amp;lt;section begin=club-members /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 職位 !! 名字 !! id&lt;br /&gt;
|-&lt;br /&gt;
| [[社長]] || [[葉智揚]] || [[tw20000807]]&lt;br /&gt;
|-&lt;br /&gt;
| [[副社長]] || [[甘宸昌]] || [[KCC]]&lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[盧尚恩]] || [[life_adventurer]]&lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[陳善元]] || [[iwantnitro]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[吳柏陞]] || [[kangroo.]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[林利達]]|| [[rudalin]]&lt;br /&gt;
|-&lt;br /&gt;
| [[開發教學]] || [[陳佑豪]] || [[w35ucu7]]&lt;br /&gt;
|-&lt;br /&gt;
| [[開發教學]] || [[林承禧]] || [[blacklin01]] &lt;br /&gt;
|-&lt;br /&gt;
| [[總務]] || [[林利達]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[美宣]] || [[葉晉瑋]] || [[想不到名字]]&lt;br /&gt;
|-&lt;br /&gt;
| [[文書]] || [[吳宬瑋]] || [[kindmeplease]]&lt;br /&gt;
|- &lt;br /&gt;
| [[公關]] || [[陳佑豪]] || &lt;br /&gt;
|- &lt;br /&gt;
| [[庶務]] || [[邱佑捷]] || [[rapelica]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;section end=club-members /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==活動==&lt;br /&gt;
&lt;br /&gt;
==豐功偉業==&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=T25&amp;diff=450</id>
		<title>T25</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=T25&amp;diff=450"/>
		<updated>2023-11-17T07:58:50Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;台南一中資訊社第25屆&lt;br /&gt;
&lt;br /&gt;
==社員名單==&lt;br /&gt;
&amp;lt;section begin=club-members /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 職位 !! 名字 !! id&lt;br /&gt;
|-&lt;br /&gt;
| [[社長]] || [[葉智揚]] || [[tw20000807]]&lt;br /&gt;
|-&lt;br /&gt;
| [[副社長]] || [[甘宸昌]] || [[KCC]]&lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[盧尚恩]] || [[life_adventurer]]&lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[陳善元]] || [[iwantnitro]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[吳柏陞]] || [[kangroo.]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[林利達]]|| [[rudalin]]&lt;br /&gt;
|-&lt;br /&gt;
| [[開發教學]] || [[陳佑豪]] || [[w35ucu7]]&lt;br /&gt;
|-&lt;br /&gt;
| [[開發教學]] || [[林承禧]] || [[blacklin01]] &lt;br /&gt;
|-&lt;br /&gt;
| [[總務]] || [[林利達]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[美宣]] || [[葉晉瑋]] || [[想不到名字]]&lt;br /&gt;
|-&lt;br /&gt;
| [[文書]] || [[吳宬瑋]] || [[kindmeplease]]&lt;br /&gt;
|- &lt;br /&gt;
| [[公關]] || [[陳佑豪]] || &lt;br /&gt;
|- &lt;br /&gt;
| [[庶務]] || [[邱佑捷]] || [[rapelica]]&lt;br /&gt;
|} &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;section end=club-members /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==活動==&lt;br /&gt;
&lt;br /&gt;
==豐功偉業==&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=T25&amp;diff=449</id>
		<title>T25</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=T25&amp;diff=449"/>
		<updated>2023-11-17T07:58:37Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;台南一中資訊社第25屆&lt;br /&gt;
&lt;br /&gt;
==社員名單==&lt;br /&gt;
&amp;lt;section begin=club-members /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 職位 !! 名字 !! id&lt;br /&gt;
|-&lt;br /&gt;
| [[社長]] || [[葉智揚]] || [[tw20000807]]&lt;br /&gt;
|-&lt;br /&gt;
| [[副社長]] || [甘宸昌]] || [[KCC]]&lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[盧尚恩]] || [[life_adventurer]]&lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[陳善元]] || [[iwantnitro]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[吳柏陞]] || [[kangroo.]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[林利達]]|| [[rudalin]]&lt;br /&gt;
|-&lt;br /&gt;
| [[開發教學]] || [[陳佑豪] || [[w35ucu7]]&lt;br /&gt;
|-&lt;br /&gt;
| [[開發教學]] || [[林承禧]] || [[blacklin01]] &lt;br /&gt;
|-&lt;br /&gt;
| [[總務]] || [[林利達]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[美宣]] || [[葉晉瑋]] || [[想不到名字]]&lt;br /&gt;
|-&lt;br /&gt;
| [[文書]] || [[吳宬瑋]] || [[kindmeplease]]&lt;br /&gt;
|- &lt;br /&gt;
| [[公關]] || [[陳佑豪]] || &lt;br /&gt;
|- &lt;br /&gt;
| [[庶務]] || [[邱佑捷]] || [[rapelica]]&lt;br /&gt;
|} &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;section end=club-members /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==活動==&lt;br /&gt;
&lt;br /&gt;
==豐功偉業==&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=T25&amp;diff=448</id>
		<title>T25</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=T25&amp;diff=448"/>
		<updated>2023-11-16T15:49:50Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;台南一中資訊社第25屆&lt;br /&gt;
&lt;br /&gt;
==社員名單==&lt;br /&gt;
&amp;lt;section begin=club-members /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 職位 !! 名字 !! id&lt;br /&gt;
|-&lt;br /&gt;
| [[社長]] || [[葉智揚]] || [[tw20000807]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;section end=club-members /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==活動==&lt;br /&gt;
&lt;br /&gt;
==豐功偉業==&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=T25&amp;diff=447</id>
		<title>T25</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=T25&amp;diff=447"/>
		<updated>2023-11-16T15:49:33Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​建立新頁面&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;台南一中資訊社第25屆&lt;br /&gt;
&lt;br /&gt;
==社員名單==&lt;br /&gt;
&amp;lt;section begin=club-members /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 職位 !! 名字 !! id&lt;br /&gt;
|-&lt;br /&gt;
| [[社長]] || [[葉智揚]] || [[Vincenttainan]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;section end=club-members /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==活動==&lt;br /&gt;
&lt;br /&gt;
==豐功偉業==&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=T24&amp;diff=446</id>
		<title>T24</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=T24&amp;diff=446"/>
		<updated>2023-11-16T15:46:20Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;台南一中資訊社第24屆&lt;br /&gt;
&lt;br /&gt;
==社員名單==&lt;br /&gt;
&amp;lt;section begin=club-members&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 職位 !! 名字 !! id&lt;br /&gt;
|-&lt;br /&gt;
| [[社長]] || [[姚政彣]] || [[Vincenttainan]]&lt;br /&gt;
|-&lt;br /&gt;
| [[副社長]] || [[林軒名]]  || &lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[張丞漢]] || [[same0620]]&lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[郭育愷]] || [[bgg0516]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[莊正誠]] || [[ccccchhhheeenng]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[凃思寬]]|| [[YYOuO]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[林大鈞]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[開發教學]] || [[王傑宇]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[網管]] || [[高斐凱]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[總務]] || [[張赫倫]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[美宣]] ||  || &lt;br /&gt;
|-&lt;br /&gt;
| [[文書]] || [[蘇宥恆]] || [[chocomint]]&lt;br /&gt;
|- &lt;br /&gt;
| [[公關]] || [[賴冠學]] || &lt;br /&gt;
|- &lt;br /&gt;
| [[庶務]] || [[馬道中]] || [[tobiichi3227]]&lt;br /&gt;
|-&lt;br /&gt;
| [[社員]] || [[林恩甫]] || [[EF Lin]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;section end=club-members /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==活動==&lt;br /&gt;
&lt;br /&gt;
==豐功偉業==&lt;br /&gt;
更新[[TOJ]]後端Server的軟硬體&lt;br /&gt;
&lt;br /&gt;
更新社網&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=Tobiichi3227&amp;diff=445</id>
		<title>Tobiichi3227</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=Tobiichi3227&amp;diff=445"/>
		<updated>2022-11-05T15:38:59Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{社員資訊框&lt;br /&gt;
|name=[[馬道中]]&lt;br /&gt;
|year=[[T24]]&lt;br /&gt;
|jobs=庶務&lt;br /&gt;
|id=tobiichi3227&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==社員簡介==&lt;br /&gt;
&lt;br /&gt;
==專長==&lt;br /&gt;
改[[TOJ]] &amp;lt;s&amp;gt;炸[[TOJ]]&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==豐功偉業==&lt;br /&gt;
&lt;br /&gt;
==經歷==&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=T24&amp;diff=444</id>
		<title>T24</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=T24&amp;diff=444"/>
		<updated>2022-11-05T15:33:40Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​/* 豐功偉業 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;台南一中資訊社第24屆&lt;br /&gt;
&lt;br /&gt;
==社員名單==&lt;br /&gt;
&amp;lt;section begin=club-members /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 職位 !! 名字 !! id&lt;br /&gt;
|-&lt;br /&gt;
| [[社長]] || [[姚政彣]] || [[Vincenttainan]]&lt;br /&gt;
|-&lt;br /&gt;
| [[副社長]] || [[林軒名]]  || &lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[張丞漢]] || [[same0620]]&lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[郭育愷]] || [[bgg0516]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[莊正誠]] || [[ccccchhhheeenng]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[凃思寬]]|| [[YYOuO]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[林大鈞]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[開發教學]] || [[王傑宇]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[網管]] || [[高斐凱]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[總務]] || [[張赫倫]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[美宣]] ||  || &lt;br /&gt;
|-&lt;br /&gt;
| [[文書]] || [[蘇宥恆]] || [[chocomint]]&lt;br /&gt;
|- &lt;br /&gt;
| [[公關]] || [[賴冠學]] || &lt;br /&gt;
|- &lt;br /&gt;
| [[庶務]] || [[馬道中]] || [[tobiichi3227]]&lt;br /&gt;
|-&lt;br /&gt;
| [[社員]] || [[林恩甫]] || [[EF Lin]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;section end=club-members /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==活動==&lt;br /&gt;
&lt;br /&gt;
==豐功偉業==&lt;br /&gt;
更新[[TOJ]]後端Server的軟硬體&lt;br /&gt;
&lt;br /&gt;
更新社網&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=T24&amp;diff=443</id>
		<title>T24</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=T24&amp;diff=443"/>
		<updated>2022-11-05T15:33:22Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​/* 豐功偉業 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;台南一中資訊社第24屆&lt;br /&gt;
&lt;br /&gt;
==社員名單==&lt;br /&gt;
&amp;lt;section begin=club-members /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 職位 !! 名字 !! id&lt;br /&gt;
|-&lt;br /&gt;
| [[社長]] || [[姚政彣]] || [[Vincenttainan]]&lt;br /&gt;
|-&lt;br /&gt;
| [[副社長]] || [[林軒名]]  || &lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[張丞漢]] || [[same0620]]&lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[郭育愷]] || [[bgg0516]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[莊正誠]] || [[ccccchhhheeenng]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[凃思寬]]|| [[YYOuO]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[林大鈞]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[開發教學]] || [[王傑宇]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[網管]] || [[高斐凱]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[總務]] || [[張赫倫]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[美宣]] ||  || &lt;br /&gt;
|-&lt;br /&gt;
| [[文書]] || [[蘇宥恆]] || [[chocomint]]&lt;br /&gt;
|- &lt;br /&gt;
| [[公關]] || [[賴冠學]] || &lt;br /&gt;
|- &lt;br /&gt;
| [[庶務]] || [[馬道中]] || [[tobiichi3227]]&lt;br /&gt;
|-&lt;br /&gt;
| [[社員]] || [[林恩甫]] || [[EF Lin]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;section end=club-members /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==活動==&lt;br /&gt;
&lt;br /&gt;
==豐功偉業==&lt;br /&gt;
更新[[TOJ]]後端Server的軟硬體&lt;br /&gt;
更新社網&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=YYOuO&amp;diff=442</id>
		<title>YYOuO</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=YYOuO&amp;diff=442"/>
		<updated>2022-11-05T15:32:01Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{社員資訊框&lt;br /&gt;
|name=[[凃思寬]]&lt;br /&gt;
|year=[[T24]]&lt;br /&gt;
|jobs=網管教學&lt;br /&gt;
|id=[[YYOuO]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==社員簡介==&lt;br /&gt;
&lt;br /&gt;
==專長==&lt;br /&gt;
改社網 &amp;lt;s&amp;gt;炸社網&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==豐功偉業==&lt;br /&gt;
&lt;br /&gt;
==經歷==&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=%E5%87%83%E6%80%9D%E5%AF%AC&amp;diff=441</id>
		<title>凃思寬</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=%E5%87%83%E6%80%9D%E5%AF%AC&amp;diff=441"/>
		<updated>2022-11-05T15:31:50Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​頁面已重新導向至YYOuO&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT[[YYOuO]]&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=T24&amp;diff=440</id>
		<title>T24</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=T24&amp;diff=440"/>
		<updated>2022-11-05T15:31:31Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;台南一中資訊社第24屆&lt;br /&gt;
&lt;br /&gt;
==社員名單==&lt;br /&gt;
&amp;lt;section begin=club-members /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 職位 !! 名字 !! id&lt;br /&gt;
|-&lt;br /&gt;
| [[社長]] || [[姚政彣]] || [[Vincenttainan]]&lt;br /&gt;
|-&lt;br /&gt;
| [[副社長]] || [[林軒名]]  || &lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[張丞漢]] || [[same0620]]&lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[郭育愷]] || [[bgg0516]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[莊正誠]] || [[ccccchhhheeenng]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[凃思寬]]|| [[YYOuO]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[林大鈞]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[開發教學]] || [[王傑宇]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[網管]] || [[高斐凱]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[總務]] || [[張赫倫]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[美宣]] ||  || &lt;br /&gt;
|-&lt;br /&gt;
| [[文書]] || [[蘇宥恆]] || [[chocomint]]&lt;br /&gt;
|- &lt;br /&gt;
| [[公關]] || [[賴冠學]] || &lt;br /&gt;
|- &lt;br /&gt;
| [[庶務]] || [[馬道中]] || [[tobiichi3227]]&lt;br /&gt;
|-&lt;br /&gt;
| [[社員]] || [[林恩甫]] || [[EF Lin]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;section end=club-members /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==活動==&lt;br /&gt;
&lt;br /&gt;
==豐功偉業==&lt;br /&gt;
更新[[TOJ]]後端Server的軟硬體&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=T24&amp;diff=439</id>
		<title>T24</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=T24&amp;diff=439"/>
		<updated>2022-11-05T15:31:15Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;台南一中資訊社第24屆&lt;br /&gt;
&lt;br /&gt;
==社員名單==&lt;br /&gt;
&amp;lt;section begin=club-members /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 職位 !! 名字 !! id&lt;br /&gt;
|-&lt;br /&gt;
| [[社長]] || [[姚政彣]] || [[Vincenttainan]]&lt;br /&gt;
|-&lt;br /&gt;
| [[副社長]] || [[林軒名]]  || &lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[張丞漢]] || [[same0620]]&lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[郭育愷]] || [[bgg0516]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[莊正誠]] || [[ccccchhhheeenng]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || 凃[[涂思寬|思寬]]|| [[YYOuO]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[林大鈞]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[開發教學]] || [[王傑宇]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[網管]] || [[高斐凱]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[總務]] || [[張赫倫]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[美宣]] ||  || &lt;br /&gt;
|-&lt;br /&gt;
| [[文書]] || [[蘇宥恆]] || [[chocomint]]&lt;br /&gt;
|- &lt;br /&gt;
| [[公關]] || [[賴冠學]] || &lt;br /&gt;
|- &lt;br /&gt;
| [[庶務]] || [[馬道中]] || [[tobiichi3227]]&lt;br /&gt;
|-&lt;br /&gt;
| [[社員]] || [[林恩甫]] || [[EF Lin]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;section end=club-members /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==活動==&lt;br /&gt;
&lt;br /&gt;
==豐功偉業==&lt;br /&gt;
更新[[TOJ]]後端Server的軟硬體&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=%E6%B6%82%E6%80%9D%E5%AF%AC&amp;diff=438</id>
		<title>涂思寬</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=%E6%B6%82%E6%80%9D%E5%AF%AC&amp;diff=438"/>
		<updated>2022-11-05T15:29:53Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​頁面已重新導向至YYOuO&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT[[YYOuO]]&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=YYOuO&amp;diff=437</id>
		<title>YYOuO</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=YYOuO&amp;diff=437"/>
		<updated>2022-11-05T15:29:02Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​建立新頁面&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{社員資訊框&lt;br /&gt;
|name=[[涂思寬]]&lt;br /&gt;
|year=[[T24]]&lt;br /&gt;
|jobs=網管教學&lt;br /&gt;
|id=[[YYOuO]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==社員簡介==&lt;br /&gt;
&lt;br /&gt;
==專長==&lt;br /&gt;
改社網 &amp;lt;s&amp;gt;炸社網&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==豐功偉業==&lt;br /&gt;
&lt;br /&gt;
==經歷==&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=%E5%A7%9A%E6%94%BF%E5%BD%A3&amp;diff=436</id>
		<title>姚政彣</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=%E5%A7%9A%E6%94%BF%E5%BD%A3&amp;diff=436"/>
		<updated>2022-11-04T14:55:33Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​頁面已重新導向至Vincenttainan&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[vincenttainan]]&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=Vincenttainan&amp;diff=435</id>
		<title>Vincenttainan</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=Vincenttainan&amp;diff=435"/>
		<updated>2022-11-04T14:55:00Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​/* 社長大人簡介 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{社員資訊框&lt;br /&gt;
|name=[[姚政彣]]&lt;br /&gt;
|year=[[T24]]&lt;br /&gt;
|jobs=[[社長]]&lt;br /&gt;
|id=Vincenttainan&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==社長大人簡介==&lt;br /&gt;
&amp;lt;s&amp;gt;印度人&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==專長==&lt;br /&gt;
&lt;br /&gt;
==豐功偉業==&lt;br /&gt;
&amp;lt;s&amp;gt;試圖統一電機社&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==經歷==&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=Vincenttainan&amp;diff=434</id>
		<title>Vincenttainan</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=Vincenttainan&amp;diff=434"/>
		<updated>2022-11-04T14:54:09Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​建立新頁面&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{社員資訊框&lt;br /&gt;
|name=姚政彣&lt;br /&gt;
|year=[[T24]]&lt;br /&gt;
|jobs=[[社長]]&lt;br /&gt;
|id=Vincenttainan&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==社長大人簡介==&lt;br /&gt;
~~印度人~~&lt;br /&gt;
&lt;br /&gt;
==專長==&lt;br /&gt;
&lt;br /&gt;
==豐功偉業==&lt;br /&gt;
~~試圖統一電機社~~&lt;br /&gt;
&lt;br /&gt;
==經歷==&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=T24&amp;diff=433</id>
		<title>T24</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=T24&amp;diff=433"/>
		<updated>2022-11-03T23:16:39Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;台南一中資訊社第24屆&lt;br /&gt;
&lt;br /&gt;
==社員名單==&lt;br /&gt;
&amp;lt;section begin=club-members /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 職位 !! 名字 !! id&lt;br /&gt;
|-&lt;br /&gt;
| [[社長]] || [[姚政彣]] || [[Vincenttainan]]&lt;br /&gt;
|-&lt;br /&gt;
| [[副社長]] || [[林軒名]]  || &lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[張丞漢]] || [[same0620]]&lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[郭育愷]] || [[bgg0516]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[莊正誠]] || [[ccccchhhheeenng]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[涂思寬]] || [[YYOuO]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[林大鈞]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[開發教學]] || [[王傑宇]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[網管]] || [[高斐凱]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[總務]] || [[張赫倫]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[美宣]] ||  || &lt;br /&gt;
|-&lt;br /&gt;
| [[文書]] || [[蘇宥恆]] || [[chocomint]]&lt;br /&gt;
|- &lt;br /&gt;
| [[公關]] || [[賴冠學]] || &lt;br /&gt;
|- &lt;br /&gt;
| [[庶務]] || [[馬道中]] || [[tobiichi3227]]&lt;br /&gt;
|-&lt;br /&gt;
| [[社員]] || [[林恩甫]] || [[EF Lin]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;section end=club-members /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==活動==&lt;br /&gt;
&lt;br /&gt;
==豐功偉業==&lt;br /&gt;
更新[[TOJ]]後端Server的軟硬體&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=T24&amp;diff=432</id>
		<title>T24</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=T24&amp;diff=432"/>
		<updated>2022-11-03T23:12:50Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;台南一中資訊社第24屆&lt;br /&gt;
&lt;br /&gt;
==社員名單==&lt;br /&gt;
&amp;lt;section begin=club-members /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 職位 !! 名字 !! id&lt;br /&gt;
|-&lt;br /&gt;
| [[社長]] || [[姚政彣]] || [[Vincenttainan]]&lt;br /&gt;
|-&lt;br /&gt;
| [[副社長]] || [[林軒名]]  || &lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[張丞漢]] || [[same0620]]&lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[郭育愷]] || [[bgg0516]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[莊正誠]] || [[ccccchhhheeenng]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[涂思寬]] || [[YYOuO]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[林大鈞]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[開發教學]] || [[王傑宇]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[網管]] || [[高斐凱]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[總務]] || [[張赫倫]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[美宣]] ||  || &lt;br /&gt;
|-&lt;br /&gt;
| [[文書]] || [[蘇宥恆]] || [[chocomint]]&lt;br /&gt;
|- &lt;br /&gt;
| [[公關]] || [[賴冠學]] || &lt;br /&gt;
|- &lt;br /&gt;
| [[庶務]] || [[馬道中]] || [[tobiichi3227]]&lt;br /&gt;
|-&lt;br /&gt;
| [[社員]] || [[林恩甫]] || [[EF Lin]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;section end=club-members /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==活動==&lt;br /&gt;
&lt;br /&gt;
==豐功偉業==&lt;br /&gt;
更新[[TOJ]]後端的軟硬體&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=Ccccchhhheeeng&amp;diff=431</id>
		<title>Ccccchhhheeeng</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=Ccccchhhheeeng&amp;diff=431"/>
		<updated>2022-11-03T23:10:02Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​Tobiichi3227移動頁面Ccccchhhheeeng至Ccccchhhheeenng：​id打錯&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#重新導向 [[Ccccchhhheeenng]]&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=Ccccchhhheeenng&amp;diff=430</id>
		<title>Ccccchhhheeenng</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=Ccccchhhheeenng&amp;diff=430"/>
		<updated>2022-11-03T23:10:02Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​Tobiichi3227移動頁面Ccccchhhheeeng至Ccccchhhheeenng：​id打錯&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{社員資訊框&lt;br /&gt;
|name=[[莊正誠]]&lt;br /&gt;
|year=[[T24]]&lt;br /&gt;
|jobs=網管教學&lt;br /&gt;
|id=ccccchhhheeenng&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==社員簡介==&lt;br /&gt;
&lt;br /&gt;
==專長==&lt;br /&gt;
&lt;br /&gt;
==豐功偉業==&lt;br /&gt;
&lt;br /&gt;
==經歷==&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=T24&amp;diff=429</id>
		<title>T24</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=T24&amp;diff=429"/>
		<updated>2022-11-03T23:09:49Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;台南一中資訊社第24屆&lt;br /&gt;
&lt;br /&gt;
==社員名單==&lt;br /&gt;
&amp;lt;section begin=club-members /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 職位 !! 名字 !! id&lt;br /&gt;
|-&lt;br /&gt;
| [[社長]] || [[姚政彣]] || [[Vincenttainan]]&lt;br /&gt;
|-&lt;br /&gt;
| [[副社長]] || [[林軒名]]  || &lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[張丞漢]] || [[same0620]]&lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[郭育愷]] || [[bgg0516]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[莊正誠]] || [[ccccchhhheeenng]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[涂思寬]] || [[YYOuO]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[林大鈞]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[開發教學]] || [[王傑宇]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[網管]] || [[高斐凱]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[總務]] || [[張赫倫]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[美宣]] ||  || &lt;br /&gt;
|-&lt;br /&gt;
| [[文書]] || [[蘇宥恆]] || [[chocomint]]&lt;br /&gt;
|- &lt;br /&gt;
| [[公關]] || [[賴冠學]] || &lt;br /&gt;
|- &lt;br /&gt;
| [[庶務]] || [[馬道中]] || [[tobiichi3227]]&lt;br /&gt;
|-&lt;br /&gt;
| [[社員]] || [[林恩甫]] || [[EF Lin]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;section end=club-members /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==活動==&lt;br /&gt;
&lt;br /&gt;
==豐功偉業==&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=Ccccchhheeeng&amp;diff=428</id>
		<title>Ccccchhheeeng</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=Ccccchhheeeng&amp;diff=428"/>
		<updated>2022-11-03T23:09:09Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​Tobiichi3227移動頁面Ccccchhheeeng至Ccccchhhheeeng：​id打錯&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#重新導向 [[Ccccchhhheeeng]]&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=Ccccchhhheeenng&amp;diff=427</id>
		<title>Ccccchhhheeenng</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=Ccccchhhheeenng&amp;diff=427"/>
		<updated>2022-11-03T23:09:08Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​Tobiichi3227移動頁面Ccccchhheeeng至Ccccchhhheeeng：​id打錯&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{社員資訊框&lt;br /&gt;
|name=[[莊正誠]]&lt;br /&gt;
|year=[[T24]]&lt;br /&gt;
|jobs=網管教學&lt;br /&gt;
|id=ccccchhhheeenng&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==社員簡介==&lt;br /&gt;
&lt;br /&gt;
==專長==&lt;br /&gt;
&lt;br /&gt;
==豐功偉業==&lt;br /&gt;
&lt;br /&gt;
==經歷==&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=T24&amp;diff=426</id>
		<title>T24</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=T24&amp;diff=426"/>
		<updated>2022-11-03T23:07:19Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;台南一中資訊社第24屆&lt;br /&gt;
&lt;br /&gt;
==社員名單==&lt;br /&gt;
&amp;lt;section begin=club-members /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 職位 !! 名字 !! id&lt;br /&gt;
|-&lt;br /&gt;
| [[社長]] || [[姚政彣]] || [[Vincenttainan]]&lt;br /&gt;
|-&lt;br /&gt;
| [[副社長]] || [[林軒名]]  || &lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[張丞漢]] || [[same0620]]&lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[郭育愷]] || [[bgg0516]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[莊正誠]] || [[ccccchhhheeeng]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[涂思寬]] || [[YYOuO]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[林大鈞]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[開發教學]] || [[王傑宇]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[網管]] || [[高斐凱]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[總務]] || [[張赫倫]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[美宣]] ||  || &lt;br /&gt;
|-&lt;br /&gt;
| [[文書]] || [[蘇宥恆]] || [[chocomint]]&lt;br /&gt;
|- &lt;br /&gt;
| [[公關]] || [[賴冠學]] || &lt;br /&gt;
|- &lt;br /&gt;
| [[庶務]] || [[馬道中]] || [[tobiichi3227]]&lt;br /&gt;
|-&lt;br /&gt;
| [[社員]] || [[林恩甫]] || [[EF Lin]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;section end=club-members /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==活動==&lt;br /&gt;
&lt;br /&gt;
==豐功偉業==&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=%E8%8E%8A%E6%AD%A3%E8%AA%A0&amp;diff=425</id>
		<title>莊正誠</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=%E8%8E%8A%E6%AD%A3%E8%AA%A0&amp;diff=425"/>
		<updated>2022-11-03T23:06:39Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​頁面已重新導向至Ccccchhhheeenng&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[ccccchhhheeenng]]&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=Ccccchhhheeenng&amp;diff=424</id>
		<title>Ccccchhhheeenng</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=Ccccchhhheeenng&amp;diff=424"/>
		<updated>2022-11-03T23:06:02Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​建立新頁面&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{社員資訊框&lt;br /&gt;
|name=[[莊正誠]]&lt;br /&gt;
|year=[[T24]]&lt;br /&gt;
|jobs=網管教學&lt;br /&gt;
|id=ccccchhhheeenng&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==社員簡介==&lt;br /&gt;
&lt;br /&gt;
==專長==&lt;br /&gt;
&lt;br /&gt;
==豐功偉業==&lt;br /&gt;
&lt;br /&gt;
==經歷==&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=TOJ&amp;diff=423</id>
		<title>TOJ</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=TOJ&amp;diff=423"/>
		<updated>2022-11-03T13:08:15Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:TOJ]]&lt;br /&gt;
&lt;br /&gt;
https://toj.tfcis.org/oj/&lt;br /&gt;
&lt;br /&gt;
* 社團練習用的Online Judge&lt;br /&gt;
* 由[[T13]]的[[吳哲宇]]([[pzread]])開發&lt;br /&gt;
* [[T19]]的[[lys0829]]於2017年將judge更新&lt;br /&gt;
* [[T24]]的[[tobiichi3227]]與[[ccccchhhheeenng]]於2022年將後端Server的軟硬體更新&lt;br /&gt;
&lt;br /&gt;
== Special Judge ==&lt;br /&gt;
將[https://github.com/TFcis/Problem-setting-tools/blob/master/TOJ-problem-example/conf.json conf.json]中的check從diff改成ioredir，及設定metadata如下。&lt;br /&gt;
;/conf.json&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JSON&amp;quot;&amp;gt;{&lt;br /&gt;
    &amp;quot;check&amp;quot;: &amp;quot;ioredir&amp;quot;,&lt;br /&gt;
    &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
        &amp;quot;redir_test&amp;quot;: {&lt;br /&gt;
            &amp;quot;pipeout&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;testin&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;testout&amp;quot;: -1,&lt;br /&gt;
            &amp;quot;pipein&amp;quot;: -1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;redir_check&amp;quot;: {&lt;br /&gt;
            &amp;quot;ansin&amp;quot;: 2,&lt;br /&gt;
            &amp;quot;testin&amp;quot;: -1,&lt;br /&gt;
            &amp;quot;pipeout&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;pipein&amp;quot;: -1&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/check.cpp&lt;br /&gt;
分別從答案及輸出分別讀入long double。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
long double Answer, Output;&lt;br /&gt;
FILE *ansf = fdopen(2, &amp;quot;r&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
scanf(&amp;quot;%Lf&amp;quot;, &amp;amp;Output);&lt;br /&gt;
fscanf(ansf, &amp;quot;%Lf&amp;quot;, &amp;amp;Answer);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;/res/check/build&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
g++ -o check check.cpp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
參考 https://hackmd.io/s/BkHdt57I&lt;br /&gt;
&lt;br /&gt;
== 參見 ==&lt;br /&gt;
* [[TOJ API]]：API文檔&lt;br /&gt;
* [https://github.com/pzread/judge judge原始碼]&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=%E9%A6%AC%E9%81%93%E4%B8%AD&amp;diff=422</id>
		<title>馬道中</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=%E9%A6%AC%E9%81%93%E4%B8%AD&amp;diff=422"/>
		<updated>2022-10-20T08:42:37Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​redirect to tobiichi3227 page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[tobiichi3227]]&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=T24&amp;diff=421</id>
		<title>T24</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=T24&amp;diff=421"/>
		<updated>2022-10-20T08:38:12Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​/* 社員名單 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;台南一中資訊社第24屆&lt;br /&gt;
&lt;br /&gt;
==社員名單==&lt;br /&gt;
&amp;lt;section begin=club-members /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 職位 !! 名字 !! id&lt;br /&gt;
|-&lt;br /&gt;
| [[社長]] || [[姚政彣]] || [[Vincenttainan]]&lt;br /&gt;
|-&lt;br /&gt;
| [[副社長]] || [[林軒名]]  || &lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[張丞漢]] || [[same0620]]&lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[郭育愷]] || [[bgg0516]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[莊正誠]] || [[ccccchhheeeng]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[涂思寬]] || [[YYOuO]]&lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] || [[林大鈞]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[開發教學]] || [[王傑宇]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[網管]] || [[高斐凱]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[總務]] || [[張赫倫]] || &lt;br /&gt;
|-&lt;br /&gt;
| [[美宣]] ||  || &lt;br /&gt;
|-&lt;br /&gt;
| [[文書]] || [[蘇宥恆]] || [[chocomint]]&lt;br /&gt;
|- &lt;br /&gt;
| [[公關]] || [[賴冠學]] || &lt;br /&gt;
|- &lt;br /&gt;
| [[庶務]] || [[馬道中]] || [[tobiichi3227]]&lt;br /&gt;
|-&lt;br /&gt;
| [[社員]] || [[林恩甫]] || [[EF Lin]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;section end=club-members /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==活動==&lt;br /&gt;
&lt;br /&gt;
==豐功偉業==&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=T24&amp;diff=420</id>
		<title>T24</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=T24&amp;diff=420"/>
		<updated>2022-10-20T04:48:18Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;台南一中資訊社第24屆&lt;br /&gt;
&lt;br /&gt;
==社員名單==&lt;br /&gt;
&amp;lt;section begin=club-members /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 職位 !! 名字 !! id&lt;br /&gt;
|-&lt;br /&gt;
| [[社長]] || [[姚政彣]] || [[Vincenttainan]]&lt;br /&gt;
|-&lt;br /&gt;
| [[副社長]] || [[林軒名]]  || &lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] || [[張丞漢]] || [[same0620]]&lt;br /&gt;
|-&lt;br /&gt;
| [[程設教學]] ||  || &lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] ||  || &lt;br /&gt;
|-&lt;br /&gt;
| [[網管教學]] ||  || &lt;br /&gt;
|-&lt;br /&gt;
| [[開發教學]] ||  || &lt;br /&gt;
|-&lt;br /&gt;
| [[網管]] ||  || &lt;br /&gt;
|-&lt;br /&gt;
| [[總務]] ||  || &lt;br /&gt;
|-&lt;br /&gt;
| [[美宣]] ||  || &lt;br /&gt;
|-&lt;br /&gt;
| [[文書]] || [[蘇宥恆]] || [[chocomint]]&lt;br /&gt;
|- &lt;br /&gt;
| [[庶務]] || [[馬道中]] || [[tobiichi3227]]&lt;br /&gt;
|-&lt;br /&gt;
| [[社員]] || [[林恩甫]] || [[EF Lin]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;section end=club-members /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==活動==&lt;br /&gt;
&lt;br /&gt;
==豐功偉業==&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=Tobiichi3227&amp;diff=419</id>
		<title>Tobiichi3227</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=Tobiichi3227&amp;diff=419"/>
		<updated>2022-10-20T04:45:17Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{社員資訊框&lt;br /&gt;
|name=[[馬道中]]&lt;br /&gt;
|year=[[T24]]&lt;br /&gt;
|jobs=庶務&lt;br /&gt;
|id=tobiichi3227&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==社員簡介==&lt;br /&gt;
&lt;br /&gt;
==專長==&lt;br /&gt;
&lt;br /&gt;
==豐功偉業==&lt;br /&gt;
&lt;br /&gt;
==經歷==&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=Tobiichi3227&amp;diff=418</id>
		<title>Tobiichi3227</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=Tobiichi3227&amp;diff=418"/>
		<updated>2022-10-20T04:44:57Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{社員資訊框&lt;br /&gt;
|name=馬道中&lt;br /&gt;
|year=[[T24]]&lt;br /&gt;
|jobs=庶務&lt;br /&gt;
|id=tobiichi3227&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==社員簡介==&lt;br /&gt;
&lt;br /&gt;
==專長==&lt;br /&gt;
&lt;br /&gt;
==豐功偉業==&lt;br /&gt;
&lt;br /&gt;
==經歷==&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
	<entry>
		<id>https://wiki.tfcis.org/index.php?title=%E8%87%BA%E5%8D%97%E4%B8%80%E4%B8%AD%E8%B3%87%E8%A8%8A%E7%A4%BE&amp;diff=417</id>
		<title>臺南一中資訊社</title>
		<link rel="alternate" type="text/html" href="https://wiki.tfcis.org/index.php?title=%E8%87%BA%E5%8D%97%E4%B8%80%E4%B8%AD%E8%B3%87%E8%A8%8A%E7%A4%BE&amp;diff=417"/>
		<updated>2022-10-20T04:44:35Z</updated>

		<summary type="html">&lt;p&gt;Tobiichi3227：​add T24 link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;臺南一中資訊社是臺南一中的自然科學類社團。該社團以學術研究為主要發展方向，也是全臺南一中唯一有考試的社團。&amp;lt;br /&amp;gt;&lt;br /&gt;
也因為資訊社強調以學術研討為主，並以程式解題競賽為主要訓練方向之一，該社歷來培養出許多資訊奧林匹亞及資訊能力競賽的好手，亦不乏國手級的人物。&amp;lt;ref&amp;gt;[[xeon]] (第一屆)，〈社團簡介〉，2001 年 08 月18 日更新。&amp;lt;br /&amp;gt;其他[[社員]]或社友的口述歷史&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 簡史 ==&lt;br /&gt;
&lt;br /&gt;
== [[入社考]]與[[留社考]] ==&lt;br /&gt;
在高一社團獨立招生時，會舉辦入社考，來篩選出較有經驗或較有熱誠的學弟入社，並要求高一同學必須通過兩個學期末的留社考，才能在高二生涯中繼續留在社團裡&amp;lt;ref&amp;gt;過去的試題可於[[TOJ]]上找到&amp;lt;/ref&amp;gt;。高一上的[[留社考]]通常會以測驗語法能力為基準命題，高一下的[[留社考]]則會融合所有課程內容及其延伸命題。&lt;br /&gt;
&lt;br /&gt;
== [[暑訓]]與[[寒訓]] ==&lt;br /&gt;
寒暑假都有長達一周的全天集訓(競程)，會有許多超強學長回歸，不乏有友社或是國中生專程前來旁聽。&lt;br /&gt;
&lt;br /&gt;
== 社團幹部 ==&lt;br /&gt;
[[社長]]、[[副社長]]、[[程設教學]]、[[網管教學]]、[[網管]]、[[美工]]、[[總務]]&lt;br /&gt;
各屆幹部請見[[社員名單]]&lt;br /&gt;
&lt;br /&gt;
每屆情況不同，視情況調整{{Fact|（甚至還有出現「[[社寵]]」及「[[社寵長]]」還有「[[總統]]」之類的奇異幹部名稱）}}&lt;br /&gt;
&lt;br /&gt;
== [[社團結構]] ==&lt;br /&gt;
&lt;br /&gt;
=== [[T16]]前 ===&lt;br /&gt;
&lt;br /&gt;
資訊社主要分為三個組：[[程設組]]、[[網頁組]]、[[網管組]]。各組由學長帶領學弟，在社課或空閒時間探討特定領域的知識。資訊社並沒有強制要求同學只能參加一個組，各組同學之間的學習領域也多少有重疊。&lt;br /&gt;
&lt;br /&gt;
==== [[程設組]] ====&lt;br /&gt;
是資訊社2014年時主要的組別，且招收[[T17]][[社員]]時僅招收程設組。以資訊競賽為主要目標，每周的[[社課]]教學C++程式語言。&lt;br /&gt;
&lt;br /&gt;
==== [[網頁組]] ====&lt;br /&gt;
負責HTML語言、CSS以及JavaScript的相關內容。&lt;br /&gt;
&lt;br /&gt;
已於102學年由僅存唯一一名的組員宣布停止招生，期望學弟能在網管組兼顧更多網路方面的能力，以避免偏頗於單純的網頁設計、落入故步自封的境地。且，程設組的許多社員都有涉獵網頁設計的部分。&lt;br /&gt;
&lt;br /&gt;
簡言之，招生困難+教學實力不足&lt;br /&gt;
&lt;br /&gt;
==== [[網管組]] ====&lt;br /&gt;
&lt;br /&gt;
[[網管組]]的前身為[[系統組]]。在社團草創之初，系統組的組員協助維護校內的伺服器，同時也在社內維護起屬於社團的[[伺服器]]群。&lt;br /&gt;
&lt;br /&gt;
在第 6 屆社長[[劉茂宏]]以半實驗性質成立新的 BBS 「[[索尼小站]]」後，網管組的其中一個任務便是維護這個 BBS。從程式原始碼修訂、作業系統管理等等，學習基本的 UNIX 作業系統操作，以及著重於系統程式 （System Program） 的大型程式開發與維護。&lt;br /&gt;
&lt;br /&gt;
目前社內主要實習的作業系統多為 UNIX-like 系列，並以架設各式[[伺服器]]為主要學習方向。&lt;br /&gt;
&lt;br /&gt;
=== [[T17]] ===&lt;br /&gt;
&lt;br /&gt;
由[[T16]]社長[[domen111]]提出，主要分為[[程設組]]和[[開發組]]。&lt;br /&gt;
&lt;br /&gt;
====[[程設組]]====&lt;br /&gt;
即為先前的[[程設組]]。&lt;br /&gt;
&lt;br /&gt;
====[[開發組]]====&lt;br /&gt;
由先前的[[網頁組]]和[[網管組]]整併而來，著重於網頁設計及[[伺服器]]架設。&lt;br /&gt;
&lt;br /&gt;
=== 現行分組方式（[[T21]]之後） ===&lt;br /&gt;
&lt;br /&gt;
====[[競賽組]]====&lt;br /&gt;
即為先前的[[程設組]]。&lt;br /&gt;
&lt;br /&gt;
====[[網管組]]====&lt;br /&gt;
著重於網頁設計及[[伺服器]]架設、資安相關領域研究。&lt;br /&gt;
&lt;br /&gt;
====[[開發組]]====&lt;br /&gt;
著重開發Unity遊戲。&lt;br /&gt;
&lt;br /&gt;
==[[國中生程式設計營]]==&lt;br /&gt;
&lt;br /&gt;
==[[高一生程式設計排名賽]]==&lt;br /&gt;
&lt;br /&gt;
==各屆條目==&lt;br /&gt;
可參考已經建立的頁面 &amp;lt;br&amp;gt;&lt;br /&gt;
[[T24]]&lt;br /&gt;
[[T23]]&lt;br /&gt;
[[T22]]&lt;br /&gt;
[[T21]]&lt;br /&gt;
[[T20]]&lt;br /&gt;
[[T19]]&lt;br /&gt;
[[T18]]&lt;br /&gt;
[[T17]]&lt;br /&gt;
[[T16]]&lt;br /&gt;
[[T15]]&lt;br /&gt;
[[T14]]&lt;br /&gt;
[[T13]]&lt;br /&gt;
[[T12]]&lt;br /&gt;
[[T11]]&lt;br /&gt;
[[T10]]&lt;br /&gt;
[[T9]]&lt;br /&gt;
[[T8]]&lt;br /&gt;
[[T7]]&lt;br /&gt;
[[T6]]&lt;br /&gt;
[[T5]]&lt;br /&gt;
[[T4]]&lt;br /&gt;
[[T3]]&lt;br /&gt;
[[T2]]&lt;br /&gt;
[[T1]]&lt;br /&gt;
[[T0]]&lt;br /&gt;
&lt;br /&gt;
== 參考資料 ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
== 外部連結 ==&lt;br /&gt;
* [http://www.tfcis.org 社團網站]&lt;br /&gt;
* [telnet://sony.tfcis.org 索尼小站BBS] 請使用BBS軟體連線，建議使用[http://pcman.openfoundry.org/ PCMan]&lt;/div&gt;</summary>
		<author><name>Tobiichi3227</name></author>
	</entry>
</feed>