at_coder_friends 0.6.2 → 0.6.3
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/CHANGELOG.md +20 -0
- data/Gemfile.lock +2 -2
- data/docs/CONFIGURATION.md +2 -4
- data/lib/at_coder_friends/generator/base.rb +41 -0
- data/lib/at_coder_friends/generator/cxx_builtin.rb +196 -143
- data/lib/at_coder_friends/generator/main.rb +7 -2
- data/lib/at_coder_friends/generator/ruby_builtin.rb +97 -51
- data/lib/at_coder_friends/parser/input_format.rb +387 -188
- data/lib/at_coder_friends/parser/input_type.rb +91 -0
- data/lib/at_coder_friends/parser/main.rb +1 -0
- data/lib/at_coder_friends/problem.rb +81 -6
- data/lib/at_coder_friends/version.rb +1 -1
- data/lib/at_coder_friends.rb +2 -0
- data/tasks/regression/check_const.rake +15 -14
- data/tasks/regression/check_diff.rake +2 -2
- data/tasks/regression/check_fmt.rake +18 -15
- data/tasks/regression/check_parse.rake +3 -4
- data/tasks/regression/list_handler.rb +46 -0
- data/tasks/regression/regression.rb +7 -41
- data/tasks/regression/report_handler.rb +20 -0
- data/tasks/regression/section_list.rake +1 -1
- data/templates/{cxx_builtin_interactive.cxx → cxx_builtin.cxx.erb} +33 -2
- data/templates/{ruby_builtin_interactive.rb → ruby_builtin.rb.erb} +17 -2
- metadata +8 -6
- data/templates/cxx_builtin_default.cxx +0 -26
- data/templates/ruby_builtin_default.rb +0 -7
@@ -3,43 +3,20 @@
|
|
3
3
|
module AtCoderFriends
|
4
4
|
module Generator
|
5
5
|
# generates Ruby source from problem description
|
6
|
-
class RubyBuiltin
|
6
|
+
class RubyBuiltin < Base
|
7
7
|
ACF_HOME = File.realpath(File.join(__dir__, '..', '..', '..'))
|
8
8
|
TMPL_DIR = File.join(ACF_HOME, 'templates')
|
9
|
-
DEFAULT_TMPL = File.join(TMPL_DIR, '
|
10
|
-
|
9
|
+
DEFAULT_TMPL = File.join(TMPL_DIR, 'ruby_builtin.rb.erb')
|
10
|
+
ATTRS = Attributes.new(:rb, DEFAULT_TMPL)
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
def initialize(cfg = nil)
|
15
|
-
@cfg = cfg || {}
|
16
|
-
end
|
17
|
-
|
18
|
-
def process(pbm)
|
19
|
-
src = generate(pbm)
|
20
|
-
pbm.add_src(:rb, src)
|
21
|
-
end
|
22
|
-
|
23
|
-
def generate(pbm)
|
24
|
-
@pbm = pbm
|
25
|
-
File
|
26
|
-
.read(select_template)
|
27
|
-
.gsub('### URL ###', pbm.url)
|
28
|
-
.gsub('### CONSTS ###', gen_consts.join("\n"))
|
29
|
-
.gsub('### DCLS ###', gen_decls.join("\n"))
|
30
|
-
.gsub('### OUTPUT ###', gen_output)
|
12
|
+
def attrs
|
13
|
+
ATTRS
|
31
14
|
end
|
32
15
|
|
33
|
-
def
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
def default_template
|
38
|
-
cfg['default_template'] || DEFAULT_TMPL
|
39
|
-
end
|
40
|
-
|
41
|
-
def interactive_template
|
42
|
-
cfg['interactive_template'] || INTERACTIVE_TMPL
|
16
|
+
def render(src)
|
17
|
+
src = embed_lines(src, '### CONSTS ###', gen_consts)
|
18
|
+
src = embed_lines(src, '### DCLS ###', gen_decls)
|
19
|
+
src
|
43
20
|
end
|
44
21
|
|
45
22
|
def gen_consts(constants = pbm.constants)
|
@@ -64,35 +41,45 @@ module AtCoderFriends
|
|
64
41
|
when :harray
|
65
42
|
gen_harray_decl(inpdef)
|
66
43
|
when :varray
|
67
|
-
|
68
|
-
gen_varray_1_decl(inpdef)
|
69
|
-
else
|
70
|
-
gen_varray_n_decl(inpdef)
|
71
|
-
end
|
44
|
+
gen_varray_decl(inpdef)
|
72
45
|
when :matrix
|
73
46
|
gen_matrix_decl(inpdef)
|
47
|
+
when :varray_matrix, :matrix_varray
|
48
|
+
gen_cmb_decl(inpdef)
|
49
|
+
when :vmatrix
|
50
|
+
gen_vmatrix_decl(inpdef)
|
51
|
+
when :hmatrix
|
52
|
+
gen_hmatrix_decl(inpdef)
|
74
53
|
end
|
75
54
|
end
|
76
55
|
|
77
56
|
def gen_single_decl(inpdef)
|
78
57
|
names = inpdef.names
|
79
58
|
dcl = names.join(', ')
|
80
|
-
expr = gen_expr(inpdef
|
59
|
+
expr = gen_expr(inpdef, names.size > 1)
|
81
60
|
"#{dcl} = #{expr}"
|
82
61
|
end
|
83
62
|
|
84
63
|
def gen_harray_decl(inpdef)
|
85
64
|
v = inpdef.names[0]
|
86
65
|
dcl = "#{v}s"
|
87
|
-
expr = gen_expr(inpdef
|
66
|
+
expr = gen_expr(inpdef, true)
|
88
67
|
"#{dcl} = #{expr}"
|
89
68
|
end
|
90
69
|
|
70
|
+
def gen_varray_decl(inpdef)
|
71
|
+
if inpdef.names.size == 1
|
72
|
+
gen_varray_1_decl(inpdef)
|
73
|
+
else
|
74
|
+
gen_varray_n_decl(inpdef)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
91
78
|
def gen_varray_1_decl(inpdef)
|
92
79
|
v = inpdef.names[0]
|
93
80
|
sz = inpdef.size[0]
|
94
81
|
dcl = "#{v}s"
|
95
|
-
expr = gen_expr(inpdef
|
82
|
+
expr = gen_expr(inpdef, false)
|
96
83
|
"#{dcl} = Array.new(#{sz}) { #{expr} }"
|
97
84
|
end
|
98
85
|
|
@@ -100,7 +87,7 @@ module AtCoderFriends
|
|
100
87
|
names = inpdef.names
|
101
88
|
sz = inpdef.size[0]
|
102
89
|
dcl = names.map { |v| "#{v}s[i]" }.join(', ')
|
103
|
-
expr = gen_expr(inpdef
|
90
|
+
expr = gen_expr(inpdef, true)
|
104
91
|
ret = []
|
105
92
|
ret += names.map { |v| "#{v}s = Array.new(#{sz})" }
|
106
93
|
ret << "#{sz}.times do |i|"
|
@@ -113,28 +100,87 @@ module AtCoderFriends
|
|
113
100
|
v = inpdef.names[0]
|
114
101
|
sz = inpdef.size[0]
|
115
102
|
decl = "#{v}ss"
|
116
|
-
expr = gen_expr(inpdef
|
103
|
+
expr = gen_expr(inpdef, true)
|
117
104
|
"#{decl} = Array.new(#{sz}) { #{expr} }"
|
118
105
|
end
|
119
106
|
|
120
|
-
def
|
121
|
-
|
107
|
+
def gen_cmb_decl(inpdef)
|
108
|
+
mx = inpdef.container == :varray_matrix ? -1 : 0
|
109
|
+
vs = inpdef.names.map { |v| "#{v}s" }
|
110
|
+
vs[mx] += 's'
|
111
|
+
sz = inpdef.size[0]
|
112
|
+
dcls = vs.map { |v| "#{v}[i]" }
|
113
|
+
dcls[mx] = '*' + dcls[mx] unless inpdef.item == :char
|
114
|
+
dcl = dcls.join(', ')
|
115
|
+
expr = gen_cmb_expr(inpdef)
|
116
|
+
ret = []
|
117
|
+
ret += vs.map { |v| "#{v} = Array.new(#{sz})" }
|
118
|
+
ret << "#{sz}.times do |i|"
|
119
|
+
ret << " #{dcl} = #{expr}"
|
120
|
+
ret << 'end'
|
121
|
+
ret
|
122
|
+
end
|
123
|
+
|
124
|
+
def gen_vmatrix_decl(inpdef)
|
125
|
+
names = inpdef.names
|
126
|
+
sz1, sz2 = inpdef.size
|
127
|
+
dcl = names.map { |v| "#{v}ss[i][j]" }.join(', ')
|
128
|
+
expr = gen_expr(inpdef, true)
|
129
|
+
ret = []
|
130
|
+
ret += names.map do |v|
|
131
|
+
"#{v}ss = Array.new(#{sz1}) { Array.new(#{sz2}) }"
|
132
|
+
end
|
133
|
+
ret << "#{sz1}.times do |i|"
|
134
|
+
ret << " #{sz2}.times do |j|"
|
135
|
+
ret << " #{dcl} = #{expr}"
|
136
|
+
ret << ' end'
|
137
|
+
ret << 'end'
|
138
|
+
ret
|
139
|
+
end
|
140
|
+
|
141
|
+
def gen_hmatrix_decl(inpdef)
|
142
|
+
names = inpdef.names
|
143
|
+
sz = inpdef.size[0]
|
144
|
+
dcl = names.map { |v| "#{v}ss[i]" }.join(', ')
|
145
|
+
expr = gen_expr(inpdef, true)
|
146
|
+
ret = []
|
147
|
+
ret += names.map { |v| "#{v}ss = Array.new(#{sz})" }
|
148
|
+
ret << "#{sz}.times do |i|"
|
149
|
+
ret << " #{dcl} = #{expr}.each_slice(#{names.size}).to_a.transpose"
|
150
|
+
ret << 'end'
|
151
|
+
ret
|
152
|
+
end
|
153
|
+
|
154
|
+
def gen_expr(inpdef, split)
|
155
|
+
read = gen_read(inpdef.delim)
|
156
|
+
case inpdef.item
|
122
157
|
when :number
|
123
|
-
split ?
|
158
|
+
split ? "#{read}.split.map(&:to_i)" : "#{read}.to_i"
|
159
|
+
when :decimal
|
160
|
+
split ? "#{read}.split.map(&:to_f)" : "#{read}.to_f"
|
124
161
|
when :string
|
125
|
-
split ?
|
162
|
+
split ? "#{read}.chomp.split" : "#{read}.chomp"
|
126
163
|
when :char
|
127
164
|
'gets.chomp'
|
128
165
|
end
|
129
166
|
end
|
130
167
|
|
131
|
-
def
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
168
|
+
def gen_cmb_expr(inpdef)
|
169
|
+
read = gen_read(inpdef.delim)
|
170
|
+
case inpdef.item
|
171
|
+
when :number
|
172
|
+
"#{read}.split.map(&:to_i)"
|
173
|
+
when :decimal
|
174
|
+
"#{read}.split.map(&:to_f)"
|
175
|
+
when :string, :char
|
176
|
+
"#{read}.chomp.split"
|
136
177
|
end
|
137
178
|
end
|
179
|
+
|
180
|
+
def gen_read(delim)
|
181
|
+
sub = delim.chars.map { |d| ".gsub('#{d}', ' ')" }.join
|
182
|
+
"gets#{sub}"
|
183
|
+
end
|
138
184
|
end
|
139
185
|
end
|
140
186
|
end
|