123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- /**
- * 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=%u]", trim(elems).c_str(), (unsigned 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);
- }
|