3 Star 3 Fork 0

Li2OI / Jelly data maker

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
patcher.cpp 5.47 KB
一键复制 编辑 原始数据 按行查看 历史
Jelly-Aries 提交于 2019-10-29 20:59 . release version 1.7.3
#include <iostream>
#include <cstdio>
#include <fstream>
#include <ctime>
#include <utility>
#include <algorithm>
#include <cstring>
#include <string>
#include "Maker.cpp"
using namespace std;
//1 _WIN32
#ifdef _WIN32
#define WINDOWS_ENVIRONMENT 1
//1
#else
//2 WIN32
#ifdef WIN32
#define WINDOWS_ENVIRONMENT 1
//2
#else
//3 _WIN64
#ifdef _WIN64
#define WINDOWS_ENVIRONMENT 1
//3
#else
//4 WIN64
#ifdef WIN64
#define WINDOWS_ENVIRONMENT 1
//4
#else
//5 WINDOWS
#ifdef WINDOWS
#define WINDOWS_ENVIRONMENT 1
//5
#else
//6 __linux__
#ifdef __linux__
#define LINUX_ENVIRONMENT 1
//6
#else
//7 Unknown
#define UNKNOWN_ENVIRONMENT 1
//6
#endif
//5
#endif
//4
#endif
//3
#endif
//2
#endif
//1
#endif
namespace maker
{
#ifdef WINDOWS_ENVIRONMENT
// this file name permits only 128 chars limit
inline void REMOVE_FILE(const char *__FILE_NAME__)
{
char __cmd__[135];
sprintf(__cmd__, "rd %s ", __FILE_NAME__);
system(__cmd__);
}
#define MAKE_DIR(__DIR_NAME__) system("mkdir " __DIR_NAME__)
inline void make_data(const char *__maker_name__)
{
char __cmd__[135];
sprintf(__cmd__, "%s > data.in", __maker_name__);
system(__cmd__);
}
inline double run_code(const char *__runner_name__, const char *__prefix__)
{
char __cmd__[135];
clock_t Begin, End;
sprintf(__cmd__, "%s < data.in > %s.out", __runner_name__, __prefix__);
Begin = clock();
system(__cmd__);
End = clock();
return (double)((End - Begin) / CLOCKS_PER_SEC);
}
inline void run_code(const char *__runner_name__, const char *__prefix__, clock_t &Begin, clock_t &End)
{
char __cmd__[135];
Begin = clock();
sprintf(__cmd__, "%s < data.in > %s.out", __runner_name__, __prefix__);
End = clock();
system(__cmd__);
}
inline void error_copy(int __index__, const char *__file_name__, const char *__error_type__)
{
char __cmd__[145];
sprintf(__cmd__, "copy %s data-%d-%s.in", __file_name__, __index__, __error_type__);
system(__cmd__);
}
#define CMP(ANAME, BNAME) system("fc " ANAME " " BNAME)
#define PAUSE system("pause")
#else
#ifdef LINUX_ENVIRONMENT
#define REMOVE_FILE(__FILE_NAME__) system("rm -f " __FILE_NAME__)
#define MAKE_DIR(__DIR_NAME__) system("mkdir " __DIR_NAME__)
inline void make_data(const char *__maker_name__)
{
char __cmd__[135];
sprintf(__cmd__, "%s > data.in", __maker_name__);
system(__cmd__);
}
inline double run_code(const char *__runner_name__, const char *__prefix__)
{
char __cmd__[135];
clock_t Begin, End;
sprintf(__cmd__, "%s < data.in > %s.out", __runner_name__, __prefix__);
Begin = clock();
system(__cmd__);
End = clock();
return (double)((End - Begin) / CLOCKS_PER_SEC);
}
inline void run_code(const char *__runner_name__, const char *__prefix__, clock_t &Begin, clock_t &End)
{
char __cmd__[135];
Begin = clock();
sprintf(__cmd__, "%s < data.in > %s.out", __runner_name__, __prefix__);
End = clock();
system(__cmd__);
}
inline void error_copy(int __index__, const char *__file_name__, const char *__error_type__)
{
char __cmd__[145];
sprintf(__cmd__, "cp %s data-%d-%s.in", __file_name__, __index__, __error_type__);
system(__cmd__);
}
#endif
#endif
class patcher
{
private:
char __your_name__[512];
char __right_name__[512];
// this should be a exe or msi name
char __maker_name__[512];
double Time_Limit;
public:
patcher()
{
__your_name__[0] = '\0';
__right_name__[0] = '\0';
__maker_name__[0] = '\0';
Time_Limit = 1.00000;
}
void set_a_name(const char *__a_name__)
{
sprintf(__your_name__, "%s", __a_name__);
}
void set_b_name(const char *__b_name__)
{
sprintf(__right_name__, "%s", __b_name__);
}
void set_gen_name(const char *__gen__)
{
sprintf(__maker_name__, "%s", __gen__);
}
void patch_environment(const int &patch_times)
{
char __cmd__[1024];
bool error_type = false;
double COST;
#ifdef WINDOWS_ENVIRONMENT
for (int i = 1; i <= patch_times; i++)
{
MAKE_DIR("patch-WA");
printf("Running %s\n", __maker_name__);
make_data(__maker_name__);
printf("Running %s.\n", __your_name__);
if (COST = run_code(__your_name__, "a") > Time_Limit)
{
puts("A code Time Limit Ecceded.");
error_type = true;
error_copy(i, "data.in", "TLE-A");
}
printf("%s Runned %lf seconds.\n", __your_name__, COST);
printf("Running %s.\n", __right_name__);
if (COST = run_code(__right_name__, "b") > Time_Limit)
{
puts("B code Time Limit Ecceded.");
error_type = true;
error_copy(i, "data.in", "TLE-B");
}
if (CMP("a.out", "b.out"))
{
printf("Probably wrong answer on test %d.\n", i);
error_copy(i, "data.in", "WA");
error_type = true;
}
else
printf("Test %d passed.\n", i);
if (error_type)
{
puts("Copied to dir patch-WA");
error_type = false;
PAUSE;
}
}
#endif
}
}; //namespace patcher
}
// ending
#ifdef LINUX_ENVIRONMENT
#undef LINUX_ENVIRONMENT
#undef MAKE_DIR
#undef REMOVE_FILE
#undef PAUSE
#endif
#ifdef WINDOWS_ENVIRONMENT
#undef WINDOWS_ENVIRONMENT
#undef REMOVE_FILE
#undef MAKE_DIR
#endif
#ifdef UNKNOWN_ENVIRONMENT
#undef UNKNOWN_ENVIRONMENT
#endif
C++
1
https://gitee.com/lcez-oi/Jelly-data-maker.git
git@gitee.com:lcez-oi/Jelly-data-maker.git
lcez-oi
Jelly-data-maker
Jelly data maker
master

搜索帮助