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.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/bin/gettc +45 -29
  3. data/core/lib/gettc.rb +7 -0
  4. data/core/lib/{topcoder → gettc}/download.rb +53 -45
  5. data/core/lib/gettc/generate.rb +145 -0
  6. data/core/lib/{topcoder → gettc}/parse.rb +104 -102
  7. data/core/lib/{topcoder → gettc}/print.rb +11 -11
  8. data/core/lib/{topcoder → gettc}/problem.rb +11 -11
  9. data/core/lib/{topcoder → gettc}/signature.rb +8 -8
  10. data/core/lib/{topcoder → gettc}/types.rb +34 -17
  11. data/core/test/{topcoder → gettc}/download_test.rb +6 -6
  12. data/core/test/gettc/generate_test.rb +31 -0
  13. data/core/test/{topcoder → gettc}/parse_test.rb +26 -26
  14. data/core/test/gettc/signature_test.rb +54 -0
  15. data/core/test/gettc/types_test.rb +24 -0
  16. data/dist/config.yml +1 -0
  17. data/dist/include/cpp/engine.rb +32 -32
  18. data/dist/include/cpp/topcoder +89 -25
  19. data/dist/include/haskell/TopCoder.hs +72 -53
  20. data/dist/include/haskell/engine.rb +49 -47
  21. data/dist/include/java/TopCoder.jar +0 -0
  22. data/dist/include/java/engine.rb +71 -71
  23. data/dist/include/python/engine.rb +46 -0
  24. data/dist/include/python/topcoder/__init__.py +3 -0
  25. data/dist/include/python/topcoder/errors.py +4 -0
  26. data/dist/include/python/topcoder/reader.py +160 -0
  27. data/dist/include/python/topcoder/writer.py +13 -0
  28. data/dist/template/bin/runner.sh +16 -6
  29. data/dist/template/solve/cpp/Makefile +9 -5
  30. data/dist/template/solve/cpp/{name}.cpp +8 -8
  31. data/dist/template/solve/cpp/{name}Runner.cpp +8 -8
  32. data/dist/template/solve/haskell/Makefile +9 -5
  33. data/dist/template/solve/haskell/{name}.hs +1 -1
  34. data/dist/template/solve/haskell/{name}Runner.hs +5 -5
  35. data/dist/template/solve/java/Makefile +18 -0
  36. data/dist/template/solve/java/build.xml +7 -3
  37. data/dist/template/solve/java/{name}.java +1 -1
  38. data/dist/template/solve/java/{name}Runner.java +1 -1
  39. data/dist/template/solve/python/Makefile +27 -0
  40. data/dist/template/solve/python/{name}.py +4 -0
  41. data/dist/template/solve/python/{name}Runner.py +27 -0
  42. data/dist/template/util/check/Makefile +3 -1
  43. data/dist/usage +5 -0
  44. metadata +30 -24
  45. data/Rakefile +0 -41
  46. data/core/lib/topcoder.rb +0 -3
  47. data/core/lib/topcoder/generate.rb +0 -131
  48. data/core/test/topcoder/generate_test.rb +0 -31
  49. data/core/test/topcoder/signature_test.rb +0 -52
  50. data/core/test/topcoder/types_test.rb +0 -24
  51. data/dist/template/solve/cpp/{name}Test.cpp +0 -8
  52. data/dist/template/solve/haskell/{name}Test.hs +0 -10
  53. data/dist/template/solve/java/{name}Test.java +0 -8
@@ -1,72 +1,74 @@
1
- require 'topcoder/types'
1
+ require "gettc/types"
2
+
2
3
  class String
3
4
  def uncapitalize
4
5
  return self[0, 1].downcase + self[1..-1]
5
6
  end
6
7
  end
7
- module TopCoder
8
+
9
+ module Gettc
8
10
  class Type
9
11
  def to_haskell
10
12
  if self == TInt then
