Class: AtCoderFriends::Generator::PythonRef

Inherits:
Base
  • Object
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)

Constants included from PythonRefConstants

AtCoderFriends::Generator::PythonRefConstants::VERSION

Instance Method Summary collapse

Instance Method Details

#attrsObject



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