class AtCoderFriends::Generator::RubyBuiltin

generates Ruby source from problem description

Constants

ACF_HOME
ATTRS
DEFAULT_TMPL
TMPL_DIR

Public Instance Methods

attrs() click to toggle source
# File lib/at_coder_friends/generator/ruby_builtin.rb, line 12
def attrs
  ATTRS
end
gen_cmb_decl(inpdef) click to toggle source
# File lib/at_coder_friends/generator/ruby_builtin.rb, line 107
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} = Array.new(#{sz})" }
  ret << "#{sz}.times do |i|"
  ret << "  #{dcl} = #{expr}"
  ret << 'end'
  ret
end
gen_cmb_expr(inpdef) click to toggle source
# File lib/at_coder_friends/generator/ruby_builtin.rb, line 168
def gen_cmb_expr(inpdef)
  read = gen_read(inpdef.delim)
  case inpdef.item
  when :number
    "#{read}.split.map(&:to_i)"
  when :decimal
    "#{read}.split.map(&:to_f)"
  when :string, :char
    "#{read}.chomp.split"
  end
end
gen_consts(constants = pbm.constants) click to toggle source
# File lib/at_coder_friends/generator/ruby_builtin.rb, line 22
def gen_consts(constants = pbm.constants)
  constants
    .select { |c| c.type == :mod }
    .map { |c| gen_mod(c) }
end
gen_decl(inpdef) click to toggle source
# File lib/at_coder_friends/generator/ruby_builtin.rb, line 37
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) click to toggle source
# File lib/at_coder_friends/generator/ruby_builtin.rb, line 33
def gen_decls(inpdefs = pbm.formats)
  inpdefs.map { |inpdef| gen_decl(inpdef) }.flatten
end
gen_expr(inpdef, split) click to toggle source
# File lib/at_coder_friends/generator/ruby_builtin.rb, line 154
def gen_expr(inpdef, split)
  read = gen_read(inpdef.delim)
  case inpdef.item
  when :number
    split ? "#{read}.split.map(&:to_i)" : "#{read}.to_i"
  when :decimal
    split ? "#{read}.split.map(&:to_f)" : "#{read}.to_f"
  when :string
    split ? "#{read}.chomp.split" : "#{read}.chomp"
  when :char
    'gets.chomp'
  end
end
gen_harray_decl(inpdef) click to toggle source
# File lib/at_coder_friends/generator/ruby_builtin.rb, line 63
def gen_harray_decl(inpdef)
  v = inpdef.names[0]
  dcl = "#{v}s"
  expr = gen_expr(inpdef, true)
  "#{dcl} = #{expr}"
end
gen_hmatrix_decl(inpdef) click to toggle source
# File lib/at_coder_friends/generator/ruby_builtin.rb, line 141
def gen_hmatrix_decl(inpdef)
  names = inpdef.names
  sz = inpdef.size[0]
  dcl = names.map { |v| "#{v}ss[i]" }.join(', ')
  expr = gen_expr(inpdef, true)
  ret = []
  ret += names.map { |v| "#{v}ss = Array.new(#{sz})" }
  ret << "#{sz}.times do |i|"
  ret << "  #{dcl} = #{expr}.each_slice(#{names.size}).to_a.transpose"
  ret << 'end'
  ret
end
gen_matrix_decl(inpdef) click to toggle source
# File lib/at_coder_friends/generator/ruby_builtin.rb, line 99
def gen_matrix_decl(inpdef)
  v = inpdef.names[0]
  sz = inpdef.size[0]
  decl = "#{v}ss"
  expr = gen_expr(inpdef, true)
  "#{decl} = Array.new(#{sz}) { #{expr} }"
end
gen_mod(c) click to toggle source
# File lib/at_coder_friends/generator/ruby_builtin.rb, line 28
def gen_mod(c)
  v = c.value.gsub('^', '**').gsub(',', '_')
  "MOD = #{v}"
end
gen_read(delim) click to toggle source
# File lib/at_coder_friends/generator/ruby_builtin.rb, line 180
def gen_read(delim)
  sub = delim.chars.map { |d| ".gsub('#{d}', ' ')" }.join
  "gets#{sub}"
end
gen_single_decl(inpdef) click to toggle source
# File lib/at_coder_friends/generator/ruby_builtin.rb, line 56
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) click to toggle source
# File lib/at_coder_friends/generator/ruby_builtin.rb, line 78
def gen_varray_1_decl(inpdef)
  v = inpdef.names[0]
  sz = inpdef.size[0]
  dcl = "#{v}s"
  expr = gen_expr(inpdef, false)
  "#{dcl} = Array.new(#{sz}) { #{expr} }"
end
gen_varray_decl(inpdef) click to toggle source
# File lib/at_coder_friends/generator/ruby_builtin.rb, line 70
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) click to toggle source
# File lib/at_coder_friends/generator/ruby_builtin.rb, line 86
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 = Array.new(#{sz})" }
  ret << "#{sz}.times do |i|"
  ret << "  #{dcl} = #{expr}"
  ret << 'end'
  ret
end
gen_vmatrix_decl(inpdef) click to toggle source
# File lib/at_coder_friends/generator/ruby_builtin.rb, line 124
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 = Array.new(#{sz1}) { Array.new(#{sz2}) }"
  end
  ret << "#{sz1}.times do |i|"
  ret << "  #{sz2}.times do |j|"
  ret << "    #{dcl} = #{expr}"
  ret << '  end'
  ret << 'end'
  ret
end
render(src) click to toggle source
# File lib/at_coder_friends/generator/ruby_builtin.rb, line 16
def render(src)
  src = embed_lines(src, '### CONSTS ###', gen_consts)
  src = embed_lines(src, '### DCLS ###', gen_decls)
  src
end