# 演算法季後賽
## 基本設定
- 時間
季後賽的時間依照當屆課程結束時間而定,不過時間大約會落在每年的 6 月底至 7 月中。
比賽時間大致上落在 3 小時,外加約 1 小時的題解時間。
- 地點
可以自由選擇要實體或是線上,第一屆因為疫情的關係採線上舉辦。
- 參賽人
演算法課程學員為 **必要參加人**,是否要開放對外可以依照當屆狀況自行討論。
## 季後賽準備
季後賽得準備大致上分為幾個階段
**尋找出題者** => **決定題目相關設定** => **分配工作&出題(只有題敘)** => **產測資** => **上架到 CMS** => **測題** => **修測資/題目** => **寫題解** => **產參賽者帳號**
### 尋找出題者
這個階段大概在季後賽前兩個月就要開始找人。
出題者目前沒有給出很明確的限制條件,但是至少要確保出題內容對方是有足夠認識的,當然也不能是演算法學員。
:::danger
也許之後可以定義出更精確的規範
:::
---
:::success
請特別注意,出題相關的文件**不要放在 SCIST 的 Public 資料夾**,同時 **不要在出題者以外可以看到的地方討論題目**,這是為了避免行政組內也有學員,要確保整個競賽的公平性。
檔案請在雲端上另外開資料夾。
:::
---
### 決定題目相關設定
接下來要決定**題數**,以及**題目難度**。
:::info
第一屆的設定是這樣:
預計競賽時間共 3 小時
題目大約 6 題
| 序號 | 難度 |
| ---- | ---------- |
| A | 簽到題 |
| B~C | APCS pA~pB |
| D | APCS pC |
| E | APCS pD |
:::
第一屆是以 APCS 的難度來區分,有三題落在 pA~pB 以前的難度上。
決定好題數以及各自題目的難度之後,可以再詳細依照課程內容擬定**各題考點**。
特別注意到,這裡只是**大概訂出出題方向**,實際上考點可能會在出題過程中有增減,但是大方向基本上不會變動。
:::info
以第一屆來說,各題的設定是這樣:
| 序號 | 類型 |
| ---- | ------------------- |
| A | 單層迴圈 |
| B | 排序 |
| C | 爆搜 |
| D | 二分搜、排序、前綴和 |
| E | 動態規劃 |
:::
第一屆演算法季後賽 HackMD 參考: https://hackmd.io/@Koios1143/HyloGpRB_
### 分配工作&出題(只有題敘)
討論出這些方向,出題者們就可以開始搶題目了><
出題目的時間大概落在 1 個月,這 1 個月全部的題目基本上要至少要有雛型了。
畢竟人還是有人會拖延,盡量要把時間拉得比較有彈性,之後比較可以避免意外。
至於強調只有題敘,是因為產測試資料實際上需要花蠻多心思跟時間,先確定好題目是沒有問題的再去產測資會比較理想。
但是**並不是說只能照這個步驟來走**,而是建議這樣思考,如果你負責的題目比較多,先產測資來測試也是沒問題的,這興許也是一種測試題目是否正確的方式。
### 產測資
接下來會為題目分配子任務,再來依照不同的子任務產出相對應的測試資料。
通常我們會用亂數生產,然後再依照需求自己手動產幾筆測資。
測試資料的檔案名稱建議依照下面的格式走:
- 輸入檔
副檔名為 `.in` (上傳到 CMS 的時候記得要指定副檔名是 `*.in`)
名稱依照 `{子任務編號}_{子任務測資編號}`
如果該題只有一個子任務可以省略 `{子任務編號}_`
例如第一筆子任務的第三個側資檔名就會是 `1_3.in`
- 輸出檔
副檔名為 `.out` (上傳到 CMS 的時候記得要指定副檔名是 `*.out`)
名稱依照 `{子任務編號}_{子任務測資編號}`
如果該題只有一個子任務可以省略 `{子任務編號}_`
例如第一筆子任務的第三個側資檔名就會是 `1_3.out`
由於有特別加上 `子任務編號` ,因此可以把整題全部的測試資料包在一個 zip 之後一次上傳多筆(upload multiple subtasks)
測資產生完後記得要更新到雲端上。
### 上架到 CMS
這裡的 CMS 不是 Content Management System,請參考以下這份文件:
https://cms.readthedocs.io/en/v1.4/
這裡會需要有伺服器,並且建立好 CMS 的環境。
第一屆是向台南一中資訊社借用機器,裡面也已經有建立好的 CMS 環境,所以不需要過安裝的流程。
如果該屆也是要向南一中資訊社借用伺服器,記得要一下 ssh 的權限、cms admin 帳號。
如果未來有自己的伺服器,記得要多測試,最好找個網管協助,CMS 可能會遇到蠻多問題(?
這裡不會提到怎麼安裝 CMS。
這時候初步的題本也出來了,可以把全部的題目包成同一份 pdf ,全部題敘放在 pA 的 Statement 下。
當然,如果該屆要將題本分別放在各題也是可以的,只是全部放在一起會比較方便,因此建議放一起。
為了之後方便測題,要建立一個測試用帳號,這隻帳號不應該在計分板上看到,同時它可以在比賽未開始前看到題目。
每個題目需要設定的內容包含了:
- 題目名稱
- 計分模式為 IOI 2017
`Use the sum over each subtask of the best result for that subtask across all submissions (IOI 2017-)`
- 時間限制
- 記憶體大小限制
- 測試資料
- 配分
配分的部分我們是採用 GroupMin,子任務的每一筆測試資料都要通過才會拿到整筆子任務的分數。
寫法是 `[[子任務1配分, 子任務1測資數], [子任務2配分, 子任務2測資數], ...]`
`子任務1測資數` 的部分看別人也有用正則表達式(Regular Expression)來寫。
可以參考: https://cms.readthedocs.io/en/v1.4/Score%20types.html#groupmin
:::success
***第一屆的檔案***: https://drive.google.com/drive/folders/14V4xc3RbbPP8_qMIDc4VfIdhuaQ-NPyZ?usp=sharing
:::
### 測題
接下來就是要測試題目了,可以尋找出題者以外的非參賽人員協助測試,但是記得環境要設定好,不要讓參賽人員在開賽前看到題目。
找好測題的人員後,可以選擇要大家約一天一起來測試,或是各自在一個期限內測試完成回報結果。
測題需要測的項目包含
- 題目正確性
- 測資正確性
各別的子任務通常會有期待的做法,在這個時候就可以測試一下做法是不是有正確拿到該筆測資的分數。
### 修測資/題目
接下來就是將測題測出來的問題修正,也再檢查題目敘述的完整性、流暢性。
:::spoiler **補充說明題本**
題本的第一頁會寫上競賽的相關規則、各個題目的時間限制、記憶體限制等等。
另外,第一屆有遇到的情況是,學員沒有用過 CMS,所以不知道怎麼上傳答案。這裡建議兩個做法:
1. 在題本最前方的說明中教學
2. 在比賽開始前就讓學員測試過,例如開一個題目測試,或是在上課的時候順便教
另外,也分享一下第一屆產題本的方式
出題者都把題目寫在 HackMD 上,所以都是 markdown 的形式
於是我找到了 Typora(https://typora.io/) 協助產出題本 pdf 檔
不過只是單純把 markdown 丟進去還不夠,需要能夠強制新增頁尾的指令,畢竟我們不希望題目與題目之間黏在一起
可以參考這篇文章: https://support.typora.io/Page-Breaks/
簡單來說,在 Typora 的 設定>外觀>設定佈景主題資料夾 當中找到相對應主題的 css 文件,加上以下的程式碼
```css=
@media print, (overflow-block: paged) or (overflow-block: optional-paged)
{
/* Move top-level headings to a new page on the right-hand side: */
h1
{
page-break-before: right; /* CSS 2 */
break-before: recto; /* CSS 3+,
also works for languages written and paginated right-to-left */
}
/* Override the previous ruleset for the very first heading: */
h1:first-of-type,
section > h1:first-child
{
page-break-before: avoid; /* CSS 2 */
break-before: avoid; /* CSS 3+ */
}
/* Force second-level headings to begin in a new column or
possiblyon a new page if it was in the last of multiple columns otherwise: */
h2
{
break-before: column;
}
/* Headings should not be the last paragraph on a page: */
h1, h2, h3, h4, h5, h6
{
page-break-after: avoid;
}
/* Consecutive headings with deepening level should not be split across pages: */
h1+h2, h2+h3, h3+h4, h4+h5, h5+h6
{
page-break-before: avoid;
}
}
```
接下來當你想要新增頁尾的時候,就加上這一行
```css=
<div style="page-break-after: always; break-after: page;"></div>
```
做完之後 typora 就可以直接匯出成 pdf 的型態了。
:::
### 產參賽者帳號
最後是產生參賽者的帳號,可以統一一下帳號的格式。至於密碼的部分可以到網路上找密碼產生器,第一屆是產長度 6 的密碼。
產出的帳號記得要記錄在文件上,到時候文書要寄發比賽通知信給參賽者也會比較方便。
:::success
大約在比賽開始前一周要寄發郵件給參賽者,第一屆的信件內文大致如下:
```
親愛的學員您好:
本週日(7/11)13:00~16:00 將進行 SCIST 第一屆演算法季後賽。
請您先至比賽平台登入帳號,確認是可以登入的,若有任何問題請盡快提出。
比賽平台:
記分板:
帳號:
密碼:
當天可先登入帳號等待比賽開始,時間一到即會開始,重新整理畫面後會看到題目。題本將會放在 pA 的 Statement 當中,題本第一頁有比賽相關須知,請務必詳閱。
比賽結束後會有題解時間,透過 Google meet 進行,題解不強迫參加,後續會提供題解的簡報。
最後再次提醒,季後賽將會影響成績計算,請務必要參加。
有任何疑問歡迎來信或私訊 SCIST 粉絲專頁,感謝您的參與。
指導單位 : 國立臺南一中、教育部資訊安全人才培育計畫暨臺灣好厲駭、教育部資訊安全人才培育計畫
主辦單位 : 南臺灣學生資訊社群
協辦單位 : 教育部智慧創新跨領域人才培育計畫推動中心
贊助單位 : 奧義智慧科技、財團法人可成教育基金會
email : official@scist.org
fanpage : https://www.facebook.com/scist.tw
website : scist.org/
```
:::
### 寫題解
在比賽結束後會有題解時間,這裡會需要做一份題解簡報,可以一邊出題一邊寫。
可以參考第一屆的題解: https://docs.google.com/presentation/d/1stns_MBRD5klmcmavW9f3h13aAwgAaAi1bg3LNwTa-s/edit?usp=sharing
---
## 季後賽開始
季後賽開始前半小時要逐漸確認所有人都已經能登入帳號。
接下來競賽期間要隨時注意有沒有參賽者提出問題。
問題經過判斷如果在題目裡面已經有提到,就不要額外說明,直接說題目裡面已經有提到即可(有常用的回覆選單可以選到)。
反之,如果這個問題關乎題目的正確性,或是會影響題目的可理解性等等,記得要**發送 Annoucement**。
除了等待參賽者提出問題,比賽現場也需要有一位高手抽樣檢視 submission,確認該 submission 得分是否在預期中。若題敘、測資、題目設定等出現有誤,先發 Annoucement 請大家暫停上傳,儘速修完題目後再開放並 rejudge。若比賽結束後才發現題目錯誤,可以以最優待參賽者為原則補救:送出去的分不收回。
出題者在比賽進行期間可以看看大家的程式碼,在題解時間可以提一下大家遇過的問題。
如果比賽期間系統出現任何問題導致參賽者無法答題、看題目等等影響比賽進行的問題,在問題修復完成後要決定是否要延長比賽時間。
第一屆在比賽開始後就直接掛掉,重新開啟 judge 之後就好了,由於影響時間不到 1 分鐘,所以沒有延長比賽時間。
## 題解時間
題解記得要錄影
https://www.youtube.com/watch?v=7OXlPH2pFDo&t=1463s&ab_channel=OfficialSCIST
## 季後賽結束
季後賽結束後就是歡樂的計分時間了,要決定出誰通過本學期的測驗。
除此之外,可以把題目丟到 TOJ 上。要將 cms 檔案轉成 TOJ 的格式,可以參考這一篇: https://github.com/TFcis/cms2toj?fbclid=IwAR0grwLHW-n8BvtyZzxIwLqGu73XZTUumfM-yCOur-Woa6tWS9ODrL-JpXc
###### tags: `指南`