2008-12-04TZTester をどうにかするブーム
nitoyonさん,cafelierさんの改造を参考にしつつ
というかcafelier版をベースに改造
- 実行時間を計測して表示
Test Case #0...PASSED (0.201 msec) Test Case #1...PASSED (0.04 msec) Test Case #2...FAILED (0.001 msec) Expected: "728" Received: "-1073744361" Test Case #3...FAILED (0.002 msec) Expected: "240249781" Received: "-1073744409"
- 返り値がdoubleの場合、期待値との差分が1e-9未満かどうかのチェックに差し替える
cafelier版とのdiff:
--- CFLCustom-TZTester.java 2008-12-04 04:01:21.000000000 +0900
+++ tangentz/TZTester.java 2008-12-04 05:51:06.000000000 +0900
@@ -32,7 +32,7 @@
private static final String k_PROBLEM = "$PROBLEM$";
private static final String k_RUNTEST = "$RUNTEST$";
private static final String k_TESTCODE = "$TESTCODE$";
- private static final String k_VERSION = "\n// Powered by TZTester 1.01 [25-Feb-2003] customized by cafelier";
+ private static final String k_VERSION = "\n// Powered by TZTester 1.01 [25-Feb-2003] customized by cafelier, timer support by naoya_t";
// Cut tags
private static final String k_BEGINCUT = "// BEGIN CUT HERE\n";
@@ -154,6 +154,13 @@
TestCase[] Cases = m_Problem.getTestCases();
StringBuffer Code = new StringBuffer();
+ // <<modified by naoya_t>> : timer
+ Code.append("#include <time.h>\n");
+ Code.append("clock_t start_time;\n");
+ Code.append("void timer_clear() { start_time = clock(); }\n");
+ Code.append("string timer() { clock_t end_time = clock(); double interval = (double)(end_time - start_time)/CLOCKS_PER_SEC; ostringstream os; os << \" (\" << interval*1000 << \" msec)\"; return os.str(); }\n");
+ Code.append("\n");
+
// <<modified by cafelier>> : new test code template
// Generate the vector output function
@@ -227,8 +234,13 @@
Code.append("cerr << \"Test Case #\" << Case << \"...\"; ");
*/
// Print "PASSED" or "FAILED" based on the result
- Code.append("if (Expected == Received) cerr << \"PASSED\" << endl; ");
- Code.append("else { cerr << \"FAILED\" << endl; ");
+ if (TypeString.equals("double")) {
+ Code.append("double diff = Expected - Received; if (diff < 0) diff = -diff; ");
+ Code.append("if (diff < 1e-9) cerr << \"PASSED\" << timer() << endl; ");
+ } else {
+ Code.append("if (Expected == Received) cerr << \"PASSED\" << timer() << endl; ");
+ }
+ Code.append("else { cerr << \"FAILED\" << timer() << endl; ");
if (ReturnType.getDimension() == 0)
{
@@ -264,6 +276,7 @@
// <<modified by cafelier>> : new test code template
Code.append("int Test_(Case_<" + Index + ">) {\n");
+ Code.append("\ttimer_clear();\n");
// Generate each input variable separately
for (I = 0; I < Inputs.length; ++I) {
Code.append("\t");
FileEdit の CodeTemplate はこんな感じ:
$BEGINCUT$
/*
$PROBLEMDESC$
*/
$ENDCUT$
#line $NEXTLINENUMBER$ "$FILENAME$"
#include <string>
#include <vector>
#include <set>
#include <map>
#include <list>
#include <queue>
#include <algorithm>
$BEGINCUT$
#include <iostream>
#include "cout.h"
$ENDCUT$
#include <sstream>
#include <cmath>
using namespace std;
#define sz(a) int((a).size())
#define pb push_back
#define all(c) (c).begin(),(c).end()
#define tr(c,i) for(typeof((c).begin()) i=(c).begin(); i!=(c).end(); i++)
#define rep(var,n) for(int var=0;var<(n);var++)
#define found(s,e) ((s).find(e)!=(s).end())
#define remove_(c,val) (c).erase(remove((c).begin(),(c).end(),(val)),(c).end())
class $CLASSNAME$ {
public:
$RC$ $METHODNAME$($METHODPARMS$) {
}
};
$TESTCODE$
cout.h - デバッグ時にcoutに色々放り込むために
library | |
![]()
#include <iostream>
#include <string>
#include <vector>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <map>
#include <set>
using namespace std;
ostream& operator<<(ostream &s, vector<string> v)
{
int cnt = v.size();
s << "[ ";
for (int i=0; i<cnt; i++) {
if (i > 0) s << ", ";
s << '"' << v[i] << '"';
}
return s << " ] // " << cnt << " item" << (cnt >= 2 ? "s" : "");
}
template <typename T> ostream& operator<<(ostream &s, vector<T> v)
{
int cnt = v.size();
s << "[ ";
for (int i=0; i<cnt; i++) {
if (i > 0) s << ", ";
s << v[i];
}
return s << " ] // " << cnt << " item" << (cnt >= 2 ? "s" : "");
}
template <typename T> ostream& operator<<(ostream &s, list<T> ls)
{
int cnt = 0;
s << "( ";
for (typeof(ls.begin()) it=it.begin(); it!=it.end(); it++) {
if (it != it.begin()) s << ", ";
s << *it;
cnt++;
}
return s << " ) // " << cnt << " item" << (cnt >= 2 ? "s" : "");
}
template <typename T> ostream& operator<<(ostream &s, deque<T> st)
{
int cnt = st.size();
s << "[ ";
for (typeof(st.begin()) it=st.begin(); it!=st.end(); it++) {
if (it != st.begin()) s << ", ";
s << *it;
}
return s << " ] // " << cnt << " item" << (cnt >= 2 ? "s" : "");
}
template <typename T1, typename T2> ostream& operator<<(ostream &s, map<T1,T2> m)
{
int cnt = m.size();
s << "{ ";
for (typeof(m.begin()) it=m.begin(); it!=m.end(); it++) {
if (it != m.begin()) s << ", ";
s << it->first << " => " << it->second;
}
return s << " } // " << cnt << " item" << (cnt >= 2 ? "s" : "");
}
template <typename T> ostream& operator<<(ostream &s, set<T> st)
{
int cnt = st.size();
s << "[ ";
for (typeof(st.begin()) it=st.begin(); it!=st.end(); it++) {
if (it != st.begin()) s << ", ";
s << *it;
}
return s << " ] // " << cnt << " item" << (cnt >= 2 ? "s" : "");
}
template <typename T1, typename T2> ostream& operator<<(ostream &s, pair<T1,T2> p)
{
return s << "(" << p.first << "," << p.second << ")";
}
コメント
トラックバック - https://topcoder-g-hatena-ne-jp.jag-icpc.org/n4_t/20081204