11
- return 'Int'
13
+ return "Int"
12
14
  elsif self == TLong then
13
- return 'Integer'
15
+ return "Integer"
14
16
  elsif self == TFloat then
15
- return 'Float'
17
+ return "Float"
16
18
  elsif self == TDouble then
17
- return 'Double'
19
+ return "Double"
18
20
  elsif self == TChar then
19
- return 'Char'
21
+ return "Char"
20
22
  elsif self == TString then
21
- return 'String'
23
+ return "String"
22
24
  elsif self == TBoolean then
23
- return 'Bool'
25
+ return "Bool"
24
26
  elsif is_a? TArray then
25
- return '[' + subtype.to_haskell + ']'
27
+ return "[" + subtype.to_haskell + "]"
26
28
  else
27
- return 'Unknown'
29
+ return "Unknown"
28
30
  end
29
31
  end
30
32
  def get_haskell_parser
31
33
  if self == TInt then
32
- return 'parseInt'
34
+ return "TC.parseInt"
33
35
  elsif self == TLong then
34
- return 'parseLong'
36
+ return "TC.parseLong"
35
37
  elsif self == TFloat then
36
- return 'parseFloat'
38
+ return "TC.parseFloat"
37
39
  elsif self == TDouble then
38
- return 'parseDouble'
40
+ return "TC.parseDouble"
39
41
  elsif self == TChar then
40
- return 'parseChar'
42
+ return "TC.parseChar"
41
43
  elsif self == TString then
42
- return 'parseString'
44
+ return "TC.parseString"
43
45
  elsif self == TBoolean then
44
- return 'parseBool'
46
+ return "TC.parseBool"
45
47
  elsif is_a? TArray then
46
- return '(parseList ' + subtype.get_haskell_parser + ')'
48
+ return "(TC.parseList " + subtype.get_haskell_parser + ")"
47
49
  else
48
- return 'unknown'
50
+ return "unknown"
49
51
  end
50
52
  end
51
53
  def dumb_haskell
52
54
  if self == TInt then
53
- return '0'
55
+ return "0"
54
56
  elsif self == TLong then
55
- return '0'
57
+ return "0"
56
58
  elsif self == TFloat then
57
- return '0'
59
+ return "0"
58
60
  elsif self == TDouble then
59
- return '0'
61
+ return "0"
60
62
  elsif self == TChar then
61
- return "'$'"
63
+ return "\"$\""
62
64
  elsif self == TString then
63
- return '"$"'
65
+ return "\"$\""
64
66
  elsif self == TBoolean then
65
- return 'True'
67
+ return "True"
66
68
  elsif is_a? TArray then
67
- return '[]'
69
+ return "[]"
68
70
  else
69
- return 'Nil'
71
+ return "Nil"
70
72
  end
71
73
  end
72
74
  end
@@ -79,43 +81,43 @@ module TopCoder
79
81
  end
80
82
  end
81
83
  def declare
82
- ret = ''
83
- ret << func.name << ' :: '
84
+ ret = ""
85
+ ret << func.name << " :: "
84
86
 
85
87
  temp = vars.map do |var| var.type.to_haskell end
86
- ret << temp.join(' -> ') << ' -> ' << func.type.to_haskell << "\n"
88
+ ret << temp.join(" -> ") << " -> " << func.type.to_haskell << "\n"
87
89
 
88
- ret << func.name << ' '
90
+ ret << func.name << " "
89
91
  temp = vars.map do |var| var.name end
90
- ret << temp.join(' ') << ' = ' << func.type.dumb_haskell
92
+ ret << temp.join(" ") << " = " << func.type.dumb_haskell
91
93
 
92
94
  return ret
93
95
  end
94
96
  def input
95
- ret = 'getVars :: Parser ('
97
+ ret = "getVars :: TC.Parser ("
96
98
  temp = @vars.map do |var| var.type.to_haskell end
