#competitive-programming #generator #framework #cp #test-cases #test-framework #test-data

ezcp

一个用于自动生成竞技编程问题的测试用例的简单工具

9 个版本

0.3.2 2024年7月4日
0.3.1 2024年7月2日
0.3.0 2024年3月11日
0.2.2 2024年3月11日
0.1.0 2023年12月29日

#613 in 开发工具

Download history 128/week @ 2024-06-27 153/week @ 2024-07-04

每月下载量 439

自定义许可证

130KB
2.5K SLoC

EZCP

一个用于轻松创建竞技编程任务的 Rust 框架。

功能

  • 生成测试输入并将其保存到文件中。
  • 生成正确输出。
  • 可选的测试输入检查器。
  • 如果有多个有效解,则创建解决方案检查器。
  • 子任务依赖关系。
  • 图生成器。
  • 数组生成器。
  • 添加部分解决方案并指定它应该通过哪些子任务。
  • 自动将所有测试文件存档到 zip 文件中。
  • 支持 CPS https://github.com/Zorz42/CPS

建议和错误报告:[email protected] 您也可以发起拉取请求。

最小示例:(更多完整示例请参阅 examples/

use rand::Rng;
use std::path::PathBuf;

fn main() {
    // For the first task you get an array of even integers. 
    // You need to find the sum of all elements in the array minus the half of the maximum element.

    let mut task = ezcp::Task::new("Coupon", &PathBuf::from("coupon"));

    // Constraint: n = 1
    let mut subtask1 = ezcp::Subtask::new(20);
    
    // Add 5 tests, where an array is generated with length 1 and an even value between 0 and 1_000_000_000 (inclusive).
    subtask1.add_test(5, ezcp::array_generator_custom(1, 1, |rng| rng.gen_range(0..=500_000_000) * 2));
    

    // No additional constraints.
    let mut subtask2 = ezcp::Subtask::new(50);

    // Add some random tests.
    subtask2.add_test(5, ezcp::array_generator_custom(1, 200_000, |rng| rng.gen_range(0..=500_000_000) * 2));

    // Add 5 edge cases, where n is maximal.
    subtask2.add_test(5, ezcp::array_generator_custom(200_000, 200_000, |rng| rng.gen_range(0..=500_000_000) * 2));

    // Add subtasks to the task.
    let subtask1 = task.add_subtask(subtask1);
    let subtask2 = task.add_subtask(subtask2);

    // Add dependencies (dependencies are only if constraints of a dependency are a subset of constraints of a subtask).
    task.add_subtask_dependency(subtask2, subtask1);
    
    // Finally, create the tests.
    task.create_tests();
}

coupon/solution.cpp

#include<iostream>
using namespace std;

int main(){
    int n;
    cin>>n;
    long long sum=0;
    int big=0;
    while(n--){
        int a;
        cin>>a;
        big=max(big,a);
        sum+=a;
    }
    cout<<sum-big/2<<"\n";
}

依赖关系

~3.5–5MB
~89K SLoC