# 演算法季後賽 ## 基本設定 - 時間 季後賽的時間依照當屆課程結束時間而定,不過時間大約會落在每年的 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: `指南`