Skip to content

Commit e15edd6

Browse files
committed
Merge branch 'test_fmtprediction'
2 parents 3a696fe + 1e33460 commit e15edd6

File tree

60 files changed

+6
-1454
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+6
-1454
lines changed

README.md

Lines changed: 1 addition & 147 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,7 @@ optional arguments:
294294
- `run_command="./main.out"` コンパイルしたプログラムを`atcoder-tools test`で実行する場合に実行されるコマンド
295295

296296

297+
297298
```toml
298299
[codestyle]
299300
indent_type='space' # 'tab' or 'space'
@@ -305,61 +306,20 @@ code_generator_file="~/custom_code_generator.py"
305306
[postprocess]
306307
exec_on_each_problem_dir='clang-format -i ./*.cpp'
307308
exec_on_contest_dir='touch CMakeLists.txt'
308-
<<<<<<< HEAD
309-
310-
[run]
311-
compile_command="g++ main.cpp -o main.out"
312-
run_command="./main.out"
313-
314-
=======
315309
[compiler]
316310
compile_command='g++ main.cpp -o main -std=c++17'
317311
compile_only_when_diff_detected=true
318312
[tester]
319313
compile_before_testing=true
320314
compile_only_when_diff_detected=true
321315
timeout_adjustment=1.2
322-
>>>>>>> test_fmtprediction
323316
[etc]
324317
download_without_login=false
325318
parallel_download=false
326319
save_no_session_cache=false
327320
skip_existing_problems=false
328321
in_example_format="in_{}.txt"
329322
out_example_format="out_{}.txt"
330-
<<<<<<< HEAD
331-
compile_before_testing=false
332-
compile_only_when_diff_detected=false
333-
334-
```
335-
336-
### 言語毎の設定
337-
バージョン1.1.7以降では、言語毎に`codestyle`, `postprocess`, `run`を指定できます。
338-
339-
`(言語名).(設定カテゴリ名)`に対して設定を行うと、言語毎の設定になります。言語名が無い場合の通常の指定は共通のデフォルト設定として扱われます。
340-
atcoder-tools起動時に使われる言語固有の設定は、`--lang` プログラム引数が存在すればそれを、なければ`codestyle.lang`に指定された値に基づきます。
341-
`(言語名).codestyle.lang`は無視されます。
342-
343-
以下の設定では、
344-
- 共通のコードスタイルとしてインデント幅が4のスペースインデントを用いる。`--lang`引数無しで起動した際に使用される言語はPythonである。ただし
345-
- c++のコード生成においてはタブインデントを用い(幅は4のまま)、加えてC++用のpostprocess設定を用いる。
346-
- Pythonのコード生成においてはインデント幅を2とする。
347-
```toml
348-
[codestyle]
349-
lang='python'
350-
indent_type='space'
351-
indent_width=4
352-
[cpp.codestyle]
353-
indent_type='tab'
354-
code_generator_file="~/custom_code_generator.py"
355-
[cpp.postprocess]
356-
exec_on_each_problem_dir='clang-format -i ./*.cpp'
357-
exec_on_contest_dir='touch CMakeLists.txt'
358-
[java.run]
359-
360-
[python.codestyle]
361-
indent_width=2
362-
=======
363323
```
364324

