mirror of
https://github.com/renbaoshuo/S2OJ.git
synced 2024-11-27 03:36:20 +00:00
125 lines
2.8 KiB
C++
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);
|
||
|
}
|