gettc 1.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Rakefile +41 -0
- data/bin/gettc +63 -0
- data/core/lib/topcoder.rb +3 -0
- data/core/lib/topcoder/download.rb +89 -0
- data/core/lib/topcoder/generate.rb +131 -0
- data/core/lib/topcoder/parse.rb +231 -0
- data/core/lib/topcoder/print.rb +56 -0
- data/core/lib/topcoder/problem.rb +33 -0
- data/core/lib/topcoder/signature.rb +55 -0
- data/core/lib/topcoder/types.rb +62 -0
- data/core/test/topcoder/download_test.rb +29 -0
- data/core/test/topcoder/generate_test.rb +31 -0
- data/core/test/topcoder/parse_test.rb +104 -0
- data/core/test/topcoder/signature_test.rb +52 -0
- data/core/test/topcoder/types_test.rb +24 -0
- data/dist/config.yml +2 -0
- data/dist/include/cpp/engine.rb +90 -0
- data/dist/include/cpp/topcoder +212 -0
- data/dist/include/haskell/TopCoder.hs +82 -0
- data/dist/include/haskell/engine.rb +122 -0
- data/dist/include/java/TopCoder.jar +0 -0
- data/dist/include/java/engine.rb +207 -0
- data/dist/template/bin/runner.sh +113 -0
- data/dist/template/data/demo/{examples_d} +0 -0
- data/dist/template/data/sys/{systests_d} +0 -0
- data/dist/template/prob/images/{images_d} +0 -0
- data/dist/template/prob/{name}.html +8 -0
- data/dist/template/prob/{name}.md +1 -0
- data/dist/template/solve/cpp/Makefile +30 -0
- data/dist/template/solve/cpp/{name}.cpp +11 -0
- data/dist/template/solve/cpp/{name}Runner.cpp +26 -0
- data/dist/template/solve/cpp/{name}Test.cpp +8 -0
- data/dist/template/solve/haskell/Makefile +30 -0
- data/dist/template/solve/haskell/{name}.hs +7 -0
- data/dist/template/solve/haskell/{name}Runner.hs +27 -0
- data/dist/template/solve/haskell/{name}Test.hs +10 -0
- data/dist/template/solve/java/build.xml +78 -0
- data/dist/template/solve/java/{name}.java +9 -0
- data/dist/template/solve/java/{name}Runner.java +32 -0
- data/dist/template/solve/java/{name}Test.java +8 -0
- data/dist/template/util/check/Makefile +5 -0
- data/dist/template/util/check/check.cpp +26 -0
- metadata +121 -0
Binary file
|
@@ -0,0 +1,207 @@
|
|
1
|
+
require 'topcoder/types'
|
2
|
+
|
3
|
+
module TopCoder
|
4
|
+
class Type
|
5
|
+
def to_java
|
6
|
+
if self == TInt then
|
7
|
+
return 'int'
|
8
|
+
elsif self == TLong then
|
9
|
+
return 'long'
|
10
|
+
elsif self == TFloat then
|
11
|
+
return 'float'
|
12
|
+
elsif self == TDouble then
|
13
|
+
return 'double'
|
14
|
+
elsif self == TChar then
|
15
|
+
return 'char'
|
16
|
+
elsif self == TString then
|
17
|
+
return 'String'
|
18
|
+
elsif self == TBoolean then
|
19
|
+
return 'boolean'
|
20
|
+
elsif is_a? TArray then
|
21
|
+
return "#{subtype.to_java}[]"
|
22
|
+
else
|
23
|
+
return 'unknown'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
def to_java_boxed
|
27
|
+
if self == TInt then
|
28
|
+
return 'Integer'
|
29
|
+
elsif self == TLong then
|
30
|
+
return 'Long'
|
31
|
+
elsif self == TFloat then
|
32
|
+
return 'Float'
|
33
|
+
elsif self == TDouble then
|
34
|
+
return 'Double'
|
35
|
+
elsif self == TChar then
|
36
|
+
return 'Character'
|
37
|
+
elsif self == TString then
|
38
|
+
return 'String'
|
39
|
+
elsif self == TBoolean then
|
40
|
+
return 'Boolean'
|
41
|
+
elsif self.is_a? TArray then
|
42
|
+
return "List<#{subtype.to_java_boxed}>"
|
43
|
+
else
|
44
|
+
return 'Unknown'
|
45
|
+
end
|
46
|
+
end
|
47
|
+
def dumb_java
|
48
|
+
if self == TInt then
|
49
|
+
return '0'
|
50
|
+
elsif self == TLong then
|
51
|
+
return '0'
|
52
|
+
elsif self == TFloat then
|
53
|
+
return '0'
|
54
|
+
elsif self == TDouble then
|
55
|
+
return '0'
|
56
|
+
elsif self == TChar then
|
57
|
+
return "'$'"
|
58
|
+
elsif self == TString then
|
59
|
+
return '"$"'
|
60
|
+
elsif self == TBoolean then
|
61
|
+
return 'true'
|
62
|
+
elsif self.is_a? TArray then
|
63
|
+
return "new #{subtype.to_java}[1]"
|
64
|
+
else
|
65
|
+
return 'Nil'
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
class Signature
|
70
|
+
def to_java
|
71
|
+
return "#{type.to_java} #{name}"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
class JavaArray
|
75
|
+
def self.get_depth type
|
76
|
+
return 0 if not type.is_a? TArray
|
77
|
+
return 1 + get_depth(type.subtype)
|
78
|
+
end
|
79
|
+
def self.get_elem_type type
|
80
|
+
return type if not type.is_a? TArray
|
81
|
+
return get_elem_type type.subtype
|
82
|
+
end
|
83
|
+
attr_accessor :name, :boxed_name, :type, :boxed_type
|
84
|
+
def initialize sig
|
85
|
+
@sig = sig
|
86
|
+
@name = sig.name
|
87
|
+
@boxed_name = "#{@name}Boxed"
|
88
|
+
@type = sig.type.to_java
|
89
|
+
@boxed_type = sig.type.to_java_boxed
|
90
|
+
@depth = self.class.get_depth sig.type
|
91
|
+
@elem_type = self.class.get_elem_type(sig.type).to_java
|
92
|
+
end
|
93
|
+
def unbox_code
|
94
|
+
counters = @depth.times.map do |i| '_' + ('i'[0].ord + i).chr end
|
95
|
+
indents = 0.upto(@depth).map do |i| ' ' * 4 * i end
|
96
|
+
sizes = @depth.times.map do |i|
|
97
|
+
@boxed_name + ('.get(0)' * i) + '.size()'
|
98
|
+
end
|
99
|
+
ret = ''
|
100
|
+
|
101
|
+
ret << @type << ' ' << @name << ' = new ' << @elem_type;
|
102
|
+
@depth.times do |i| ret << '[' << sizes[i] << ']' end
|
103
|
+
ret << ";\n"
|
104
|
+
|
105
|
+
@depth.times do |i|
|
106
|
+
ret << indents[i] << 'for (int ' << counters[i] << ' = 0; '
|
107
|
+
ret << counters[i] << ' < ' << sizes[i]
|
108
|
+
ret << '; ++' << counters[i] << ")\n"
|
109
|
+
end
|
110
|
+
|
111
|
+
ret << indents[@depth] << @name
|
112
|
+
@depth.times do |i| ret << '[' << counters[i] << ']' end
|
113
|
+
ret << ' = '
|
114
|
+
ret << @boxed_name
|
115
|
+
@depth.times do |i| ret << '.get(' << counters[i] << ')' end
|
116
|
+
ret << ";"
|
117
|
+
|
118
|
+
return ret
|
119
|
+
end
|
120
|
+
def box_code_recurse boxed_type, parent, boxed_name, depth, counters
|
121
|
+
ret = ''
|
122
|
+
index = counters.map do |counter| '[' + counter + ']' end
|
123
|
+
index = index.join
|
124
|
+
if depth == 0
|
125
|
+
ret << parent << '.add(' << @name << index << ");\n"
|
126
|
+
else
|
127
|
+
type_str = boxed_type.to_java_boxed
|
128
|
+
ret << type_str << ' ' << boxed_name
|
129
|
+
ret << ' = new Array' << type_str << '();' << "\n"
|
130
|
+
|
131
|
+
counter = '_' + ('i'[0].ord + counters.size).chr
|
132
|
+
ret << 'for (int ' << counter << ' = 0; '
|
133
|
+
ret << counter << ' < ' << @name << index << '.length; '
|
134
|
+
ret << '++' << counter << ") {\n"
|
135
|
+
|
136
|
+
ret << box_code_recurse(boxed_type.subtype,
|
137
|
+
boxed_name,
|
138
|
+
boxed_name + counter,
|
139
|
+
depth - 1, counters << counter)
|
140
|
+
ret << "}\n"
|
141
|
+
|
142
|
+
if not parent.nil?
|
143
|
+
ret << parent << '.add('
|
144
|
+
ret << boxed_name << ");\n"
|
145
|
+
end
|
146
|
+
end
|
147
|
+
ret.gsub! /^/, ' ' * 4 if not parent.nil?
|
148
|
+
return ret
|
149
|
+
end
|
150
|
+
def box_code
|
151
|
+
box_code_recurse @sig.type, nil, @boxed_name, @depth, []
|
152
|
+
end
|
153
|
+
end
|
154
|
+
class JavaEngine
|
155
|
+
attr_accessor :func, :vars
|
156
|
+
def initialize func, vars
|
157
|
+
@func = func
|
158
|
+
@vars = vars
|
159
|
+
end
|
160
|
+
def declare
|
161
|
+
ret = 'public '
|
162
|
+
ret << @func.to_java << '('
|
163
|
+
indent = ' ' * ret.size
|
164
|
+
temp = @vars.map do |var| var.to_java end
|
165
|
+
ret << temp.join(",\n#{indent}")
|
166
|
+
ret << ')'
|
167
|
+
return ret
|
168
|
+
end
|
169
|
+
def input
|
170
|
+
temp = @vars.map do |var|
|
171
|
+
ret = ''
|
172
|
+
if var.type.is_a? TArray
|
173
|
+
arr = JavaArray.new var
|
174
|
+
ret << arr.boxed_type
|
175
|
+
ret << ' ' << arr.boxed_name
|
176
|
+
ret << ' = (' << arr.boxed_type << ') '
|
177
|
+
ret << 'reader.next(new TypeRef<' << arr.boxed_type << '>'
|
178
|
+
ret << "(){}.getType());\n"
|
179
|
+
ret << arr.unbox_code
|
180
|
+
else
|
181
|
+
ret << var.to_java
|
182
|
+
ret << ' = (' << var.type.to_java_boxed << ') '
|
183
|
+
ret << 'reader.next('
|
184
|
+
ret << var.type.to_java_boxed
|
185
|
+
ret << '.class);'
|
186
|
+
end
|
187
|
+
ret
|
188
|
+
end
|
189
|
+
return temp.join "\nreader.next();\n\n"
|
190
|
+
end
|
191
|
+
def output
|
192
|
+
ret = ''
|
193
|
+
caller = 'solver.' + @func.name + '('
|
194
|
+
temp = @vars.map do |var| var.name end
|
195
|
+
caller << temp.join(', ') << ')'
|
196
|
+
if @func.type.is_a? TArray
|
197
|
+
ret << @func.type.to_java << ' result = ' << caller << ";\n"
|
198
|
+
arr = JavaArray.new(Signature.new @func.type, 'result')
|
199
|
+
ret << arr.box_code
|
200
|
+
ret << 'writer.write(resultBoxed);'
|
201
|
+
else
|
202
|
+
ret << 'writer.write(' << caller << ');'
|
203
|
+
end
|
204
|
+
return ret
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
mode="$1"
|
2
|
+
solver="$2"
|
3
|
+
data_d="$3"
|
4
|
+
output_d="$4"
|
5
|
+
ostream=/dev/null
|
6
|
+
|
7
|
+
timeit () {
|
8
|
+
if [ -x /usr/bin/time ]; then
|
9
|
+
/usr/bin/time -o $ostream "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9"
|
10
|
+
elif [ $mode = 'verbose' ]; then
|
11
|
+
time "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9"
|
12
|
+
else
|
13
|
+
"$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9"
|
14
|
+
fi
|
15
|
+
}
|
16
|
+
|
17
|
+
puts () {
|
18
|
+
echo "$1" > $ostream
|
19
|
+
}
|
20
|
+
|
21
|
+
write () {
|
22
|
+
echo -n "$1" > $ostream
|
23
|
+
}
|
24
|
+
|
25
|
+
view_file () {
|
26
|
+
filename="$1"
|
27
|
+
write '<'
|
28
|
+
cat "$filename" > $ostream
|
29
|
+
puts '>'
|
30
|
+
}
|
31
|
+
|
32
|
+
report_case () {
|
33
|
+
write ' Input: '
|
34
|
+
view_file "$data_d/$test_case.in"
|
35
|
+
write ' Expected: '
|
36
|
+
view_file "$data_d/$test_case.out"
|
37
|
+
write ' Received: '
|
38
|
+
view_file "$output_d/$test_case.out"
|
39
|
+
}
|
40
|
+
|
41
|
+
init () {
|
42
|
+
export TIME="Time: %es - Memory: %MK"
|
43
|
+
export TIMEFORMAT=%3lR
|
44
|
+
|
45
|
+
if [ ! -d "$output_d" ]; then
|
46
|
+
mkdir "$output_d"
|
47
|
+
fi
|
48
|
+
|
49
|
+
if [ "$mode" = 'verbose' ]; then
|
50
|
+
ostream=/dev/stdout
|
51
|
+
elif [ "$mode" = 'file' ]; then
|
52
|
+
ostream=log
|
53
|
+
fi
|
54
|
+
|
55
|
+
dir=`dirname $0`
|
56
|
+
checker="$dir/../build/check"
|
57
|
+
if [ ! -x "$checker" ]; then
|
58
|
+
undo=`pwd`
|
59
|
+
cd "$dir/../util/check"
|
60
|
+
make
|
61
|
+
cd "$undo"
|
62
|
+
fi
|
63
|
+
}
|
64
|
+
|
65
|
+
main () {
|
66
|
+
cases=0
|
67
|
+
|
68
|
+
fails=0
|
69
|
+
|
70
|
+
errors=0
|
71
|
+
failstr=''
|
72
|
+
|
73
|
+
errorstr=''
|
74
|
+
for input in "$data_d"/*.in; do
|
75
|
+
if [ -f "$input" ]; then
|
76
|
+
cases=$(( cases + 1 ))
|
77
|
+
|
78
|
+
test_case=`basename "$input"`
|
79
|
+
test_case=${test_case%.in}
|
80
|
+
|
81
|
+
write "Check $test_case ... "
|
82
|
+
timeit "$solver" "$data_d/$test_case.in" "$output_d/$test_case.out"
|
83
|
+
"$checker" "$data_d/$test_case.out" "$output_d/$test_case.out" > $ostream
|
84
|
+
retcode=$?
|
85
|
+
|
86
|
+
if [ $retcode -eq 0 ]; then
|
87
|
+
puts 'Passed'
|
88
|
+
|
89
|
+
elif [ $retcode -eq 1 ]; then
|
90
|
+
fails=$(( fails + 1 ))
|
91
|
+
failstr="$failstr $test_case"
|
92
|
+
puts 'Failed'
|
93
|
+
report_case "$test_case"
|
94
|
+
|
95
|
+
else
|
96
|
+
errors=$(( errors + 1 ))
|
97
|
+
errorstr="$errorstr $test_case"
|
98
|
+
puts 'Error'
|
99
|
+
report_case "$test_case"
|
100
|
+
fi
|
101
|
+
fi
|
102
|
+
done
|
103
|
+
echo "$cases cases checked, $fails failed, $errors errored"
|
104
|
+
if [ $fails -gt 0 ]; then
|
105
|
+
echo "Failed cases:${failstr}"
|
106
|
+
fi
|
107
|
+
if [ $errors -gt 0 ]; then
|
108
|
+
echo "Errored cases:${errorstr}"
|
109
|
+
fi
|
110
|
+
|
111
|
+
}
|
112
|
+
init
|
113
|
+
main
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= @prob.to_md %>
|
@@ -0,0 +1,30 @@
|
|
1
|
+
OUTPUT_D=../../build/cpp
|
2
|
+
DATA_D=../../data
|
3
|
+
COMPILER=g++ -std=gnu++0x -I$$HOME/.gettc/include/cpp
|
4
|
+
RUNNER=sh ../../bin/runner.sh
|
5
|
+
|
6
|
+
run = $(RUNNER) $1 $(OUTPUT_D)/<%= prob.name %>Runner $(DATA_D)/$2 $(OUTPUT_D)/$2
|
7
|
+
|
8
|
+
default : demo
|
9
|
+
|
10
|
+
setup :
|
11
|
+
if [ ! -d $(OUTPUT_D) ]; then mkdir -p $(OUTPUT_D); fi
|
12
|
+
|
13
|
+
main : <%= prob.name %>Runner.cpp <%= prob.name %>.cpp setup
|
14
|
+
$(COMPILER) -o $(OUTPUT_D)/<%= prob.name %>Runner $<
|
15
|
+
|
16
|
+
test : <%= prob.name %>Test.cpp <%= prob.name %>.cpp setup
|
17
|
+
$(COMPILER) -lboost_unit_test_framework -o $(OUTPUT_D)/<%= prob.name %>Test $<
|
18
|
+
$(OUTPUT_D)/<%= prob.name %>Test
|
19
|
+
|
20
|
+
demo : main
|
21
|
+
$(call run,verbose,demo)
|
22
|
+
|
23
|
+
sys : main
|
24
|
+
$(call run,quiet,sys)
|
25
|
+
|
26
|
+
sysv : main
|
27
|
+
$(call run,verbose,sys)
|
28
|
+
|
29
|
+
clean :
|
30
|
+
rm -rf $(OUTPUT_D)
|
@@ -0,0 +1,26 @@
|
|
1
|
+
#include <topcoder>
|
2
|
+
using namespace TopCoder;
|
3
|
+
#include "<%= prob.name %>.cpp"
|
4
|
+
#include <fstream>
|
5
|
+
using namespace std;
|
6
|
+
<%
|
7
|
+
engine = CppEngine.new func, vars
|
8
|
+
%>
|
9
|
+
int main(int argc, char const *argv[]) {
|
10
|
+
try {
|
11
|
+
ifstream ifs(argv[1]);
|
12
|
+
<%=
|
13
|
+
engine.input.gsub(/^/, ' ' * 8)
|
14
|
+
%>
|
15
|
+
ifs.close();
|
16
|
+
|
17
|
+
ofstream ofs(argv[2]);
|
18
|
+
<%=
|
19
|
+
engine.output.gsub(/^/, ' ' * 8)
|
20
|
+
%>
|
21
|
+
ofs.close();
|
22
|
+
} catch (exception &e) {
|
23
|
+
cerr << e.what() << endl;
|
24
|
+
}
|
25
|
+
return 0;
|
26
|
+
}
|
@@ -0,0 +1,30 @@
|
|
1
|
+
OUTPUT_D=../../build/haskell
|
2
|
+
DATA_D=../../data
|
3
|
+
COMPILER=ghc -i$$HOME/.gettc/include/haskell -outputdir $(OUTPUT_D)
|
4
|
+
RUNNER=sh ../../bin/runner.sh
|
5
|
+
|
6
|
+
run = $(RUNNER) $1 $(OUTPUT_D)/<%= prob.name %>Runner $(DATA_D)/$2 $(OUTPUT_D)/$2
|
7
|
+
|
8
|
+
default : demo
|
9
|
+
|
10
|
+
setup :
|
11
|
+
if [ ! -d $(OUTPUT_D) ]; then mkdir -p $(OUTPUT_D); fi
|
12
|
+
|
13
|
+
main : <%= prob.name %>Runner.hs <%= prob.name %>.hs setup
|
14
|
+
$(COMPILER) -o $(OUTPUT_D)/<%= prob.name %>Runner $<
|
15
|
+
|
16
|
+
test : <%= prob.name %>Test.hs <%= prob.name %>.hs setup
|
17
|
+
$(COMPILER) -o $(OUTPUT_D)/<%= prob.name %>Test $<
|
18
|
+
$(OUTPUT_D)/<%= prob.name %>Test
|
19
|
+
|
20
|
+
demo : main
|
21
|
+
$(call run,verbose,demo)
|
22
|
+
|
23
|
+
sys : main
|
24
|
+
$(call run,quiet,sys)
|
25
|
+
|
26
|
+
sysv : main
|
27
|
+
$(call run,verbose,sys)
|
28
|
+
|
29
|
+
clean :
|
30
|
+
rm -rf $(OUTPUT_D)
|