97
- ret << temp.join(', ') << ")\n"
98
- temp = 'getVars = do '
99
+ ret << temp.join(", ") << ")\n"
100
+ temp = "getVars = do "
99
101
  ret << temp
100
- indent = ' ' * temp.size
102
+ indent = " " * temp.size
101
103
  temp = @vars.map do |var|
102
- x = ''
104
+ x = ""
103
105
  x << var.name
104
- x << ' <- spaces >> '
106
+ x << " <- TC.spaces >> "
105
107
  x << var.type.get_haskell_parser
106
108
  end
107
- ret << temp.join(" ; next\n#{indent}") << "\n"
108
- ret << indent << 'return ('
109
+ ret << temp.join(" ; TC.spaces >> TC.next\n#{indent}") << "\n"
110
+ ret << indent << "return ("
109
111
  temp = @vars.map do |var| var.name end
110
- ret << temp.join(', ')
111
- ret << ')'
112
+ ret << temp.join(", ")
113
+ ret << ")"
112
114
  return ret
113
115
  end
114
116
  def output
115
- ret = ''
116
- ret << @func.name << ' '
117
+ ret = ""
118
+ ret << @func.name << " "
117
119
  temp = vars.map do |var| var.name end
118
- ret << temp.join(' ')
120
+ ret << temp.join(" ")
119
121
  return ret
120
122
  end
121
123
  end
@@ -1,68 +1,68 @@
1
- require 'topcoder/types'
1
+ require "gettc/types"
2
2
 
3
- module TopCoder
3
+ module Gettc
4
4
  class Type
5
5
  def to_java
6
6
  if self == TInt then
7
- return 'int'
7
+ return "int"
8
8
  elsif self == TLong then
9
- return 'long'
9
+ return "long"
10
10
  elsif self == TFloat then
11
- return 'float'
11
+ return "float"
12
12
  elsif self == TDouble then
13
- return 'double'
13
+ return "double"
14
14
  elsif self == TChar then
15
- return 'char'
15
+ return "char"
16
16
  elsif self == TString then
17
- return 'String'
17
+ return "String"
18
18
  elsif self == TBoolean then
19
- return 'boolean'
19
+ return "boolean"
20
20
  elsif is_a? TArray then
21
21
  return "#{subtype.to_java}[]"
22
22
  else
23
- return 'unknown'
23
+ return "unknown"
24
24
  end
25
25
  end
26
26
  def to_java_boxed
27
27
  if self == TInt then
28
- return 'Integer'
28
+ return "Integer"
29
29
  elsif self == TLong then
30
- return 'Long'
30
+ return "Long"
31
31
  elsif self == TFloat then
32
- return 'Float'
32
+ return "Float"
33
33
  elsif self == TDouble then
34
- return 'Double'
34
+ return "Double"
35
35
  elsif self == TChar then
36
- return 'Character'
36
+ return "Character"
37
37
  elsif self == TString then
38
- return 'String'
38
+ return "String"
39
39
  elsif self == TBoolean then
40
- return 'Boolean'
40
+ return "Boolean"
41
41
  elsif self.is_a? TArray then
42
42
  return "List<#{subtype.to_java_boxed}>"
43
43
  else
44
- return 'Unknown'
44
+ return "Unknown"
45
45
  end
46
46
  end
47
47
  def dumb_java
48
48
  if self == TInt then
49
- return '0'
49
+ return "0"
50
50
  elsif self == TLong then
51
- return '0'
51
+ return "0"
52
52
  elsif self == TFloat then
53
- return '0'
53
+ return "0"
54
54
  elsif self == TDouble then
55
- return '0'
55
+ return "0"
56
56
  elsif self == TChar then
57
- return "'$'"
57
+ return "\"$\""
58
58
  elsif self == TString then
59
- return '"$"'
59
+ return "\"$\""
60
60
  elsif self == TBoolean then
61
- return 'true'
61
+ return "true"
62
62
  elsif self.is_a? TArray then
