gettc 1.6.2 → 1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/core/lib/gettc.rb +1 -1
- data/core/lib/gettc/generate.rb +133 -133
- data/dist/config.yml +1 -1
- data/dist/include/cpp/engine.rb +22 -15
- data/dist/include/go/engine.rb +70 -0
- data/dist/include/go/src/topcoder/errors.go +41 -0
- data/dist/include/go/src/topcoder/reader.go +266 -0
- data/dist/include/go/src/topcoder/reader_test.go +335 -0
- data/dist/include/go/src/topcoder/writer.go +54 -0
- data/dist/include/go/src/topcoder/writer_test.go +19 -0
- data/dist/include/haskell/engine.rb +16 -15
- data/dist/include/java/engine.rb +14 -10
- data/dist/include/python/engine.rb +36 -13
- data/dist/include/python/topcoder/__pycache__/__init__.cpython-32.pyc +0 -0
- data/dist/include/python/topcoder/__pycache__/errors.cpython-32.pyc +0 -0
- data/dist/include/python/topcoder/__pycache__/reader.cpython-32.pyc +0 -0
- data/dist/include/python/topcoder/__pycache__/writer.cpython-32.pyc +0 -0
- data/dist/template/solve/cpp/Makefile +1 -5
- data/dist/template/solve/cpp/{name}.cpp +2 -2
- data/dist/template/solve/go/Makefile +29 -0
- data/dist/template/solve/go/{name}/{name}.go +7 -0
- data/dist/template/solve/go/{name}Runner.go +34 -0
- data/dist/template/solve/haskell/Makefile +1 -5
- data/dist/template/solve/java/build.xml +0 -16
- data/dist/template/solve/python/Makefile +1 -1
- data/dist/template/solve/python/{name}.py +2 -2
- data/dist/template/solve/python/{name}Runner.py +4 -5
- data/dist/template/util/check/check.cpp +1 -1
- metadata +11 -2
@@ -0,0 +1,54 @@
|
|
1
|
+
package topcoder
|
2
|
+
|
3
|
+
import (
|
4
|
+
"bufio"
|
5
|
+
"fmt"
|
6
|
+
"io"
|
7
|
+
"reflect"
|
8
|
+
)
|
9
|
+
|
10
|
+
func writeOne(bw *bufio.Writer, x interface{}) error {
|
11
|
+
switch y := x.(type) {
|
12
|
+
case bool:
|
13
|
+
fmt.Fprintf(bw, "%t", y)
|
14
|
+
case byte:
|
15
|
+
fmt.Fprintf(bw, "'%c'", y)
|
16
|
+
case string:
|
17
|
+
fmt.Fprintf(bw, "\"%s\"", y)
|
18
|
+
case int, int64:
|
19
|
+
fmt.Fprintf(bw, "%d", y)
|
20
|
+
case float32, float64:
|
21
|
+
fmt.Fprintf(bw, "%f", y)
|
22
|
+
default:
|
23
|
+
slice := reflect.ValueOf(x)
|
24
|
+
if slice.Kind() != reflect.Slice {
|
25
|
+
return NewErrType(slice.Type())
|
26
|
+
}
|
27
|
+
bw.WriteByte('[')
|
28
|
+
for i := 0; i < slice.Len(); i++ {
|
29
|
+
if i != 0 {
|
30
|
+
bw.WriteString(", ")
|
31
|
+
}
|
32
|
+
elem := slice.Index(i)
|
33
|
+
if err := writeOne(bw, elem.Interface()); err != nil {
|
34
|
+
return err
|
35
|
+
}
|
36
|
+
}
|
37
|
+
bw.WriteByte(']')
|
38
|
+
}
|
39
|
+
return nil
|
40
|
+
}
|
41
|
+
|
42
|
+
func Write(w io.Writer, xs ...interface{}) error {
|
43
|
+
bw := bufio.NewWriter(w)
|
44
|
+
for i, x := range xs {
|
45
|
+
if i != 0 {
|
46
|
+
bw.WriteString(", ")
|
47
|
+
}
|
48
|
+
if err := writeOne(bw, x); err != nil {
|
49
|
+
return err
|
50
|
+
}
|
51
|
+
}
|
52
|
+
bw.Flush()
|
53
|
+
return nil
|
54
|
+
}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
package topcoder
|
2
|
+
|
3
|
+
import (
|
4
|
+
"bytes"
|
5
|
+
"testing"
|
6
|
+
)
|
7
|
+
|
8
|
+
func writer() *bytes.Buffer {
|
9
|
+
return bytes.NewBufferString("")
|
10
|
+
}
|
11
|
+
|
12
|
+
func TestShow(t *testing.T) {
|
13
|
+
out := writer()
|
14
|
+
Write(out, "Joe", 20, 7.5, false, []string{"Math", "CompSci"}, [][]int{{7, 8}, {}})
|
15
|
+
ret := out.String()
|
16
|
+
if ret != "\"Joe\", 20, 7.500000, false, [\"Math\", \"CompSci\"], [[7, 8], []]" {
|
17
|
+
t.Errorf("Write() produces <" + ret + ">")
|
18
|
+
}
|
19
|
+
}
|
@@ -1,11 +1,5 @@
|
|
1
1
|
require "gettc/types"
|
2
2
|
|
3
|
-
class String
|
4
|
-
def uncapitalize
|
5
|
-
return self[0, 1].downcase + self[1..-1]
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
3
|
module Gettc
|
10
4
|
class Type
|
11
5
|
def to_haskell
|
@@ -73,14 +67,21 @@ module Gettc
|
|
73
67
|
end
|
74
68
|
end
|
75
69
|
class HaskellEngine
|
76
|
-
|
70
|
+
attr_reader :func, :vars, :declare, :input, :output
|
77
71
|
def initialize func, vars
|
78
|
-
@func = Signature.new func.type, func.name
|
72
|
+
@func = Signature.new func.type, uncapitalize(func.name)
|
79
73
|
@vars = vars.map do |var|
|
80
|
-
Signature.new var.type, var.name
|
74
|
+
Signature.new var.type, uncapitalize(var.name)
|
81
75
|
end
|
76
|
+
compute_declare
|
77
|
+
compute_input
|
78
|
+
compute_output
|
79
|
+
end
|
80
|
+
private
|
81
|
+
def uncapitalize str
|
82
|
+
return str[0, 1].downcase + str[1..-1]
|
82
83
|
end
|
83
|
-
def
|
84
|
+
def compute_declare
|
84
85
|
ret = ""
|
85
86
|
ret << func.name << " :: "
|
86
87
|
|
@@ -91,9 +92,9 @@ module Gettc
|
|
91
92
|
temp = vars.map do |var| var.name end
|
92
93
|
ret << temp.join(" ") << " = " << func.type.dumb_haskell
|
93
94
|
|
94
|
-
|
95
|
+
@declare = ret
|
95
96
|
end
|
96
|
-
def
|
97
|
+
def compute_input
|
97
98
|
ret = "getVars :: TC.Parser ("
|
98
99
|
temp = @vars.map do |var| var.type.to_haskell end
|
99
100
|
ret << temp.join(", ") << ")\n"
|
@@ -111,14 +112,14 @@ module Gettc
|
|
111
112
|
temp = @vars.map do |var| var.name end
|
112
113
|
ret << temp.join(", ")
|
113
114
|
ret << ")"
|
114
|
-
|
115
|
+
@input = ret
|
115
116
|
end
|
116
|
-
def
|
117
|
+
def compute_output
|
117
118
|
ret = ""
|
118
119
|
ret << @func.name << " "
|
119
120
|
temp = vars.map do |var| var.name end
|
120
121
|
ret << temp.join(" ")
|
121
|
-
|
122
|
+
@output = ret
|
122
123
|
end
|
123
124
|
end
|
124
125
|
end
|
data/dist/include/java/engine.rb
CHANGED
@@ -80,7 +80,7 @@ module Gettc
|
|
80
80
|
return type unless type.is_a? TArray
|
81
81
|
return get_elem_type type.subtype
|
82
82
|
end
|
83
|
-
|
83
|
+
attr_reader :name, :boxed_name, :type, :boxed_type
|
84
84
|
def initialize sig
|
85
85
|
@sig = sig
|
86
86
|
@name = sig.name
|
@@ -152,21 +152,25 @@ module Gettc
|
|
152
152
|
end
|
153
153
|
end
|
154
154
|
class JavaEngine
|
155
|
-
attr_accessor :
|
155
|
+
attr_accessor :declare, :input, :output
|
156
156
|
def initialize func, vars
|
157
157
|
@func = func
|
158
|
-
@vars = vars
|
158
|
+
@vars = vars
|
159
|
+
compute_declare
|
160
|
+
compute_input
|
161
|
+
compute_output
|
159
162
|
end
|
160
|
-
|
163
|
+
private
|
164
|
+
def compute_declare
|
161
165
|
ret = "public "
|
162
166
|
ret << @func.to_java << "("
|
163
167
|
indent = " " * ret.size
|
164
168
|
temp = @vars.map do |var| var.to_java end
|
165
169
|
ret << temp.join(",\n#{indent}")
|
166
170
|
ret << ")"
|
167
|
-
|
171
|
+
@declare = ret
|
168
172
|
end
|
169
|
-
def
|
173
|
+
def compute_input
|
170
174
|
temp = @vars.map do |var|
|
171
175
|
ret = ""
|
172
176
|
if var.type.is_a? TArray
|
@@ -186,9 +190,9 @@ module Gettc
|
|
186
190
|
end
|
187
191
|
ret
|
188
192
|
end
|
189
|
-
|
193
|
+
@input = temp.join "\nreader.next();\n\n"
|
190
194
|
end
|
191
|
-
def
|
195
|
+
def compute_output
|
192
196
|
ret = ""
|
193
197
|
caller = "solver." + @func.name + "("
|
194
198
|
temp = @vars.map do |var| var.name end
|
@@ -201,7 +205,7 @@ module Gettc
|
|
201
205
|
else
|
202
206
|
ret << "writer.write(" << caller << ");"
|
203
207
|
end
|
204
|
-
|
208
|
+
@output = ret
|
205
209
|
end
|
206
210
|
end
|
207
|
-
end
|
211
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
|
-
require "gettc/types"
|
1
|
+
require "gettc/types"
|
2
|
+
require "mkmf"
|
2
3
|
|
3
4
|
module Gettc
|
4
5
|
class Type
|
@@ -25,22 +26,44 @@ module Gettc
|
|
25
26
|
end
|
26
27
|
end
|
27
28
|
class PythonEngine
|
28
|
-
|
29
|
+
attr_reader :arglist, :input, :shebang
|
29
30
|
def initialize func, vars
|
30
|
-
|
31
|
-
@vars = vars
|
32
|
-
end
|
33
|
-
def vars_list
|
34
|
-
temp = @vars.map do |var|
|
31
|
+
temp = vars.map do |var|
|
35
32
|
var.name
|
36
33
|
end
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
temp = @vars.map do |var|
|
34
|
+
@arglist = temp.join ", "
|
35
|
+
|
36
|
+
temp = vars.map do |var|
|
41
37
|
var.name + ' = reader.next("' + var.type.to_s + '")'
|
42
38
|
end
|
43
|
-
|
39
|
+
@input = temp.join "\nreader.next()\n"
|
40
|
+
|
41
|
+
@shebang = "#! "
|
42
|
+
@shebang << python3_path
|
43
|
+
end
|
44
|
+
private
|
45
|
+
def python3_path
|
46
|
+
default = "/usr/bin/env python"
|
47
|
+
|
48
|
+
version = system_q("python --version").split
|
49
|
+
if version.size != 2 || version[0].upcase != "PYTHON" then
|
50
|
+
return default
|
51
|
+
end
|
52
|
+
|
53
|
+
version = version[1].split(".")[0].to_i
|
54
|
+
if version >= 3 then
|
55
|
+
return default
|
56
|
+
end
|
57
|
+
|
58
|
+
python3 = system_q "which python3"
|
59
|
+
return python3.empty? ? default : python3
|
60
|
+
rescue
|
61
|
+
return default
|
62
|
+
end
|
63
|
+
def system_q command
|
64
|
+
IO.popen command, err: [:child, :out] do |f|
|
65
|
+
return f.gets
|
66
|
+
end
|
44
67
|
end
|
45
68
|
end
|
46
|
-
end
|
69
|
+
end
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -17,10 +17,6 @@ setup :
|
|
17
17
|
main : <%= prob.name %>Runner.cpp <%= prob.name %>.cpp setup
|
18
18
|
$(COMPILER) -o $(OUTPUT_D)/<%= prob.name %>Runner $<
|
19
19
|
|
20
|
-
test : <%= prob.name %>Test.cpp <%= prob.name %>.cpp setup
|
21
|
-
$(COMPILER) -lboost_unit_test_framework -o $(OUTPUT_D)/<%= prob.name %>Test $<
|
22
|
-
$(OUTPUT_D)/<%= prob.name %>Test
|
23
|
-
|
24
20
|
demo : main
|
25
21
|
$(call run,verbose,demo)
|
26
22
|
|
@@ -31,4 +27,4 @@ sysv : main
|
|
31
27
|
$(call run,verbose,sys)
|
32
28
|
|
33
29
|
clean :
|
34
|
-
rm -rf $(OUTPUT_D)
|
30
|
+
rm -rf $(OUTPUT_D)
|
@@ -0,0 +1,29 @@
|
|
1
|
+
GETTC_HOME ?= $(HOME)/.gettc
|
2
|
+
OUTPUT_D =../../build/go
|
3
|
+
DATA_D = ../../data
|
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 : usage
|
9
|
+
|
10
|
+
usage :
|
11
|
+
@cat $(GETTC_HOME)/usage
|
12
|
+
|
13
|
+
setup :
|
14
|
+
if [ ! -d $(OUTPUT_D) ]; then mkdir -p $(OUTPUT_D); fi
|
15
|
+
|
16
|
+
main : <%= prob.name %>Runner.go <%= prob.name %>/<%= prob.name %>.go setup
|
17
|
+
export GOPATH="$$GOPATH<%= File::PATH_SEPARATOR %>$(GETTC_HOME)/include/go" && go build -o $(OUTPUT_D)/<%= prob.name %>Runner <%= prob.name %>Runner.go
|
18
|
+
|
19
|
+
demo : main
|
20
|
+
$(call run,verbose,demo)
|
21
|
+
|
22
|
+
sys : main
|
23
|
+
$(call run,quiet,sys)
|
24
|
+
|
25
|
+
sysv : main
|
26
|
+
$(call run,verbose,sys)
|
27
|
+
|
28
|
+
clean :
|
29
|
+
rm -rf $(OUTPUT_D)
|
@@ -0,0 +1,34 @@
|
|
1
|
+
package main
|
2
|
+
|
3
|
+
import (
|
4
|
+
"./<%= prob.name %>"
|
5
|
+
"fmt"
|
6
|
+
"os"
|
7
|
+
"topcoder"
|
8
|
+
)
|
9
|
+
<%
|
10
|
+
engine = GoEngine.new func, vars
|
11
|
+
%>
|
12
|
+
func main() {
|
13
|
+
if len(os.Args) < 3 {
|
14
|
+
fmt.Fprintf(os.Stderr, "Usage: %s <input_file> <output_file>", os.Args[0])
|
15
|
+
os.Exit(-1)
|
16
|
+
}
|
17
|
+
|
18
|
+
var (
|
19
|
+
fileHandle *os.File
|
20
|
+
errIO error
|
21
|
+
<%= engine.declare.join "\n#{' ' * 8}" %>
|
22
|
+
)
|
23
|
+
|
24
|
+
if fileHandle, errIO = os.Open(os.Args[1]); errIO != nil {
|
25
|
+
panic(errIO)
|
26
|
+
}
|
27
|
+
topcoder.Read(fileHandle, <%= engine.input %>)
|
28
|
+
fileHandle.Close()
|
29
|
+
|
30
|
+
if fileHandle, errIO = os.Create(os.Args[2]); errIO != nil {
|
31
|
+
panic(errIO)
|
32
|
+
}
|
33
|
+
topcoder.Write(fileHandle, <%= prob.name %>.<%= engine.func_name %>(<%= engine.output %>))
|
34
|
+
}
|
@@ -17,10 +17,6 @@ setup :
|
|
17
17
|
main : <%= prob.name %>Runner.hs <%= prob.name %>.hs setup
|
18
18
|
$(COMPILER) -o $(OUTPUT_D)/<%= prob.name %>Runner $<
|
19
19
|
|
20
|
-
test : <%= prob.name %>Test.hs <%= prob.name %>.hs setup
|
21
|
-
$(COMPILER) -o $(OUTPUT_D)/<%= prob.name %>Test $<
|
22
|
-
$(OUTPUT_D)/<%= prob.name %>Test
|
23
|
-
|
24
20
|
demo : main
|
25
21
|
$(call run,verbose,demo)
|
26
22
|
|
@@ -31,4 +27,4 @@ sysv : main
|
|
31
27
|
$(call run,verbose,sys)
|
32
28
|
|
33
29
|
clean :
|
34
|
-
rm -rf $(OUTPUT_D)
|
30
|
+
rm -rf $(OUTPUT_D)
|
@@ -59,22 +59,6 @@ java -cp "`dirname $0`${path.separator}${lib}" <%= prob.name %>Runner $$*
|
|
59
59
|
<arg value="${output.dir}/sys"/>
|
60
60
|
</exec>
|
61
61
|
</target>
|
62
|
-
|
63
|
-
<target name="compile-test">
|
64
|
-
<mkdir dir="${output.dir}"/>
|
65
|
-
<javac srcdir="." destdir="${output.dir}"
|
66
|
-
includes="<%= prob.name %>.java,<%= prob.name %>Test.java"
|
67
|
-
includeantruntime="yes">
|
68
|
-
<classpath location="${output.dir}"/>
|
69
|
-
</javac>
|
70
|
-
</target>
|
71
|
-
<target name="test" depends="compile-test">
|
72
|
-
<junit fork="yes" haltonfailure="yes">
|
73
|
-
<classpath location="${output.dir}"/>
|
74
|
-
<formatter type="plain" usefile="false" />
|
75
|
-
<test name="<%= prob.name %>Test"/>
|
76
|
-
</junit>
|
77
|
-
</target>
|
78
62
|
|
79
63
|
<target name="clean">
|
80
64
|
<delete dir="${output.dir}"/>
|
@@ -1,5 +1,5 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
<%= engine = PythonEngine.new func, vars
|
2
|
+
engine.shebang %>
|
3
3
|
import os, sys
|
4
4
|
import <%= prob.name %>
|
5
5
|
|
@@ -15,10 +15,9 @@ def main():
|
|
15
15
|
input = fi.read()
|
16
16
|
reader = tc.Reader(input)
|
17
17
|
|
18
|
-
<%= engine
|
19
|
-
engine.input.gsub(/^/, ' ' * 8) %>
|
18
|
+
<%= engine.input.gsub(/^/, ' ' * 8) %>
|
20
19
|
|
21
|
-
result = <%= prob.name %>.<%= func.name %>(<%= engine.
|
20
|
+
result = <%= prob.name %>.<%= func.name %>(<%= engine.arglist %>)
|
22
21
|
with open(sys.argv[2], "w") as fo:
|
23
22
|
fo.write(tc.write(result, "<%= func.type %>"))
|
24
23
|
|