Module: AtCoderFriends::Generator::CxxBuiltinInputGen

Included in:
CxxBuiltin
Defined in:
lib/at_coder_friends/generator/cxx_builtin.rb

Overview

generates C++ input source

Constant Summary collapse

SCANF_FMTS =
[
  'scanf("%<fmt>s", %<addr>s);',
  'REP(i, %<sz1>s) scanf("%<fmt>s", %<addr>s);',
  'REP(i, %<sz1>s) REP(j, %<sz2>s) scanf("%<fmt>s", %<addr>s);'
].freeze
SCANF_FMTS_CMB =
{
  varray_matrix:
    [
      "        REP(i, %<sz1>s) {\n          scanf(\"%<fmt1>s\", %<addr1>s);\n          scanf(\"%<fmt2>s\", %<addr2>s);\n        }\n      TEXT\n      <<~TEXT\n        REP(i, %<sz1>s) {\n          scanf(\"%<fmt1>s\", %<addr1>s);\n          REP(j, %<sz2>s[i]) scanf(\"%<fmt2>s\", %<addr2>s);\n        }\n      TEXT\n    ],\n  matrix_varray:\n    [\n      <<~TEXT,\n        REP(i, %<sz1>s) {\n          scanf(\"%<fmt1>s\", %<addr1>s);\n          scanf(\"%<fmt2>s\", %<addr2>s);\n        }\n      TEXT\n      <<~TEXT\n        REP(i, %<sz1>s) {\n          REP(j, %<sz2>s) scanf(\"%<fmt1>s\", %<addr1>s);\n          scanf(\"%<fmt2>s\", %<addr2>s);\n        }\n      TEXT\n    ]\n}.tap { |h| h.default = h[:varray_matrix] }\n",
FMT_FMTS =
{
  number: '%d',
  decimal: '%lf',
  string: '%s',
  char: '%s'
}.tap { |h| h.default = h[:number] }
SINGLE_ADDR_FMTS =
{
  number: '&%<v>s',
  decimal: '&%<v>s',
  string: '%<v>s'
}.tap { |h| h.default = h[:number] }
ARRAY_ADDR_FMTS =
{
  number: '%<v>s + i',
  decimal: '%<v>s + i',
  string: '%<v>s[i]',
  char: '%<v>s'
}.tap { |h| h.default = h[:number] }
MATRIX_ADDR_FMTS =
{
  number: '&%<v>s[i][j]',
  decimal: '&%<v>s[i][j]',
  string: '%<v>s[i][j]',
  char: '%<v>s[i]'
}.tap { |h| h.default = h[:number] }
ADDR_FMTS =
{
  single: SINGLE_ADDR_FMTS,
  harray: ARRAY_ADDR_FMTS,
  varray: ARRAY_ADDR_FMTS,
  matrix: MATRIX_ADDR_FMTS,
  vmatrix: MATRIX_ADDR_FMTS,
  hmatrix: MATRIX_ADDR_FMTS
}.tap { |h| h.default = h[:single] }

Instance Method Summary collapse

Instance Method Details

#gen_cmb_input(inpdef) ⇒ Object



191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
# File 'lib/at_coder_friends/generator/cxx_builtin.rb', line 191

def gen_cmb_input(inpdef)
  scanf = SCANF_FMTS_CMB.dig(
    inpdef.container, inpdef.item == :char ? 0 : 1
  )
  sz1 = inpdef.size[0]
  sz2 = inpdef.size[1].split('_')[0]
  fmt1, addr1, fmt2, addr2 =
    inpdef.components.map { |cmp| scanf_params(cmp) }.flatten
  format(
    scanf,
    sz1: sz1, sz2: sz2,
    fmt1: fmt1, addr1: addr1,
    fmt2: fmt2, addr2: addr2
  ).split("\n")
end

#gen_input(inpdef) ⇒ Object



176
177
178
179
180
181
182
# File 'lib/at_coder_friends/generator/cxx_builtin.rb', line 176

def gen_input(inpdef)
  if inpdef.components
    gen_cmb_input(inpdef)
  else
    gen_plain_input(inpdef)
  end
end

#gen_plain_input(inpdef) ⇒ Object



184
185
186
187
188
189
# File 'lib/at_coder_friends/generator/cxx_builtin.rb', line 184

def gen_plain_input(inpdef)
  scanf = SCANF_FMTS[inpdef.size.size - (inpdef.item == :char ? 1 : 0)]
  sz1, sz2 = inpdef.size
  fmt, addr = scanf_params(inpdef)
  format(scanf, sz1: sz1, sz2: sz2, fmt: fmt, addr: addr)
end

#scanf_addr(inpdef) ⇒ Object



215
216
217
218
219
220
# File 'lib/at_coder_friends/generator/cxx_builtin.rb', line 215

def scanf_addr(inpdef)
  inpdef.vars.map do |(v, item)|
    addr_fmt = ADDR_FMTS.dig(inpdef.container, item)
    format(addr_fmt, v: v)
  end.join(', ')
end

#scanf_fmt(inpdef) ⇒ Object



211
212
213
# File 'lib/at_coder_friends/generator/cxx_builtin.rb', line 211

def scanf_fmt(inpdef)
  inpdef.vars.map { |(_v, item)| FMT_FMTS[item] }.join
end

#scanf_params(inpdef) ⇒ Object



207
208
209
# File 'lib/at_coder_friends/generator/cxx_builtin.rb', line 207

def scanf_params(inpdef)
  [scanf_fmt(inpdef), scanf_addr(inpdef)]
end