365325
また、以下のように提出時にコマンドを実行してその結果を提出することが可能です。C++以外のAC-libraryを自動に展開するような用途で用いることができます。下記の例はNim言語でACLのexpanderを実行しその出力ファイルを提出し、その後ローカルの出力ファイルを削除するという設定です。
@@ -374,44 +334,22 @@ indent_width=2
374334
exec_before_submit='rm ./combined.nim | python3 ~/git/Nim-ACL/expander.py main.nim --lib /home/chaemon/git/Nim-ACL/ -s'
375335
exec_after_submit='rm ./combined.nim'
376336
submit_filename='./combined.nim'
377-
>>>>>>> test_fmtprediction
378337
```
379338

380339

381340
### カスタムコードジェネレーター
382341
[標準のC++コードジェネレーター](https://github.com/kyuridenamida/atcoder-tools/blob/master/atcodertools/codegen/code_generators/cpp.py)に倣って、
383342
`(CogeGenArgs) -> str(ソースコード)`が型であるような`main`関数を定義した.pyファイルを`code_generator_file`で指定すると、コード生成時にカスタムコードジェネレーターを利用できます。
384343

385-
<<<<<<< HEAD
386-
### ユニバーサルコードジェネレーター
387-
ユニバーサルコードジェネレータはループ・配列アクセス方法等のいくつかの言語仕様を記述するだけでカスタムコードジェネレータよりも簡単にコード生成することを意図して作成したジェネレータです。設定ファイル`(言語名).toml``atcodertools/codegen/code_generators/universal_generator`に配置してください。設定ファイルの書き方は以下です。
388-
=======
389344

390345
### ユニバーサルコードジェネレーター
391346
ユニバーサルコードジェネレーターはループ・配列アクセス方法等のいくつかの言語仕様を記述するだけでカスタムコードジェネレーターよりも簡単にコード生成することを意図して作成したジェネレーターです。設定ファイルの`code_generator_toml`で指定します。書き方は以下です。
392-
>>>>>>> test_fmtprediction
393347

394348
- *base_indent* 入力部分のインデント数
395349
- *insert_space_around_operators* 入力部分の変数や演算子の間にスペースを入れるかどうかをtrue/falseで指定
396350
- *newline_after_input* 入力部分で入力ごとに空行を入れるかどうかをtrue/falseで指定
397351
- *global_prefix* グローバル変数の宣言時に入れる接頭辞(Javaなどでstaticを指定したりできます)
398352

399-
<<<<<<< HEAD
400-
以下のようにテーブルを定義します
401-
402-
- *[index]* ループインデックスの名称を指定します。1重目を`i`, 2重目を`j`で指定してください。省略可能で省略した場合はi, jが指定されます。perl, phpなどの言語で$i, $jなどとi, j以外の名前を指定しなければならないとき用のつもりです。
403-
- *[loop]* ループに関することを記述します
404-
- **header** ループの最初に記述する内容。ループを回すための変数は`{loop_var}`, 回す回数は`{length}`を用いてください。
405-
- **footer** ループの最後に記述する内容。C++, Javaでは閉じカッコになります。波括弧の場合は`}}`とエスケープする必要があることに注意してください。
406-
- *[type]* タイプ(int, float, string)のタイプについて記述します。例を参照してください。
407-
- *[default]* デフォルトの値について記述します。例を参照してください。
408-
- *[declare]* int, float, string, 1次元可変配列(以下`seq`), 2次元可変配列(以下`2d_seq`)の宣言方法について記述します。変数名は`{name}`を使ってください。可変配列のベースとなるタイプは`{type}`を使ってください。
409-
- *[allocate]* `seq`, `2d_seq`の確保の方法を記述します。ベースとなるタイプは`{type}`, 変数名は`{name}`, デフォルト値は`{default}`で指定します。タイプ、デフォルト値は上記で指定したものが入ります。長さについてはseqは`{length}`で、`2d_seq`は1番目の長さは`{length_i}`, 2番目の長さは`{length_j}`となります。順番を間違えると転置されるのでご注意ください。
410-
- *[declare_and_allocate]* `seq`, `2d_seq`について宣言と確保を同時に行う方法について記述します。フォーマットに使用されるものは`[allocate]`と同じです。
411-
- *[input]*
412-
413-
- *[arg]* solve関数の引数の記述方法について指定します。`int`, `float`, `string`, `seq`, `2d_seq`について記述してください。`{name}`が変数名, `{type}``seq`, `2d_seq`についてベースとなる型です。
414-
=======
415353
以下のようにテーブルを定義します。各項目はダブルコーテーションあるいはシングルコーテーションを用いた文字列で指定します。Pythonのformatメソッドに渡されるため、波括弧等の文字を直に書きたい場合はエスケープする必要があります。
416354
テーブルのキーは整数(int), 浮動小数(float), 文字列(str), およびこれら3つを使った1次元配列(seq), 2次元配列(2d_seq)となっています。
417355

@@ -423,16 +361,10 @@ submit_filename='./combined.nim'
423361
- *[default]* デフォルトの値について記述します。例を参照してください。注意: TOMLの表記に癖があるようで、ダブルコーテーション2つ(空の文字列)を表記する際にはstr='""'とするとよいようです。"\"\""だとエラーになるようです。
424362
- *[input_func]* int, float, strについて入力時に呼び出す関数を記述します。
425363
- *[arg]* solve関数の引数の記述方法について指定します。`int`, `float`, `str`, `seq`, `2d_seq`について記述してください。`{name}`が変数名, `{type}``seq`, `2d_seq`についてベースとなる型です。
426-
>>>>>>> test_fmtprediction
427364
- *[actual_arg]* `seq`, `2d_seq`についてsolve関数を呼び出す際の引数の渡し方について記述します。C++などでmoveをつかってメモリを節約したいときなどに指定できます。省略可能で、省略した場合はそのまま渡されます。
428365

429366
- *[access]* 配列のアクセス方法について記述します。`seq`, `2d_seq`について指定してください。`{name}`で変数名, `{index_i}`, `{index_j}`でインデックス名を指定します。
430367

431-
<<<<<<< HEAD
432-
以下は入力コードの冗長性を下げる目的で指定するテーブルで省略可能なものです。指定方法についてはpythonの設定を参照してください。
433-
434-
- *[input_func]* int, float, stringについて入力時に呼び出す関数を記述します。
435-
=======
436368

437369
以下は宣言・確保・入力を行うためのコードを記述します。いくつかを同時に行う方法も指定できます。いずれも一行または複数行に渡る指定が可能でセミコロン等の終端子も(必要な言語では)記述してください。
438370
キーワードとして`{name}`, `{type}`はそれぞれ対象となる変数名、タイプ名で、上記で指定した`{default}`が使えます。また、指定していれば`{input_func}`も使えます。`seq`, `2d_seq`の場合は`{type}`はベースとなる型名になります(`vector<int>`における`int`)のでご注意ください。また、`seq`の長さは`{length}`, `2d_seq`の長さは`{length_i}`, `{length_j}`となっています。
@@ -444,7 +376,6 @@ submit_filename='./combined.nim'
444376

445377
以下は入力コードの冗長性を下げる目的で指定するテーブルで省略可能なものです。指定方法についてはPythonの設定を参照してください。
446378

447-
>>>>>>> test_fmtprediction
448379
- *[allocate_and_input]* `seq`, `2d_seq`について確保と入力をまとめて行うことができる場合に記述します。省略した場合、上記で指定した確保と入力の方式を複合したものが挿入されます
449380
- *[declare_and_allocate_and_input]* `seq`, `2d_seq`について宣言・確保・入力をまとめて行うことができる場合に記述します。省略した場合、上記で指定した宣言と確保と入力の方式を複合したものが挿入されます
450381

@@ -465,19 +396,12 @@ footer = "}}"
465396
[type]
466397
int = "long long"
467398
float = "long double"
468-
<<<<<<< HEAD
469-
string = "std::string"
470-
=======
471399
str = "std::string"
472-
>>>>>>> test_fmtprediction
473400

474401
# デフォルト値
475402
[default]
476403
int = "0"
477404
float = "0.0"
478-
<<<<<<< HEAD
479-
string = "\"\""
480-
=======
481405
str = '""'
482406

483407
# 引数
@@ -497,19 +421,13 @@ seq = "std::move({name})"
497421
[access]
498422
seq = "{name}[{index}]"
499423
2d_seq = "{name}[{index_i}][{index_j}]"
500-
>>>>>>> test_fmtprediction
501424

502425
# 宣言
503426
[declare]
504427
int = "long long {name};"
505428
float = "long double {name};"
506-
<<<<<<< HEAD
507-
string = "std::string {name};"
508-
seq = "std::std::vector<{type}> {name};"
509-
=======
510429
str = "std::string {name};"
511430
seq = "std::vector<{type}> {name};"
512-
>>>>>>> test_fmtprediction
513431
2d_seq = "std::vector<std::vector<{type}>> {name};"
514432

515433
# 確保
@@ -525,41 +443,13 @@ seq = "std::vector<{type}> {name}({length});"
525443
# 入力
526444
[input]
527445
#int = "std::cin >> {name};"
528-
<<<<<<< HEAD
529-
int = "scanf(\"%lld\",&{name});"
530-
#float = "std::cin >> {name};"
531-
float = "scanf(\"%Lf\",&{name});"
532-
string = "std::cin >> {name};"
533-
534-
# 引数
535-
[arg]
536-
int = "long long {name}"
537-
float = "double {name}"
538-
string = "std::string {name}"
539-
seq = "std::vector<{type}> {name}"
540-
2d_seq = "std::vector<std::vector<{type}>> {name}"
541-
542-
# 引数への渡し方
543-
[actual_arg]
544-
seq = "std::move({name})"
545-
2d_seq = "std::move({name})"
546-
547-
# 配列アクセス
548-
[access]
549-
seq = "{name}[{index_i}]"
550-
2d_seq = "{name}[{index_i}][{index_j}]"
551-
```
552-
553-
例えばpythonでの設定方法は以下です。
554-
=======
555446
int = "std::scanf(\"%lld\", &{name});"
556447
#float = "std::cin >> {name};"
557448
float = "std::scanf(\"%Lf\", &{name});"
558449
str = "std::cin >> {name};"
559450
```
560451

561452
例えばPythonでの設定方法は以下です。
562-
>>>>>>> test_fmtprediction
563453
```toml
564454
base_indent = 1
565455
insert_space_around_operators = true
@@ -581,31 +471,19 @@ footer = ""
581471
[type]
582472
int = "int"
583473
float = "float"
584-
<<<<<<< HEAD
585-
string = "str"
586-
=======
587474
str = "str"
588-
>>>>>>> test_fmtprediction
589475

