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
- #gen_cmb_input(inpdef) ⇒ Object
- #gen_input(inpdef) ⇒ Object
- #gen_plain_input(inpdef) ⇒ Object
- #scanf_addr(inpdef) ⇒ Object
- #scanf_fmt(inpdef) ⇒ Object
- #scanf_params(inpdef) ⇒ Object
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 |