S2OJ/judger/uoj_judger/builtin/checker/casencmp.cpp
Masco Skray 96d4a3ecf7 style(judger,web): move code out from subfolder "1"
Due to historical reasons, the code is in subfolder "1".
With SVN removal, we place the code back and remove the annoying "1" folder.
2019-06-14 23:34:41 +08:00

125 lines
2.8 KiB
C++

/**
* Checker to compare output and answer in the form:
*
* Case 1: <number> <number> <number> ... <number>
* Case 2: <number> <number> <number> ... <number>
* ...
* Case n: <number> <number> <number> ... <number>
*
*/
#include "testlib.h"
#include <iostream>
#include <sstream>
#include <fstream>
#include <iomanip>
#include <string>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <ctime>
#include <climits>
#include <cassert>
#include <vector>
#include <queue>
#include <stack>
#include <deque>
#include <set>
#include <map>
#include <bitset>
#include <utility>
#include <algorithm>
using namespace std;
#define forn(i, n) for (int i = 0; i < int(n); i++)
string token;
vector<long long> readStreamCase(InStream& in, TResult pe, int testCase, bool& prereadCase)
{
if (!prereadCase)
{
string caseStr = in.readToken();
if (caseStr != "Case")
quitf(pe, "Expected 'Case' but found '%s' [test case %d]", compress(caseStr).c_str(), testCase);
}
string numExpStr;
stringstream ss;
ss << testCase;
ss >> numExpStr;
numExpStr += ":";
string numStr = in.readToken();
if (numExpStr != numStr)
quitf(pe, "Expected '%s' but found '%s' [test case %d]", compress(numExpStr).c_str(), compress(numStr).c_str(), testCase);
vector<long long> result;
while (!in.seekEof())
{
in.readTokenTo(token);
if (token == "Case")
{
prereadCase = true;
break;
}
result.push_back(stringToLongLong(in, token.c_str()));
}
return result;
}
string longLongsToString(const vector<long long>& a)
{
if (a.empty())
return "\"\" [size=0]";
string elems;
if (a.size() <= 5)
{
forn(i, a.size())
elems += vtos(a[i]) + " ";
}
else
{
forn(i, 3)
elems += vtos(a[i]) + " ";
elems += "... ";
forn(i, 2)
elems += vtos(a[a.size() - 2 + i]) + " ";
}
return format("\"%s\" [size=%d]", trim(elems).c_str(), (int)a.size());
}
int main(int argc, char* argv[])
{
setName("Many int64s checker with testcase-support");
registerTestlibCmd(argc, argv);
int testCase = 0;
bool ansPrereadCase = false;
bool oufPrereadCase = false;
while (!ans.seekEof())
{
testCase++;
vector<long long> ja = readStreamCase(ans, _fail, testCase, ansPrereadCase);
vector<long long> pa = readStreamCase(ouf, _pe, testCase, oufPrereadCase);
if (ja != pa)
{
string js = longLongsToString(ja);
string ps = longLongsToString(pa);
quitf(_wa, "Sequences differ: jury has %s, but participant has %s [test case %d]", js.c_str(), ps.c_str(), testCase);
}
}
quitf(_ok, "%d test cases(s)", testCase);
}