590476
# デフォルト値
591477
[default]
592478
int = "int()"
593479
float = "float()"
594-
<<<<<<< HEAD
595-
string = "str()"
596-
=======
597480
str = "str()"
598-
>>>>>>> test_fmtprediction
599481

600482
# 宣言
601483
[declare]
602484
int = ""
603485
float = ""
604-
<<<<<<< HEAD
605-
string = ""
606-
=======
607486
str = ""
608-
>>>>>>> test_fmtprediction
609487
seq = ""
610488
2d_seq = ""
611489

@@ -623,21 +501,6 @@ self.declare_and_allocate_2d_seq = "{name} = [[{default}] * ({length_j}) for _ i
623501
[input_func]
624502
int = "int(next(tokens))"
625503
float = "float(next(tokens))"
626-
<<<<<<< HEAD
627-
string = "next(tokens)"
628-
629-
# 入力
630-
[input]
631-
int = "{name} = int(next(tokens))"
632-
float = "{name} = float(next(tokens))"
633-
string = "{name} = next(tokens)"
634-
635-
# 宣言と入力
636-
[declare_and_input]
637-
int = "{name} = int(next(tokens)) # type: int"
638-
float = "{name} = float(next(tokens)) # type: float"
639-
string = "{name} = next(tokens) # type: str"
640-
=======
641504
str = "next(tokens)"
642505

