# TPS 使用說明
- [題目結構](#題目結構)
- [TPS 指令](#TPS-指令)
## 題目結構
一道題目以該題英文名稱為資料夾名稱,且該資料夾包含以下資料夾及檔案
可以使用 `tps verify` 來驗證資料夾格式是否正確
### 資料夾
[`gen/`](#gen) , [`scripts/`](#scripts) , [`solution/`](#solution) , [`statement/`](#statement) , [`validator/`](#validator)
##### 以下為非必要的資料夾
[`checker/`](#checker):若該題需要 special judge 則會有此資料夾
[`grader/`](#grader):若該題為互動題,則會有此資料夾
[`public/`](#public):若有需要提供給參賽者的檔案(e.g. 供測試用的 grader、測資)會放置於這個資料夾
##### 需要 Makefile 的資料夾
`gen/` , `validator/` , `checker/`
`ABN/` <font color="red"><B>為 special judge 範例資料夾</B></font>
`Egg/` <font color="red"><B>為互動題範例資料夾</B></font>
`Sudoku/` <font color="red"><B>為 output only 範例資料夾</B></font>
`Template/` <font color="red"><B>為空資料夾,可以直接複製成新的題目資料夾</B></font>
### 檔案
[`problem.json`](#problemjson) , [`solutions.json`](#solutionsjson) , [`subtasks.json`](#subtasksjson)
## gen/
測資生成器會放置於這個資料夾
<font color="red"><B>請盡量讓生成器接收同樣的參數時可以產生同樣的測資,避免因為產生非預期的測資而沒卡到要卡的東西,建議可以使用 testlib.h</B></font>
### gen/data
這個檔案是生成測資的指令,詳細撰寫方式請參見 [TPS 的說明](https://github.com/ioi-2017/tps/tree/master/docs#gendata)
<font color="red"><B>這個檔案請勿使用 dos 格式</B></font>
所有題目都需要一筆只有範例測資的子任務 "samples"
### gen/manual/
手動生的測資可以放在這個資料夾讓 `gen/data` 引入
## scripts/
TPS 使用的腳本,基本上不會動到
## solution/
這個資料夾存放**標程**與**其他解題方法的程式碼(包含需要被 hack 的程式碼)**
## statement/
題目的 `.tex` , `.pdf` 等檔案存放於此
## validator/
驗證測資正確性所使用的程式,包含但不限於變數範圍、輸入格式以及所有子任務的限制
若測資正確則 validator 回傳 0,否則回傳非 0 值
## checker/
存放一份用來確認選手輸出是否正確的程式碼,會編譯成執行檔 checker 以匯入 CMS
<font color="red"><B>請注意 Makefile 中編譯出來檔案的名稱須為 checker.exe 且在</B></font> `chmod +x` <font color="red"><B>後須可執行</B></font>
`checker/`<font color="red"><B> 中的 testlib.h 有修改過以符合 CMS,請直接複製</B></font> `template/` <font color="red"><B>資料夾中的使用</B></font>
## grader/
本資料夾下應該會有 `<lang>/` 的資料夾,資料夾名稱依競賽提供的語言而定,下列為常見語言
- `cpp/`
- `c/`
- `py/`
- `java/`
並且資料夾內會有各語言的 grader,下方以 cpp 為例
### grader/cpp/prob.h
這個檔案是你希望選手引用的標頭檔,只能有一個檔案,且檔名必須以 `prob` 命名。
該檔案用來負責宣告所有公開的函式、變數、結構等等,一般來說不會在裡面塞任何邏輯實作。
### grader/cpp/grader.cpp
這些檔案是 Judge 端拿來互動的主要程式,會與選手的程式碼一起編譯。
通常在這類題目中,grader 會在修改後提供予選手測試用,而 tps 提供了一個方法可以簡化修改流程
當使用 `tps make-public` 指令時,tps 會將程式碼中 `// BEGIN SECRET` 與 `// END SECRET` 夾住的區塊移除,而生成提供參賽者使用的測試用 grader,詳細可以參考 `Egg/grader/` 資料夾中的檔案
<font color="red"><B>此版本的</B></font> `tps make-public` <font color="red"><B>有更動過,可支援以下內容</B></font>
1. 所有介於 `# BEGIN SECRET` 與 `# END SECRET` 的區塊將被移除
2. 所有介於 `// BEGIN SECRET` 與 `// END SECRET` 的區塊將被移除
3. 不在上述兩個區塊內,而在同一行內被 `_secret` 與 `secret` 夾起來的子區間
除此之外,必須注意不能在任何上述以外的地方出現任何「`secret`」的子字串(不論大小寫),否則 script 會噴錯。
## public/
存放要提供給選手的檔案,在這個資料夾的所有東西會被壓縮成一個 .zip 檔放在 CMS 的 Attachment 中
若為互動題則可以提供讓選手測試用的 grader
若為 Output Only 則提供輸入檔
其他也能提供一些檔案,e.g. 較大的範例測資、統合題本
### public/files
這個檔案描述了哪些檔案是要公開的,詳細撰寫方式請參見 [TPS 的說明](https://github.com/ioi-2017/tps/tree/master/docs#publicfiles)
## problem.json
題目的設定檔,包含題目的時限與一些 CMS 的設定,詳細撰寫方式請參見範例資料夾或是 [TPS 的說明](https://github.com/ioi-2017/tps/tree/master/docs#problemjson)
## solutions.json
標程與其他解法的設定檔,其中用來產生輸出檔的標程設定為 `"verdict": "model_solution"`,檔案中只能存在一個 `model_solution`
其他解法的 verdict 在 tps CLI 中沒有功用,可以選擇性填寫,詳細撰寫方式請參見 [TPS 的說明](https://github.com/ioi-2017/tps/tree/master/docs#solutionsjson)
## subtasks.json
子任務分配的設定檔,包含分數及 validator 與子任務的對應關係,詳細撰寫方式請參見 [TPS 的說明](https://github.com/ioi-2017/tps/tree/master/docs#subtasksjson)
請記得包含子任務 "samples"
## TPS 指令
<font color="red"><B>tps 使用 Python 執行,請先安裝 Python >= 3.6 及相關套件</B></font>
```bash
$ sudo ./install-tps.sh
$ sudo apt install dos2unix zip \ # for "tps make-public"
build-essential # for "make"
$ sudo pip install psutil # for "tps invoke"
```
其餘套件詳見 [TPS 的說明](https://github.com/ioi-2017/tps/tree/master/docs#Prerequisites-for-the-command-line-interface)
### verify
在題目資料夾下 `tps verify` 的指令,可以檢查現在的題目資料夾結構有沒有問題
### gen
在題目資料夾下 `tps gen` 的指令,tps 會自動生成並驗證測資,可選參數可以藉由 `tps gen --help` 得知
### invoke
在題目資料夾下 `tps invoke <solution-file>` 測試該程式碼的輸出與標準程式輸出的比較結果
且該程式碼執行時會受到時間與記憶體限制,可選參數可以藉由 `tps invoke --help` 得知