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.
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)