643506
# 入力
@@ -651,7 +514,6 @@ str = "{name} = {input_func}"
651514
int = "{name} = {input_func} # type: int"
652515
float = "{name} = {input_func} # type: float"
653516
str = "{name} = {input_func} # type: str"
654-
>>>>>>> test_fmtprediction
655517

656518
# 確保と入力
657519
[allocate_and_input]
@@ -667,21 +529,13 @@ seq = "{name} = [{input_func} for _ in range({length})] # type: \"List[{type}]\
667529
[arg]
668530
int = "{name}: int"
669531
float = "{name}: float"
670-
<<<<<<< HEAD
671-
string = "{name}: str"
672-
=======
673532
str = "{name}: str"
674-
>>>>>>> test_fmtprediction
675533
seq = "{name}: \"List[{type}]\""
676534
2d_seq = "{name}: \"List[List[{type}]]\""
677535

678536
# 配列アクセス
679537
[access]
680-
<<<<<<< HEAD
681-
seq = "{name}[{index_i}]"
682-
=======
683538
seq = "{name}[{index}]"
684-
>>>>>>> test_fmtprediction
685539
2d_seq = "{name}[{index_i}][{index_j}]"
686540
```
687541

atcodertools/atcoder_tools.py

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,8 @@
99
from atcodertools.tools.tester import main as tester_main
1010
from atcodertools.tools.submit import main as submit_main
1111
from atcodertools.tools.codegen import main as codegen_main
12-
<<<<<<< HEAD
13-
from atcodertools.tools.setter import main as setter_main
14-
from atcodertools.tools.compiler import main as compiler_main
15-
=======
1612
from atcodertools.tools.compiler import main as compiler_main
1713
from atcodertools.tools.setter import main as setter_main
18-
>>>>>>> test_fmtprediction
1914
from atcodertools.release_management.version import __version__
2015
from colorama import Fore, Style
2116

@@ -45,17 +40,15 @@ def notify_if_latest_version_found():
4540
def main():
4641
notify_if_latest_version_found()
4742

48-
<<<<<<< HEAD
49-
if len(sys.argv) < 2 or sys.argv[1] not in ("gen", "test", "submit", "codegen", "set", "version", "compile"):
50-
print("Usage:")
51-
print("{} gen -- to generate workspace".format(sys.argv[0]))
52-
=======
5343
if len(sys.argv) < 2 or sys.argv[1] not in ("gen", "test", "submit", "codegen", "compile", "set", "version"):
5444
print("Usage:")
5545
print("{} gen -- to generate workspace".format(sys.argv[0]))
5646
print(
5747
"{} compile -- to compile codes in your workspace".format(sys.argv[0]))
5848
print("{} test -- to test codes in your workspace".format(sys.argv[0]))
49+
print(
50+
"{} compile -- to compile codes in your workspace".format(sys.argv[0]))
51+
print("{} test -- to test codes in your workspace".format(sys.argv[0]))
5952
>>>>>>> test_fmtprediction
6053
print(
6154
"{} test -- to test your code in the workspace".format(sys.argv[0]))
@@ -69,6 +62,8 @@ def main():
6962
"{} codegen -- to generate code of the specified single problem".format(sys.argv[0]))
7063
print(
7164
"{} set -- to set some additional option(error value, language)".format(sys.argv[0]))
65+
print(
66+
"{} set -- to set some additional option(error value, language)".format(sys.argv[0]))
7267
print(
7368
"{} version -- show atcoder-tools version".format(sys.argv[0]))
7469
sys.exit(-1)
@@ -88,21 +83,12 @@ def main():
8883
if sys.argv[1] == "codegen":
8984
codegen_main(prog, args)
9085

91-
<<<<<<< HEAD
92-
if sys.argv[1] == "set":
93-
setter_main(prog, args)
94-
95-
if sys.argv[1] == "compile":
96-
compiler_main(prog, args)
97-
98-
=======
9986
if sys.argv[1] == "compile":
10087
compiler_main(prog, args)
10188

10289
if sys.argv[1] == "set":
10390
setter_main(prog, args)
10491

105-
>>>>>>> test_fmtprediction
10692
if sys.argv[1] == "version":
10793
print(__version__)
10894

atcodertools/codegen/code_generators/cpp.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,12 @@
11
from atcodertools.codegen.models.code_gen_args import CodeGenArgs
22
from atcodertools.codegen.template_engine import render
33

4-
<<<<<<< HEAD
5-
from atcodertools.codegen.code_generators.universal_code_generator import UniversalCodeGenerator
6-
=======
74
from atcodertools.codegen.code_generators.universal_code_generator import UniversalCodeGenerator, get_builtin_code_generator_info_toml_path
8-
>>>>>>> test_fmtprediction
95

106

117
def main(args: CodeGenArgs) -> str:
128
code_parameters = UniversalCodeGenerator(
13-
<<<<<<< HEAD
14-
args.format, args.config, "cpp").generate_parameters()
15-
=======
169
args.format, args.config, get_builtin_code_generator_info_toml_path("cpp")).generate_parameters()
17-
>>>>>>> test_fmtprediction
1810
return render(
1911
args.template,
2012
config=args.config,

0 commit comments

Comments
 (0)