gettc 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +41 -0
  3. data/bin/gettc +63 -0
  4. data/core/lib/topcoder.rb +3 -0
  5. data/core/lib/topcoder/download.rb +89 -0
  6. data/core/lib/topcoder/generate.rb +131 -0
  7. data/core/lib/topcoder/parse.rb +231 -0
  8. data/core/lib/topcoder/print.rb +56 -0
  9. data/core/lib/topcoder/problem.rb +33 -0
  10. data/core/lib/topcoder/signature.rb +55 -0
  11. data/core/lib/topcoder/types.rb +62 -0
  12. data/core/test/topcoder/download_test.rb +29 -0
  13. data/core/test/topcoder/generate_test.rb +31 -0
  14. data/core/test/topcoder/parse_test.rb +104 -0
  15. data/core/test/topcoder/signature_test.rb +52 -0
  16. data/core/test/topcoder/types_test.rb +24 -0
  17. data/dist/config.yml +2 -0
  18. data/dist/include/cpp/engine.rb +90 -0
  19. data/dist/include/cpp/topcoder +212 -0
  20. data/dist/include/haskell/TopCoder.hs +82 -0
  21. data/dist/include/haskell/engine.rb +122 -0
  22. data/dist/include/java/TopCoder.jar +0 -0
  23. data/dist/include/java/engine.rb +207 -0
  24. data/dist/template/bin/runner.sh +113 -0
  25. data/dist/template/data/demo/{examples_d} +0 -0
  26. data/dist/template/data/sys/{systests_d} +0 -0
  27. data/dist/template/prob/images/{images_d} +0 -0
  28. data/dist/template/prob/{name}.html +8 -0
  29. data/dist/template/prob/{name}.md +1 -0
  30. data/dist/template/solve/cpp/Makefile +30 -0
  31. data/dist/template/solve/cpp/{name}.cpp +11 -0
  32. data/dist/template/solve/cpp/{name}Runner.cpp +26 -0
  33. data/dist/template/solve/cpp/{name}Test.cpp +8 -0
  34. data/dist/template/solve/haskell/Makefile +30 -0
  35. data/dist/template/solve/haskell/{name}.hs +7 -0
  36. data/dist/template/solve/haskell/{name}Runner.hs +27 -0
  37. data/dist/template/solve/haskell/{name}Test.hs +10 -0
  38. data/dist/template/solve/java/build.xml +78 -0
  39. data/dist/template/solve/java/{name}.java +9 -0
  40. data/dist/template/solve/java/{name}Runner.java +32 -0
  41. data/dist/template/solve/java/{name}Test.java +8 -0
  42. data/dist/template/util/check/Makefile +5 -0
  43. data/dist/template/util/check/check.cpp +26 -0
  44. 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,8 @@
1
+ <html>
2
+ <head>
3
+ <title><%= @prob.name %></title>
4
+ </head>
5
+ <body>
6
+ <%= @prob.to_html %>
7
+ </body>
8
+ </html>
@@ -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,11 @@
1
+ #include <vector>
2
+ #include <string>
3
+ using namespace std;
4
+ <%
5
+ engine = CppEngine.new func, vars
6
+ %>
7
+ <%=
8
+ engine.declare
9
+ %> {
10
+ return <%= func.type.dumb_cpp %>;
11
+ }
@@ -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,8 @@
1
+ #define BOOST_TEST_DYN_LINK
2
+ #define BOOST_TEST_MODULE MyTest
3
+ #include <boost/test/unit_test.hpp>
4
+ #include "<%= prob.name %>.cpp"
5
+
6
+ BOOST_AUTO_TEST_CASE (test_<%= func.name %>) {
7
+ BOOST_CHECK_EQUAL(0, 0);
8
+ }
@@ -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)