Автор |
Сообщение |
11.02.2024 13:45:19
Тема: Чекер на С++
|
Михаил Долинский
Темы: 1984
Сообщений: 47252
Мой профиль
|
http://dl.gsu.by/doc/use/programmers_task.htm
В случае неоднозначного ответа или необходимости оценки неполного решения, кроме перечисленного выше, необходима специальная программа - чекер, которая должна оценивать правильность или некоторое приближение к оптимальному решению. Она будет запускаться для каждого теста с параметрами:
checker.exe <входной файл> <правильный выходной файл> <выходной файл участника> <максимальное количество баллов за тест>
Чтобы для проверки использовался чекер необходимо внести нужную запись в task.cfg.
После выполнения чекера в первой строке файла "$result$.txt" должно быть количество баллов за тест, во второй желательно указать комментарии.
Пример:
запуск checker.exe 1.in 1.out output.txt 100
После чего файл "$result$.txt" содержит следующее:
0
Wrong answer.
#include <fstream>
#include <string>
#include <cstring>
#include <iostream>
#define F(i,n) for (int i=0;i<(int)n;i++)
using namespace std;
ifstream in,ro,uo;
ofstream res;
char score[256];
int a[30][30];
void term() {
in.close();
ro.close();
uo.close();
res.close();
exit(0);
}
void bad(const char *msg) {
res<<"0\n"<<msg;
term();
}
void OK() {
res<<score;
term();
}
string s1,s2;
int n;
int f(int x,int y,int c) {
if (a[x][y]!=c) return 0;
a[x][y]=0;
return f(x,y-1,c)+f(x,y+1,c)+f(x+((x+y)%2==n%2?-1:1),y,c)+1;
}
int main(int argc,char** argv) {
if (argc!=5) return -1;
in.open(argv[1]);
ro.open(argv[2]);
uo.open(argv[3]);
res.open("$result$.txt");
strcpy(score,argv[4]);
ro>>s1; uo>>s2;
if (s1!=s2) {
if (s1=="nemoguce") bad("Answer doesn't exist but user's output isn't \"nemoguce\"");
if (s2=="nemoguce") bad("Answer exists but user's output is \"nemoguce\"");
} else if (s1=="nemoguce") OK();
uo.seekg(0);
in>>n;
F(i,30) F(j,30) a[i][j]=0;
F(i,n*2) {
in>>s1; uo>>s2;
if (s1.size()!=s2.size()) bad("Incorrect output format: wrong line length");
F(j,s1.size()) {
if (s1[j]=='.') {
if (s2[j]!='.')
bad("Incorrect output format: point expected, something else found");
}
if (s1[j]=='0') {
if (s2[j]>='1'&&s2[j]<='6')
a[i+1][j+1+max(i-n,n-i-1)]=s2[j]-'0';
else
bad("Incorrect output format: digit from interval 1..6 expected, something else found");
}
}
}
//F(i,30) {F(j,30) cerr<<a[i][j]; cerr<<endl;}
F(i,30) F(j,30) if (a[i][j])
if (f(i,j,a[i][j])!=3) bad("Wrong segment size");
OK();
}
|
11.02.2024 14:30:58
Тема: Re:Чекер на С++
|
Кирилл Кардаш
Темы: 1
Сообщений: 14
Мой профиль
|
https://dl.gsu.by/task.jsp?nid=2280208&cid=1322
#include <fstream>
#include <string>
#include <cstring>
#include <iostream>
#include <math.h>
#define F(i,n) for (int i=0;i<(int)n;i++)
using namespace std;
ifstream in,ro,uo;
ofstream res;
char score[256];
int a[30][30];
void term() {
in.close();
ro.close();
uo.close();
res.close();
exit(0);
}
void bad(const char *msg) {
res<<"0\n"<<msg;
term();
}
void OK() {
res<<score;
term();
}
bool doubleCompare(long double expected, long double result, long double MAX_DOUBLE_ERROR) {
MAX_DOUBLE_ERROR += 1E-15;
if (fabsl(result - expected) <= MAX_DOUBLE_ERROR) {
return true;
} else {
double minv = min(expected * (1.0l - MAX_DOUBLE_ERROR),
expected * (1.0l + MAX_DOUBLE_ERROR));
double maxv = max(expected * (1.0l - MAX_DOUBLE_ERROR),
expected * (1.0l + MAX_DOUBLE_ERROR));
return result >= minv && result <= maxv;
}
}
string s1, s2;
int main(int argc,char** argv) {
if (argc!=5) return -1;
in.open(argv[1]);
ro.open(argv[2]);
uo.open(argv[3]);
res.open("$result$.txt");
strcpy(score,argv[4]);
ro>>s1;
if (uo.peek() == EOF) bad("Real number expected, nothing found");
uo>>s2;
errno = 0;
long double x = stold(s2);
if (errno != 0) bad("Real number expected, something else found");
long double y = stold(s1);
if (!doubleCompare(x, y, 1e-6)) bad("Wrong answer");
OK();
}
______________________
Наконец-то красный | 2437
|
03.03.2024 15:48:46
Тема: Re:Чекер на С++
|
Кирилл Кардаш
Темы: 1
Сообщений: 14
Мой профиль
|
https://dl.gsu.by/task.jsp?nid=2362684&cid=1349
#include <fstream>
#include <string>
#include <cstring>
#include <iostream>
#include <math.h>
#include <vector>
#include <queue>
using namespace std;
ifstream in,ro,uo;
ofstream res;
char score[256];
void term() {
in.close();
ro.close();
uo.close();
res.close();
exit(0);
}
int mn = 0;
void bad(const char *msg) {
res<<mn<<'\n'<<msg;
term();
}
void OK() {
res<<score;
term();
}
long long readint() {
if (uo.peek() == EOF) bad("Integer expected, nothing found");
string sval; uo >> sval;
long long val = -1;
try {
val = stoll(sval);
} catch (exception const &ex) {
bad("Integer expected, something else found");
}
return val;
}
const int N = 310000;
const int LOGN = 20;
int n, m, a[N], b[N], dep[N], par[N], jmp[N][LOGN];
bool vv[N];
vector<int> g[N];
int dist(int u, int v) {
if (dep[u] < dep[v])
swap(u, v);
int ans = 0;
for (int k = LOGN - 1; k >= 0; k--)
if (dep[u] - (1 << k) >= dep[v]) {
ans += (1 << k);
u = jmp[u][k];
}
for (int k = LOGN - 1; k >= 0; k--)
if (jmp[u][k] != jmp[v][k]) {
ans += (2 << k);
u = jmp[u][k];
v = jmp[v][k];
}
if (u != v) ans += 2;
return ans;
}
vector<int> p1, p2;
int main(int argc,char** argv) {
if (argc!=5) return -1;
in.open(argv[1]);
ro.open(argv[2]);
uo.open(argv[3]);
res.open("$result$.txt");
strcpy(score,argv[4]);
in >> n >> m;
for (int i = 1; i <= m; i++)
in >> a[i];
for (int i = 1; i <= m; i++)
in >> b[i];
for (int i = 1; i <= n - 1; i++) {
int u, v; in >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
long long rans; ro >> rans;
long long uans = readint();
if (uans != rans) bad("Time is wrong");
mn = atoi(score) / 10 * 3;
for (int i = 1; i <= m + m; i++) {
int cur = readint();
if (cur < 1 || cur > m) bad("Invalid route");
if (i % 2 == 1) p1.push_back(cur);
else p2.push_back(cur);
}
for (int i = 1; i <= m; i++)
vv[i] = false;
for (int x : p1) {
if (vv[x]) bad("Invalid route");
vv[x] = true;
}
for (int i = 1; i <= m; i++)
vv[i] = false;
for (int x : p2) {
if (vv[x]) bad("Invalid route");
vv[x] = true;
}
vector<int> path;
path.push_back(1);
for (int i = 0; i < m; i++) {
path.push_back(a[p1[i]]);
path.push_back(b[p2[i]]);
}
path.push_back(1);
par[1] = -1;
queue<int> qq;
qq.push(1);
while (!qq.empty()) {
int v = qq.front(); qq.pop();
int p = par[v];
dep[v] = (p == -1 ? 0 : dep[p] + 1);
jmp[v][0] = (p == -1 ? v : p);
for (int k = 1; k < LOGN; k++)
jmp[v][k] = jmp[jmp[v][k - 1]][k - 1];
for (int u : g[v]) if (u != par[v]) {
par[u] = v;
qq.push(u);
}
}
long long real_dist = 0;
for (int i = 0; i + 1 < (int) path.size(); i++)
real_dist += dist(path[i], path[i + 1]);
if (real_dist != rans) bad("Invalid route");
OK();
}
______________________
Наконец-то красный | 2437
|
03.03.2024 16:14:40
Тема: Re:Чекер на С++
|
Кирилл Кардаш
Темы: 1
Сообщений: 14
Мой профиль
|
https://dl.gsu.by/task.jsp?nid=2362684&cid=1349
В задаче требуется вывести ответ и способ его получить. В случае, если программа выводит только ответ без способа, она должна оцениваться в 30% баллов. Возможно ли это реализовать?
______________________
Наконец-то красный | 2437
|
|
|