63
63
  return "new #{subtype.to_java}[1]"
64
64
  else
65
- return 'Nil'
65
+ return "Nil"
66
66
  end
67
67
  end
68
68
  end
@@ -73,11 +73,11 @@ module TopCoder
73
73
  end
74
74
  class JavaArray
75
75
  def self.get_depth type
76
- return 0 if not type.is_a? TArray
76
+ return 0 unless type.is_a? TArray
77
77
  return 1 + get_depth(type.subtype)
78
78
  end
79
79
  def self.get_elem_type type
80
- return type if not type.is_a? TArray
80
+ return type unless type.is_a? TArray
81
81
  return get_elem_type type.subtype
82
82
  end
83
83
  attr_accessor :name, :boxed_name, :type, :boxed_type
@@ -91,47 +91,47 @@ module TopCoder
91
91
  @elem_type = self.class.get_elem_type(sig.type).to_java
92
92
  end
93
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
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
96
  sizes = @depth.times.map do |i|
97
- @boxed_name + ('.get(0)' * i) + '.size()'
97
+ @boxed_name + (".get(0)" * i) + ".size()"
98
98
  end
99
- ret = ''
99
+ ret = ""
100
100
 
101
- ret << @type << ' ' << @name << ' = new ' << @elem_type;
102
- @depth.times do |i| ret << '[' << sizes[i] << ']' end
101
+ ret << @type << " " << @name << " = new " << @elem_type;
102
+ @depth.times do |i| ret << "[" << sizes[i] << "]" end
103
103
  ret << ";\n"
104
104
 
105
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"
106
+ ret << indents[i] << "for (int " << counters[i] << " = 0; "
107
+ ret << counters[i] << " < " << sizes[i]
108
+ ret << "; ++" << counters[i] << ")\n"
109
109
  end
110
110
 
111
111
  ret << indents[@depth] << @name
112
- @depth.times do |i| ret << '[' << counters[i] << ']' end
113
- ret << ' = '
112
+ @depth.times do |i| ret << "[" << counters[i] << "]" end
113
+ ret << " = "
114
114
  ret << @boxed_name
115
- @depth.times do |i| ret << '.get(' << counters[i] << ')' end
115
+ @depth.times do |i| ret << ".get(" << counters[i] << ")" end
116
116
  ret << ";"
117
117
 
118
118
  return ret
119
119
  end
120
120
  def box_code_recurse boxed_type, parent, boxed_name, depth, counters
121
- ret = ''
122
- index = counters.map do |counter| '[' + counter + ']' end
121
+ ret = ""
122
+ index = counters.map do |counter| "[" + counter + "]" end
123
123
  index = index.join
124
124
  if depth == 0
125
- ret << parent << '.add(' << @name << index << ");\n"
125
+ ret << parent << ".add(" << @name << index << ");\n"
126
126
  else
127
127
  type_str = boxed_type.to_java_boxed
128
- ret << type_str << ' ' << boxed_name
129
- ret << ' = new Array' << type_str << '();' << "\n"
128
+ ret << type_str << " " << boxed_name
129
+ ret << " = new Array" << type_str << "();" << "\n"
130
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"
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
135
 
136
136
  ret << box_code_recurse(boxed_type.subtype,
137
137
  boxed_name,
@@ -139,12 +139,12 @@ module TopCoder
139
139
  depth - 1, counters << counter)
140
140
  ret << "}\n"
141
141
 
142
- if not parent.nil?
143
- ret << parent << '.add('
142
+ unless parent.nil?
143
+ ret << parent << ".add("
144
144
  ret << boxed_name << ");\n"
145
145
  end
146
146
  end
147
- ret.gsub! /^/, ' ' * 4 if not parent.nil?
147
+ ret.gsub! /^/, " " * 4 unless parent.nil?
148
148
  return ret
149
149
  end
150
150
  def box_code
@@ -158,50 +158,50 @@ module TopCoder
158
158
  @vars = vars
