gettc 1.5 → 1.6

Sign up to get free protection for your applications and to get access to all the features.
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