gettc 1.5 → 1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/gettc +45 -29
- data/core/lib/gettc.rb +7 -0
- data/core/lib/{topcoder → gettc}/download.rb +53 -45
- data/core/lib/gettc/generate.rb +145 -0
- data/core/lib/{topcoder → gettc}/parse.rb +104 -102
- data/core/lib/{topcoder → gettc}/print.rb +11 -11
- data/core/lib/{topcoder → gettc}/problem.rb +11 -11
- data/core/lib/{topcoder → gettc}/signature.rb +8 -8
- data/core/lib/{topcoder → gettc}/types.rb +34 -17
- data/core/test/{topcoder → gettc}/download_test.rb +6 -6
- data/core/test/gettc/generate_test.rb +31 -0
- data/core/test/{topcoder → gettc}/parse_test.rb +26 -26
- data/core/test/gettc/signature_test.rb +54 -0
- data/core/test/gettc/types_test.rb +24 -0
- data/dist/config.yml +1 -0
- data/dist/include/cpp/engine.rb +32 -32
- data/dist/include/cpp/topcoder +89 -25
- data/dist/include/haskell/TopCoder.hs +72 -53
- data/dist/include/haskell/engine.rb +49 -47
- data/dist/include/java/TopCoder.jar +0 -0
- data/dist/include/java/engine.rb +71 -71
- data/dist/include/python/engine.rb +46 -0
- data/dist/include/python/topcoder/__init__.py +3 -0
- data/dist/include/python/topcoder/errors.py +4 -0
- data/dist/include/python/topcoder/reader.py +160 -0
- data/dist/include/python/topcoder/writer.py +13 -0
- data/dist/template/bin/runner.sh +16 -6
- data/dist/template/solve/cpp/Makefile +9 -5
- data/dist/template/solve/cpp/{name}.cpp +8 -8
- data/dist/template/solve/cpp/{name}Runner.cpp +8 -8
- data/dist/template/solve/haskell/Makefile +9 -5
- data/dist/template/solve/haskell/{name}.hs +1 -1
- data/dist/template/solve/haskell/{name}Runner.hs +5 -5
- data/dist/template/solve/java/Makefile +18 -0
- data/dist/template/solve/java/build.xml +7 -3
- data/dist/template/solve/java/{name}.java +1 -1
- data/dist/template/solve/java/{name}Runner.java +1 -1
- data/dist/template/solve/python/Makefile +27 -0
- data/dist/template/solve/python/{name}.py +4 -0
- data/dist/template/solve/python/{name}Runner.py +27 -0
- data/dist/template/util/check/Makefile +3 -1
- data/dist/usage +5 -0
- metadata +30 -24
- data/Rakefile +0 -41
- data/core/lib/topcoder.rb +0 -3
- data/core/lib/topcoder/generate.rb +0 -131
- data/core/test/topcoder/generate_test.rb +0 -31
- data/core/test/topcoder/signature_test.rb +0 -52
- data/core/test/topcoder/types_test.rb +0 -24
- data/dist/template/solve/cpp/{name}Test.cpp +0 -8
- data/dist/template/solve/haskell/{name}Test.hs +0 -10
- data/dist/template/solve/java/{name}Test.java +0 -8
@@ -0,0 +1,24 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
require "topcoder/types"
|
3
|
+
include TopCoder
|
4
|
+
|
5
|
+
class TypesTest < Test::Unit::TestCase
|
6
|
+
def test_parse_type
|
7
|
+
assert_raise UnrecognizedType do array = TArray.new 123 end
|
8
|
+
assert_raise UnrecognizedType do type = parse_type "" end
|
9
|
+
assert_raise UnrecognizedType do type = parse_type " " end
|
10
|
+
assert_raise UnrecognizedType do type = parse_type "[]" end
|
11
|
+
assert_raise UnrecognizedType do type = parse_type "vector" end
|
12
|
+
assert_raise UnrecognizedType do type = parse_type "vector[]" end
|
13
|
+
assert_equal TBoolean, parse_type("boolean")
|
14
|
+
assert_equal TInt, parse_type("int")
|
15
|
+
assert_equal TLong, parse_type("long")
|
16
|
+
assert_equal TFloat, parse_type("float")
|
17
|
+
assert_equal TDouble, parse_type("double")
|
18
|
+
assert_equal TChar, parse_type("char")
|
19
|
+
assert_equal TString, parse_type("String")
|
20
|
+
assert_equal TArray.new(TBoolean), parse_type("boolean[]")
|
21
|
+
assert_equal TArray.new(TInt), parse_type("int[]")
|
22
|
+
assert_equal TArray.new(TArray.new(TString)), parse_type("String[][]")
|
23
|
+
end
|
24
|
+
end
|
data/dist/config.yml
CHANGED
data/dist/include/cpp/engine.rb
CHANGED
@@ -1,58 +1,58 @@
|
|
1
|
-
require
|
1
|
+
require "gettc/types"
|
2
2
|
|
3
|
-
module
|
3
|
+
module Gettc
|
4
4
|
class Type
|
5
5
|
def to_cpp
|
6
6
|
if self == TInt then
|
7
|
-
return
|
7
|
+
return "int"
|
8
8
|
elsif self == TLong then
|
9
|
-
return
|
9
|
+
return "int64"
|
10
10
|
elsif self == TFloat then
|
11
|
-
return
|
11
|
+
return "float"
|
12
12
|
elsif self == TDouble then
|
13
|
-
return
|
13
|
+
return "double"
|
14
14
|
elsif self == TChar then
|
15
|
-
return
|
15
|
+
return "char"
|
16
16
|
elsif self == TString then
|
17
|
-
return
|
17
|
+
return "string"
|
18
18
|
elsif self == TBoolean then
|
19
|
-
return
|
19
|
+
return "bool"
|
20
20
|
elsif is_a? TArray then
|
21
|
-
ret =
|
22
|
-
ret <<
|
23
|
-
ret <<
|
21
|
+
ret = "vector<" << subtype.to_cpp
|
22
|
+
ret << " " if subtype.is_a? TArray
|
23
|
+
ret << ">"
|
24
24
|
return ret
|
25
25
|
else
|
26
|
-
return
|
26
|
+
return "unknown"
|
27
27
|
end
|
28
28
|
end
|
29
29
|
def dumb_cpp
|
30
30
|
if self == TInt then
|
31
|
-
return
|
31
|
+
return "0"
|
32
32
|
elsif self == TLong then
|
33
|
-
return
|
33
|
+
return "0"
|
34
34
|
elsif self == TFloat then
|
35
|
-
return
|
35
|
+
return "0"
|
36
36
|
elsif self == TDouble then
|
37
|
-
return
|
37
|
+
return "0"
|
38
38
|
elsif self == TChar then
|
39
|
-
return "
|
39
|
+
return "\"$\""
|
40
40
|
elsif self == TString then
|
41
|
-
return
|
41
|
+
return "\"$\""
|
42
42
|
elsif self == TBoolean then
|
43
|
-
return
|
43
|
+
return "true"
|
44
44
|
elsif is_a? TArray then
|
45
45
|
return "#{to_cpp}()"
|
46
46
|
else
|
47
|
-
return
|
47
|
+
return "Nil"
|
48
48
|
end
|
49
49
|
end
|
50
50
|
end
|
51
51
|
class Signature
|
52
52
|
def to_cpp declaring = false
|
53
53
|
ret = type.to_cpp
|
54
|
-
ret <<
|
55
|
-
ret <<
|
54
|
+
ret << " "
|
55
|
+
ret << "const &" if declaring and type.obj?
|
56
56
|
ret << name
|
57
57
|
return ret
|
58
58
|
end
|
@@ -64,27 +64,27 @@ module TopCoder
|
|
64
64
|
@vars = vars
|
65
65
|
end
|
66
66
|
def declare
|
67
|
-
ret = @func.to_cpp
|
68
|
-
ret <<
|
69
|
-
indent =
|
67
|
+
ret = " " + @func.to_cpp
|
68
|
+
ret << "("
|
69
|
+
indent = " " * ret.size
|
70
70
|
temp = @vars.map do |var| var.to_cpp true end
|
71
71
|
ret << temp.join(",\n#{indent}")
|
72
|
-
ret <<
|
72
|
+
ret << ")"
|
73
73
|
return ret
|
74
74
|
end
|
75
75
|
def input
|
76
76
|
temp = @vars.map do |var|
|
77
77
|
x = var.to_cpp
|
78
|
-
x <<
|
78
|
+
x << "; tc::read(ifs, "
|
79
79
|
x << var.name
|
80
|
-
x <<
|
80
|
+
x << ");"
|
81
81
|
end
|
82
|
-
return temp.join " next(ifs);\n"
|
82
|
+
return temp.join " tc::next(ifs);\n"
|
83
83
|
end
|
84
84
|
def output
|
85
|
-
ret =
|
85
|
+
ret = "tc::show(ofs, solver." << @func.name << "("
|
86
86
|
temp = @vars.map do |var| var.name end
|
87
|
-
ret << temp.join(
|
87
|
+
ret << temp.join(", ") << "));"
|
88
88
|
end
|
89
89
|
end
|
90
90
|
end
|
data/dist/include/cpp/topcoder
CHANGED
@@ -14,8 +14,7 @@ typedef unsigned int uint;
|
|
14
14
|
typedef long long int64;
|
15
15
|
typedef unsigned long long uint64;
|
16
16
|
|
17
|
-
namespace TopCoder
|
18
|
-
{
|
17
|
+
namespace TopCoder {
|
19
18
|
const int _CHUNK_SIZE = 65536;
|
20
19
|
|
21
20
|
class ParseException: public std::exception {
|
@@ -28,27 +27,34 @@ namespace TopCoder
|
|
28
27
|
oss << " (got '" << actual << "')";
|
29
28
|
message = oss.str();
|
30
29
|
}
|
30
|
+
|
31
31
|
public:
|
32
32
|
ParseException() : message("ParseException occurred") {}
|
33
33
|
ParseException(std::string const &message) : message(message) {}
|
34
34
|
~ParseException() throw () {}
|
35
|
-
|
35
|
+
|
36
|
+
virtual const char* what() const throw() {
|
37
|
+
return message.c_str();
|
38
|
+
}
|
36
39
|
|
37
40
|
ParseException(std::string const &required, char actual,
|
38
41
|
std::string const &rest) {
|
39
42
|
buildMessage(required, actual, rest);
|
40
43
|
}
|
44
|
+
|
41
45
|
ParseException(char expected, char actual,
|
42
46
|
std::string const &rest) {
|
43
47
|
std::ostringstream oss;
|
44
48
|
oss << "Expect '" << expected << "'";
|
45
49
|
buildMessage(oss.str(), actual, rest);
|
46
50
|
}
|
51
|
+
|
47
52
|
ParseException(std::string const &required, std::string const &rest) {
|
48
53
|
std::ostringstream oss;
|
49
54
|
oss << required << " at: <" << rest << ">";
|
50
55
|
message = oss.str();
|
51
56
|
}
|
57
|
+
|
52
58
|
ParseException(char expected) {
|
53
59
|
std::ostringstream oss;
|
54
60
|
oss << "Expect '" << expected << " before end of stream";
|
@@ -65,6 +71,7 @@ namespace TopCoder
|
|
65
71
|
}
|
66
72
|
return oss.str();
|
67
73
|
}
|
74
|
+
|
68
75
|
void _spaces(std::istream &is) {
|
69
76
|
while (is.good()) {
|
70
77
|
int i = is.peek();
|
@@ -72,43 +79,69 @@ namespace TopCoder
|
|
72
79
|
else break;
|
73
80
|
}
|
74
81
|
}
|
82
|
+
|
75
83
|
void _expect(std::istream &is, char expected) {
|
76
84
|
_spaces(is); char actual = is.peek();
|
77
85
|
if (expected != actual)
|
78
86
|
throw ParseException(expected, actual, _rest(is));
|
79
87
|
is.ignore(1);
|
80
88
|
}
|
89
|
+
|
81
90
|
void next(std::istream &is) {
|
82
91
|
_expect(is, ',');
|
83
92
|
}
|
84
93
|
|
85
|
-
void read(std::istream &is, int &i) {
|
86
|
-
|
87
|
-
|
88
|
-
|
94
|
+
void read(std::istream &is, int &i) {
|
95
|
+
is >> i;
|
96
|
+
}
|
97
|
+
|
98
|
+
void read(std::istream &is, int64 &l) {
|
99
|
+
is >> l;
|
100
|
+
}
|
101
|
+
|
102
|
+
void read(std::istream &is, float &f) {
|
103
|
+
is >> f;
|
104
|
+
}
|
105
|
+
|
106
|
+
void read(std::istream &is, double &d) {
|
107
|
+
is >> d;
|
108
|
+
}
|
109
|
+
|
89
110
|
void read(std::istream &is, char &c) {
|
90
111
|
_expect(is, '\'');
|
91
112
|
is.get(c);
|
92
|
-
if (c == '\'')
|
93
|
-
|
113
|
+
if (c == '\'') {
|
114
|
+
c = 0;
|
115
|
+
} else {
|
116
|
+
_expect(is, '\'');
|
117
|
+
}
|
94
118
|
}
|
119
|
+
|
95
120
|
void read(std::istream &is, std::string &s) {
|
96
121
|
_expect(is, '"');
|
97
122
|
std::ostringstream oss;
|
98
123
|
while (is.good()) {
|
99
124
|
char c; is.get(c);
|
100
|
-
if (c == '
|
125
|
+
if (c == '"') {
|
126
|
+
std::streampos pos = is.tellg();
|
127
|
+
_spaces(is);
|
128
|
+
if (is.eof()) {
|
129
|
+
s = oss.str();
|
130
|
+
return;
|
131
|
+
}
|
101
132
|
char cc; is.get(cc);
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
133
|
+
if (cc == ',' || cc == ']') {
|
134
|
+
s = oss.str();
|
135
|
+
is.unget();
|
136
|
+
return;
|
137
|
+
}
|
138
|
+
is.seekg(pos);
|
107
139
|
}
|
108
|
-
|
140
|
+
oss << c;
|
109
141
|
}
|
110
142
|
throw ParseException('"');
|
111
143
|
}
|
144
|
+
|
112
145
|
void read(std::istream &is, bool &b) {
|
113
146
|
_spaces(is);
|
114
147
|
std::ostringstream oss;
|
@@ -130,6 +163,7 @@ namespace TopCoder
|
|
130
163
|
throw ParseException("Expect a boolean value (true or false)", _rest(is));
|
131
164
|
}
|
132
165
|
}
|
166
|
+
|
133
167
|
template <typename T>
|
134
168
|
void read(std::istream &is, std::vector<T> &v) {
|
135
169
|
v.clear();
|
@@ -143,59 +177,89 @@ namespace TopCoder
|
|
143
177
|
while (is.good()) {
|
144
178
|
T e; read(is, e); v.push_back(e);
|
145
179
|
_spaces(is); char c; is.get(c);
|
146
|
-
if (c == ']')
|
147
|
-
|
180
|
+
if (c == ']') {
|
181
|
+
return;
|
182
|
+
}
|
183
|
+
if (c != ',') {
|
148
184
|
throw ParseException("Expect ',' or ']'", c, _rest(is));
|
185
|
+
}
|
149
186
|
}
|
150
187
|
throw ParseException(']');
|
151
188
|
}
|
152
189
|
|
153
|
-
void show(std::ostream &os, int i) {
|
154
|
-
|
190
|
+
void show(std::ostream &os, int i) {
|
191
|
+
os << i;
|
192
|
+
}
|
193
|
+
|
194
|
+
void show(std::ostream &os, int64 l) {
|
195
|
+
os << l;
|
196
|
+
}
|
197
|
+
|
155
198
|
void show(std::ostream &os, float f) {
|
156
199
|
os.precision(8);
|
157
200
|
os << f;
|
158
201
|
}
|
202
|
+
|
159
203
|
void show(std::ostream &os, double d) {
|
160
204
|
os.precision(16);
|
161
205
|
os << d;
|
162
206
|
}
|
207
|
+
|
163
208
|
void show(std::ostream &os, char c) {
|
164
209
|
os << '\'' << c << '\'';
|
165
210
|
}
|
211
|
+
|
166
212
|
void show(std::ostream &os, std::string const &s) {
|
167
213
|
os << '"' << s << '"';
|
168
214
|
}
|
215
|
+
|
169
216
|
void show(std::ostream &os, bool b) {
|
170
217
|
os << (b ? "true" : "false");
|
171
218
|
}
|
219
|
+
|
172
220
|
template <typename T>
|
173
221
|
void show(std::ostream &os, std::vector<T> const &v) {
|
174
222
|
typedef typename std::vector<T>::const_iterator Iterator;
|
175
223
|
bool first = true;
|
176
224
|
os << '[';
|
177
225
|
for (Iterator it = v.begin(); it != v.end(); ++it) {
|
178
|
-
if (!first)
|
226
|
+
if (!first) {
|
227
|
+
os << ',';
|
228
|
+
}
|
179
229
|
show(os, *it);
|
180
230
|
first = false;
|
181
231
|
}
|
182
232
|
os << ']';
|
183
233
|
}
|
184
234
|
|
185
|
-
bool same(int i, int j) {
|
186
|
-
|
187
|
-
|
188
|
-
|
235
|
+
bool same(int i, int j) {
|
236
|
+
return i == j;
|
237
|
+
}
|
238
|
+
|
239
|
+
bool same(int64 i, int64 j) {
|
240
|
+
return i == j;
|
241
|
+
}
|
242
|
+
|
243
|
+
bool same(char i, char j) {
|
244
|
+
return i == j;
|
245
|
+
}
|
246
|
+
|
247
|
+
bool same(std::string const &x, std::string const &y) {
|
248
|
+
return x == y;
|
249
|
+
}
|
250
|
+
|
189
251
|
bool same(float x, float y) {
|
190
252
|
float p = x * (1.0 - 1e-5);
|
191
253
|
float q = x * (1.0 + 1e-5);
|
192
254
|
return y >= std::min(p, q) && y <= std::max(p, q);
|
193
255
|
}
|
256
|
+
|
194
257
|
bool same(double x, double y) {
|
195
258
|
double p = x * (1.0 - 1e-9);
|
196
259
|
double q = x * (1.0 + 1e-9);
|
197
260
|
return y >= std::min(p, q) && y <= std::max(p, q);
|
198
261
|
}
|
262
|
+
|
199
263
|
template <typename T>
|
200
264
|
bool same(std::vector<T> const &v1, std::vector<T> const &v2) {
|
201
265
|
typedef typename std::vector<T>::const_iterator Iterator;
|
@@ -16,67 +16,86 @@ import Text.Parsec
|
|
16
16
|
import Text.Parsec.String (Parser)
|
17
17
|
import Text.Parsec.Token
|
18
18
|
import Data.Char
|
19
|
+
import Data.Maybe
|
20
|
+
|
19
21
|
|
20
22
|
next :: Parser ()
|
21
|
-
next = do
|
22
|
-
|
23
|
+
next = do
|
24
|
+
char ','
|
25
|
+
return ()
|
23
26
|
|
24
|
-
parseChar :: Parser Char
|
25
|
-
parseChar = do char '\''
|
26
|
-
ret <- anyChar
|
27
|
-
char '\''
|
28
|
-
return ret
|
29
27
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
28
|
+
parseChar :: Parser Char
|
29
|
+
parseChar = do
|
30
|
+
char '\''
|
31
|
+
ret <- anyChar
|
32
|
+
char '\''
|
33
|
+
return ret
|
35
34
|
|
36
35
|
parseBool :: Parser Bool
|
37
|
-
parseBool = do
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
parseDouble :: Parser Double
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
36
|
+
parseBool = do
|
37
|
+
s <- many1 letter
|
38
|
+
case map toLower s of
|
39
|
+
"true" -> return True
|
40
|
+
"false" -> return False
|
41
|
+
otherwise -> fail "expect true or false"
|
42
|
+
|
43
|
+
|
44
|
+
maybeNegative :: Num a => Parser a -> Parser a
|
45
|
+
maybeNegative parser = (do
|
46
|
+
char '-'
|
47
|
+
n <- parser
|
48
|
+
return (-n)) <|> parser
|
49
|
+
|
50
|
+
parseIntegral :: (Integral a, Read a) => Parser a
|
51
|
+
parseIntegral = maybeNegative ((many1 digit) >>= (return . read))
|
52
|
+
|
53
|
+
parseInt = parseIntegral :: Parser Int
|
54
|
+
parseLong = parseIntegral :: Parser Integer
|
55
|
+
|
56
|
+
parseReal :: (RealFloat a, Read a) => Parser a
|
57
|
+
parseReal = maybeNegative ((many1 (digit <|> char '.')) >>= (return . read))
|
58
|
+
|
59
|
+
parseFloat = parseReal :: Parser Float
|
60
|
+
parseDouble = parseReal :: Parser Double
|
61
|
+
|
62
|
+
|
63
|
+
|
64
|
+
expect :: Char -> Parser ()
|
65
|
+
expect c = do
|
66
|
+
cc <- optionMaybe (char c)
|
67
|
+
if (isJust cc)
|
68
|
+
then return ()
|
69
|
+
else fail "disappointing"
|
70
|
+
|
71
|
+
parseClosingQuote :: Parser Char
|
72
|
+
parseClosingQuote = do
|
73
|
+
char '"' >> spaces
|
74
|
+
choice [eof, expect ',', expect ']']
|
75
|
+
return '"'
|
76
|
+
|
77
|
+
parseString :: Parser String
|
78
|
+
parseString = do
|
79
|
+
char '"'
|
80
|
+
ret <- manyTill anyChar (try (lookAhead parseClosingQuote))
|
81
|
+
char '"'
|
82
|
+
return ret
|
67
83
|
|
68
84
|
|
69
85
|
parseElems :: Read a => Parser a -> Parser [a]
|
70
|
-
parseElems
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
86
|
+
parseElems parser = (do
|
87
|
+
spaces
|
88
|
+
x <- parser
|
89
|
+
spaces
|
90
|
+
(do
|
91
|
+
next
|
92
|
+
xs <- parseElems parser
|
93
|
+
return (x:xs)) <|> return [x]) <|> return []
|
94
|
+
|
77
95
|
|
78
96
|
parseList :: Read a => Parser a -> Parser [a]
|
79
|
-
parseList
|
80
|
-
|
81
|
-
|
82
|
-
|
97
|
+
parseList parser = do
|
98
|
+
spaces >> char '[' >> spaces
|
99
|
+
xs <- parseElems parser
|
100
|
+
spaces >> char ']'
|
101
|
+
return xs
|