Class: AtCoderFriends::Generator::PythonRef
- Inherits:
-
Base
- Object
- Base
- AtCoderFriends::Generator::PythonRef
show all
- Includes:
- PythonRefConstants
- Defined in:
- lib/at_coder_friends/generator/python_ref.rb
Overview
generates Python source from problem description
Constant Summary
collapse
- ACF_HOME =
File.realpath(File.join(__dir__, '..', '..', '..'))
- TMPL_DIR =
File.join(ACF_HOME, 'templates')
- DEFAULT_TMPL =
File.join(TMPL_DIR, 'python_ref.py.erb')
- ATTRS =
Attributes.new(:py, DEFAULT_TMPL)
AtCoderFriends::Generator::PythonRefConstants::VERSION
Instance Method Summary
collapse
Instance Method Details
#attrs ⇒ Object
17
18
19
|
# File 'lib/at_coder_friends/generator/python_ref.rb', line 17
def attrs
ATTRS
end
|
#gen_cmb_decl(inpdef) ⇒ Object
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
# File 'lib/at_coder_friends/generator/python_ref.rb', line 110
def gen_cmb_decl(inpdef)
mx = inpdef.container == :varray_matrix ? -1 : 0
vs = inpdef.names.map { |v| "#{v}s" }
vs[mx] += 's'
sz = inpdef.size[0]
dcls = vs.map { |v| "#{v}[i]" }
dcls[mx] = "*#{dcls[mx]}" unless inpdef.item == :char
dcl = dcls.join(', ')
expr = gen_cmb_expr(inpdef)
ret = []
ret += vs.map { |v| "#{v} = [None for _ in range(#{sz})]" }
ret << "for i in range(#{sz}):"
ret << " #{dcl} = #{expr}"
ret
end
|
#gen_cmb_expr(inpdef) ⇒ Object
170
171
172
173
174
175
176
177
178
179
180
|
# File 'lib/at_coder_friends/generator/python_ref.rb', line 170
def gen_cmb_expr(inpdef)
read = gen_read(inpdef.delim)
case inpdef.item
when :number
"list(map(int, #{read}.split()))"
when :decimal
"list(map(float, #{read}.split()))"
when :string, :char
"#{read}.split()"
end
end
|
#gen_consts(constants = pbm.constants) ⇒ Object
26
27
28
29
30
|
# File 'lib/at_coder_friends/generator/python_ref.rb', line 26
def gen_consts(constants = pbm.constants)
constants
.select { |c| c.type == :mod }
.map { |c| gen_mod(c) }
end
|
#gen_decl(inpdef) ⇒ Object
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
# File 'lib/at_coder_friends/generator/python_ref.rb', line 41
def gen_decl(inpdef)
case inpdef.container
when :single
gen_single_decl(inpdef)
when :harray
gen_harray_decl(inpdef)
when :varray
gen_varray_decl(inpdef)
when :matrix
gen_matrix_decl(inpdef)
when :varray_matrix, :matrix_varray
gen_cmb_decl(inpdef)
when :vmatrix
gen_vmatrix_decl(inpdef)
when :hmatrix
gen_hmatrix_decl(inpdef)
end
end
|
#gen_decls(inpdefs = pbm.formats) ⇒ Object
37
38
39
|
# File 'lib/at_coder_friends/generator/python_ref.rb', line 37
def gen_decls(inpdefs = pbm.formats)
inpdefs.map { |inpdef| gen_decl(inpdef) }.flatten
end
|
#gen_expr(inpdef, split) ⇒ Object
156
157
158
159
160
161
162
163
164
165
166
167
168
|
# File 'lib/at_coder_friends/generator/python_ref.rb', line 156
def gen_expr(inpdef, split)
read = gen_read(inpdef.delim)
case inpdef.item
when :number
split ? "list(map(int, #{read}.split()))" : "int(#{read})"
when :decimal
split ? "list(map(float, #{read}.split()))" : "float(#{read})"
when :string
split ? "#{read}.split()" : read
when :char
read
end
end
|
#gen_harray_decl(inpdef) ⇒ Object
67
68
69
70
71
72
|
# File 'lib/at_coder_friends/generator/python_ref.rb', line 67
def gen_harray_decl(inpdef)
v = inpdef.names[0]
dcl = "#{v}s"
expr = gen_expr(inpdef, true)
"#{dcl} = #{expr}"
end
|
#gen_hmatrix_decl(inpdef) ⇒ Object
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
# File 'lib/at_coder_friends/generator/python_ref.rb', line 141
def gen_hmatrix_decl(inpdef)
names = inpdef.names
sz = inpdef.size[0]
dcls = names.map { |v| "#{v}ss[i]" }
expr = gen_expr(inpdef, true)
ret = []
ret += names.map { |v| "#{v}ss = [None for _ in range(#{sz})]" }
ret << "for i in range(#{sz}):"
ret << " line = #{expr}"
ret += dcls.map.with_index do |dcl, i|
" #{dcl} = line[#{i}::#{dcls.size}]"
end
ret
end
|
#gen_matrix_decl(inpdef) ⇒ Object
102
103
104
105
106
107
108
|
# File 'lib/at_coder_friends/generator/python_ref.rb', line 102
def gen_matrix_decl(inpdef)
v = inpdef.names[0]
sz = inpdef.size[0]
decl = "#{v}ss"
expr = gen_expr(inpdef, true)
"#{decl} = [#{expr} for _ in range(#{sz})]"
end
|
#gen_mod(c) ⇒ Object
32
33
34
35
|
# File 'lib/at_coder_friends/generator/python_ref.rb', line 32
def gen_mod(c)
v = c.value.gsub('^', '**').gsub(',', '_')
"MOD = #{v}"
end
|
#gen_read(delim) ⇒ Object
182
183
184
185
|
# File 'lib/at_coder_friends/generator/python_ref.rb', line 182
def gen_read(delim)
sub = delim.chars.map { |d| ".replace('#{d}', ' ')" }.join
"input()#{sub}"
end
|
#gen_single_decl(inpdef) ⇒ Object
60
61
62
63
64
65
|
# File 'lib/at_coder_friends/generator/python_ref.rb', line 60
def gen_single_decl(inpdef)
names = inpdef.names
dcl = names.join(', ')
expr = gen_expr(inpdef, names.size > 1)
"#{dcl} = #{expr}"
end
|
#gen_varray_1_decl(inpdef) ⇒ Object
82
83
84
85
86
87
88
|
# File 'lib/at_coder_friends/generator/python_ref.rb', line 82
def gen_varray_1_decl(inpdef)
v = inpdef.names[0]
sz = inpdef.size[0]
dcl = "#{v}s"
expr = gen_expr(inpdef, false)
"#{dcl} = [#{expr} for _ in range(#{sz})]"
end
|
#gen_varray_decl(inpdef) ⇒ Object
74
75
76
77
78
79
80
|
# File 'lib/at_coder_friends/generator/python_ref.rb', line 74
def gen_varray_decl(inpdef)
if inpdef.names.size == 1
gen_varray_1_decl(inpdef)
else
gen_varray_n_decl(inpdef)
end
end
|
#gen_varray_n_decl(inpdef) ⇒ Object
90
91
92
93
94
95
96
97
98
99
100
|
# File 'lib/at_coder_friends/generator/python_ref.rb', line 90
def gen_varray_n_decl(inpdef)
names = inpdef.names
sz = inpdef.size[0]
dcl = names.map { |v| "#{v}s[i]" }.join(', ')
expr = gen_expr(inpdef, true)
ret = []
ret += names.map { |v| "#{v}s = [None for _ in range(#{sz})]" }
ret << "for i in range(#{sz}):"
ret << " #{dcl} = #{expr}"
ret
end
|
#gen_vmatrix_decl(inpdef) ⇒ Object
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
# File 'lib/at_coder_friends/generator/python_ref.rb', line 126
def gen_vmatrix_decl(inpdef)
names = inpdef.names
sz1, sz2 = inpdef.size
dcl = names.map { |v| "#{v}ss[i][j]" }.join(', ')
expr = gen_expr(inpdef, true)
ret = []
ret += names.map do |v|
"#{v}ss = [[None for _ in range(#{sz2})] for _ in range(#{sz1})]"
end
ret << "for i in range(#{sz1}):"
ret << " for j in range(#{sz2}):"
ret << " #{dcl} = #{expr}"
ret
end
|
#render(src) ⇒ Object
21
22
23
24
|
# File 'lib/at_coder_friends/generator/python_ref.rb', line 21
def render(src)
src = embed_lines(src, '### CONSTS ###', gen_consts)
embed_lines(src, '### DCLS ###', gen_decls)
end
|