159
159
  end
160
160
  def declare
161
- ret = 'public '
162
- ret << @func.to_java << '('
163
- indent = ' ' * ret.size
161
+ ret = "public "
162
+ ret << @func.to_java << "("
163
+ indent = " " * ret.size
164
164
  temp = @vars.map do |var| var.to_java end
165
165
  ret << temp.join(",\n#{indent}")
166
- ret << ')'
166
+ ret << ")"
167
167
  return ret
168
168
  end
169
169
  def input
170
170
  temp = @vars.map do |var|
171
- ret = ''
171
+ ret = ""
172
172
  if var.type.is_a? TArray
173
173
  arr = JavaArray.new var
174
174
  ret << arr.boxed_type
175
- ret << ' ' << arr.boxed_name
176
- ret << ' = (' << arr.boxed_type << ') '
177
- ret << 'reader.next(new TypeRef<' << arr.boxed_type << '>'
175
+ ret << " " << arr.boxed_name
176
+ ret << " = (" << arr.boxed_type << ") "
177
+ ret << "reader.next(new TypeRef<" << arr.boxed_type << ">"
178
178
  ret << "(){}.getType());\n"
179
179
  ret << arr.unbox_code
180
180
  else
181
181
  ret << var.to_java
182
- ret << ' = (' << var.type.to_java_boxed << ') '
183
- ret << 'reader.next('
182
+ ret << " = (" << var.type.to_java_boxed << ") "
183
+ ret << "reader.next("
184
184
  ret << var.type.to_java_boxed
185
- ret << '.class);'
185
+ ret << ".class);"
186
186
  end
187
187
  ret
188
188
  end
189
189
  return temp.join "\nreader.next();\n\n"
190
190
  end
191
191
  def output
192
- ret = ''
193
- caller = 'solver.' + @func.name + '('
192
+ ret = ""
193
+ caller = "solver." + @func.name + "("
194
194
  temp = @vars.map do |var| var.name end
195
- caller << temp.join(', ') << ')'
195
+ caller << temp.join(", ") << ")"
196
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')
197
+ ret << @func.type.to_java << " result = " << caller << ";\n"
198
+ arr = JavaArray.new(Signature.new @func.type, "result")
199
199
  ret << arr.box_code
200
- ret << 'writer.write(resultBoxed);'
200
+ ret << "writer.write(resultBoxed);"
201
201
  else
202
- ret << 'writer.write(' << caller << ');'
202
+ ret << "writer.write(" << caller << ");"
203
203
  end
204
204
  return ret
205
205
  end
206
206
  end
207
- end
207
+ end
@@ -0,0 +1,46 @@
1
+ require "gettc/types"
2
+
3
+ module Gettc
4
+ class Type
5
+ def dumb_python
6
+ if self == TInt then
7
+ return "0"
8
+ elsif self == TLong then
9
+ return "0"
10
+ elsif self == TFloat then
11
+ return "0"
12
+ elsif self == TDouble then
13
+ return "0"
14
+ elsif self == TChar then
15
+ return "'$'"
16
+ elsif self == TString then
17
+ return '"$"'
18
+ elsif self == TBoolean then
19
+ return "True"
20
+ elsif self.is_a? TArray then
21
+ return "[]"
22
+ else
23
+ return "None"
24
+ end
25
+ end
26
+ end
27
+ class PythonEngine
28
+ attr_accessor :func, :vars
29
+ def initialize func, vars
30
+ @func = func
31
+ @vars = vars
32
+ end
33
+ def vars_list
34
+ temp = @vars.map do |var|
35
+ var.name
36
+ end
37
+ return temp.join ", "
38
+ end
39
+ def input
40
+ temp = @vars.map do |var|
41
+ var.name + ' = reader.next("' + var.type.to_s + '")'
42
+ end
43
+ return temp.join "\nreader.next()\n"
44
+ end
45
+ end
46
+ end