gettc 1.2.2
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 +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)
|