gettc 1.6.2 → 1.7
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.
- 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
|
|