Skip to content

FishZe/yapyto

Repository files navigation

YaPyTo

YaPyTo下一代信息学竞赛题目格式转换和配置文件生成工具,将符合hydro的数据和config.yaml的题目,或由hydro题库下载的题目,转换为符合sastojschema的格式;同时也可以识别测试数据,生成满足条件的配置文件;给定数据生成器或标程运行的命令,也可以生成输入输出文件和对应的配置文件,来源于yarusto

兼容性

  1. sastoj目前不支持special-judgeinteractive类型的题目,因此,hydro格式的config.yamltypechecker_type不都为default的题目暂时不受支持
  2. sastoj目前不支持subtask的指定评分方式,仅支持取所属测试点中的最小值,config.yaml中包含subtask的,且typemax的不受支持,min将保持为subtasksum将会被拆分为cases,且包含多个subtask时,多个subtasktype必须相同。
  3. sastoj目前不支持针对casesubtask级别的time_limitmemory_limit,但YaPyTo仍在casesubtask中保留了这些字段,但出题时请注意修改整题的时间和内存限制
  4. YaPyTosastoj所使用的测试点分数补全方法有所区别,体现在YaPyTo对于未指定分数的测试点分数补全将更加平均,同一份配置文件经过YaPyTo后可能分数有所区别。
  5. 所有subtask的子任务依赖不被支持,会被忽略。

转换方式

  1. 以一份后缀为.out.ans的文件作为识别为题目数据的特征,包含config.yaml的题目数据文件将试图进行读取和转换,不包含或转换失败的,则会通过目录下的输入输出文件识别为测试点并补全分数。
  2. 对于包含多个subtaskconfig.yaml,只有type相同,且为minsum时,会被转换。
  3. 无论多个或单个subtask,类型为sumsubtask会被拆分为多个case,并忽略该subtaskid、子任务依赖和时间空间限制;类型为minsubtask将会保留为subtask,但子任务依赖依旧会被忽略。(注意,即使保留了subtask的时间与空间限制,但sastoj目前仍不支持)
  4. 对于未指定分数的casesubtask,会根据满分和已有分数计算分数,单个测试点的最小分数为1,默认整题分数为100,分数算法为剩余未分配的分数整除剩余未分配个数。类型为sum,未指定分数的subtask会在拆分为case后再计算分数,但已指定分数的测试点不受影响,已指定分数之间冲突时配置文件将转换失败。
  5. 输入输出文件一致且时间与空间限制相同的测试点将被识别为相同的测试点,会被合并,分数为二者总和。
  6. 配置文件转换失败或不存在配置文件时,会通过目录下的文件试图生成位置文件,当不包含后缀名的文件名相同的.in.out/.ans文件会被识别为一对测试点。

用法

安装依赖

pip install -r requirements.txt

使用

usage: main.py [-h] [-i INPUT] [-o OUTPUT] [--rename-output] [--generate] [-c CASE] [--generate-command GENERATE_COMMAND] [--std-command STD_COMMAND]

A converter that convert the config.yaml from hydro to the config.toml of sastoj schema.

options:
  -h, --help                            show this help message and exit
  -i INPUT, --input INPUT               input directory, such as ../testdata
  -o OUTPUT, --output OUTPUT            output directory
  --rename-output                       rename the output file to answer file
  --generate                            generate the input file or answer file
  -c CASE, --case CASE                  case sum
  --generate-command GENERATE_COMMAND   the command to generate the input file
  --std-command STD_COMMAND             the command to generate the answer file
  1. 根据给定hydro题目文件转换,使用-i指定题目文件目录,使用-o指定输出目录

    python main.py -i ./example/problem -o ./example/testdata
  2. 给定不包含配置文件的测试点输入输出文件,生成配置文件,并补全分数,命令同上

  3. 给定测试输入文件和标程运行命令,生成配置文件和标准输出:

    python main.py --generate -i ./example/problem_input --std-command './std' -o ./example/testdata
  4. 给定数据生成器运行命令和标程运行命令,生成配置文件和测试点输入输出文件,使用-c指定生成数量,默认为10:

    python .\main.py --generate -c 22 --generate-command "python -c 'import random;print(random.randint(0, 65536), random.randint(0, 65536))'" --std-command "python -c 's = input().split();print(int(s[0]) + int(s[1]))'"

输入目录应满足的格式:

  1. type=custom

    如果使用目录下的输入文件,给定标程运行命令,生成标准输出,请使用如下目录结构(不包含输出文件和配置文件)

    .
    ├── 1.in
    ├── 1.out
    ├── 2.in
    ├── 2.out
    ...
    ├── 9.in
    ├── 9.out
    ├── 10.in
    ├── 10.out
    └── config.yaml
    
    1 directory, 21 files
    
  2. type=hydro

     .
     ├── 1
     │   ├── problem.md
     │   ├── problem.yaml
     │   └── testdata
     │       ├── 1.in
     │       ├── 1.out
     │       └── config.yaml
     ├── 45
     │   ├── problem.md
     │   ├── problem.yaml
     │   └── testdata
     │       ├── 1.in
     │       ├── 1.out
     │       └── config.yaml
     └── 导入指南.txt
    
     5 directories, 11 files