HydroOJ 從入門到入土(17)批次轉化其他格式題庫到 HydroOJ 格式(Python)

Bowen404發表於2024-04-29

新題庫,新快樂,新痛苦。

一、想法

有了多種題庫之後,常常會遇到大量題庫無法轉化到自己的 OJ 上。每次都要重新手寫解析器,非常浪費時間,於是抽出了這個工具。

本工具可以將抽取好的資訊自動組裝成符合 HydroOJ 格式的題目並自動壓縮,解決後半部分的轉化工作。

二、實現

1. 準備包和相應環境

包:https://github.com/15921483570/hydrolizer (有用可以點個star)

環境:在包內執行 pip install -r requirements.txt

2. 使用

只需匯入本包後,按照範例,將所需資訊以字典形式傳入 Hydrolizer() 即可。

如需將 Hydrolizer.hpath 目錄內的所有題目資料夾打包,可以直接呼叫 Hydrolizer.zipzip()。打包好的檔案可以直接上傳 HydroOJ 使用。

至於原始檔的資訊抽取,很遺憾,因原始檔種類多樣,無法統一寫解析,只能根據實際情況,自行另寫一個解析器以完成前半部分工作,本工具僅能實現後半部分工作。

3. 例子

import hydrolizer

fname = "testttt"
pid = 1
data_src = os.path.join('test', 'data')

d = {
    # 基本屬性
    "fname": fname,  # 必填
    "data_src": data_src,  # 評測資料來源資料夾路徑,預設值為'',如無資料會報警告

    # 下載外部檔案所需資訊
    "headers": {},  # 預設值為 '',如無資料可刪除此行
    "cookies": {},  # 預設值為 {},如無資料可刪除此行
    "ignore": [],  # 遮蔽網址關鍵詞列表, 格式為['遮蔽詞1', '遮蔽詞2', ...],預設值為 [],如無資料可刪除此行

    # problem.md, 文字部分會自動從 html 格式轉為 Markdown
    "bg": "背景",  # 預設值為 '',如無資料可刪除此行
    "desc": "題目描述 ![](https://abc.com/123.png)",  # 預設值為 '',如無資料會報警告,如存在外部圖片連結會自動下載並整理
    "infmt": "輸入格式",  # 預設值為 '',如無資料可刪除此行
    "outfmt": "輸出格式",  # 預設值為 '',如無資料可刪除此行
    "trans": "題目大意",  # 預設值為 '',如無資料可刪除此行
    "samples": [['1', '2'], ['2', '3']],  # 必填,格式為:[第1組資料[輸入,輸出], 第2組資料[輸入,輸出], ...]
    # 如無樣例資料會報 ValueError, 如某次輸入輸出均為空會報警告
    "hint": "提示",  # 預設值為 '',如無資料可刪除此行

    # problem.yaml
    "pid": f"P{pid}",  # 數字或字串,預設值為'P1000'
    "owner": 2,  # 預設值為 2,如無特別要求可刪除此行
    "title": "買筆",  # 必填,如無資料會報 ValueError
    "tags": ['選擇'],  # 預設值為 None,格式為['標籤1','標籤2', ...],如無特別要求可刪除此行
    "difficulty": 1,  # 預設值為 0,如無特別要求可刪除此行

    # ./testdata/config.yaml
    "tp": 'default',  # 題目型別,預設值為 'default',如無特別要求可刪除此行
    "tm": 1000,  # 限制時間,預設值為 1000,如無特別要求可刪除此行
    "mem": 256,  # 限制記憶體,預設值為 256,如無特別要求可刪除此行
    # 以上三項若全部為預設值,則不會生成 config.yaml 檔案,評測時 oj 會自動處理
}

Hydrolizer.DEFAULT_MEMORY = 256  # 可根據題目實際情況調整預設限制記憶體,減少生成大量無效 config.yaml
Hydrolizer(**d)  #
Hydrolizer.zipzip()  # 打包 Hydrolizer.hpath 目錄內的所有資料夾到 Hydrolizer.hpath/000.zip

三、提示

包內自帶一個 test 用例,可以直接執行 __init__.py 檔案檢視使用效果。

相關文章