@@ -294,6 +294,7 @@ optional arguments:
294
294
- ` run_command="./main.out" ` コンパイルしたプログラムを` atcoder-tools test ` で実行する場合に実行されるコマンド
295
295
296
296
297
+
297
298
``` toml
298
299
[codestyle ]
299
300
indent_type =' space' # 'tab' or 'space'
@@ -305,61 +306,20 @@ code_generator_file="~/custom_code_generator.py"
305
306
[postprocess ]
306
307
exec_on_each_problem_dir =' clang-format -i ./*.cpp'
307
308
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
- =======
315
309
[compiler ]
316
310
compile_command =' g++ main.cpp -o main -std=c++17'
317
311
compile_only_when_diff_detected =true
318
312
[tester ]
319
313
compile_before_testing =true
320
314
compile_only_when_diff_detected =true
321
315
timeout_adjustment =1.2
322
- >>>>>>> test_fmtprediction
323
316
[etc ]
324
317
download_without_login =false
325
318
parallel_download =false
326
319
save_no_session_cache =false
327
320
skip_existing_problems =false
328
321
in_example_format =" in_{}.txt"
329
322
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
- =======
363
323
```
364
324
365
325
また、以下のように提出時にコマンドを実行してその結果を提出することが可能です。C++以外のAC-libraryを自動に展開するような用途で用いることができます。下記の例はNim言語でACLのexpanderを実行しその出力ファイルを提出し、その後ローカルの出力ファイルを削除するという設定です。
@@ -374,44 +334,22 @@ indent_width=2
374
334
exec_before_submit =' rm ./combined.nim | python3 ~/git/Nim-ACL/expander.py main.nim --lib /home/chaemon/git/Nim-ACL/ -s'
375
335
exec_after_submit =' rm ./combined.nim'
376
336
submit_filename =' ./combined.nim'
377
- >>>>>>> test_fmtprediction
378
337
```
379
338
380
339
381
340
### カスタムコードジェネレーター
382
341
[ 標準のC++コードジェネレーター] ( https://github.com/kyuridenamida/atcoder-tools/blob/master/atcodertools/codegen/code_generators/cpp.py ) に倣って、
383
342
` (CogeGenArgs) -> str(ソースコード) ` が型であるような` main ` 関数を定義した.pyファイルを` code_generator_file ` で指定すると、コード生成時にカスタムコードジェネレーターを利用できます。
384
343
385
- <<<<<<< HEAD
386
- ### ユニバーサルコードジェネレーター
387
- ユニバーサルコードジェネレータはループ・配列アクセス方法等のいくつかの言語仕様を記述するだけでカスタムコードジェネレータよりも簡単にコード生成することを意図して作成したジェネレータです。設定ファイル` (言語名).toml ` を` atcodertools/codegen/code_generators/universal_generator ` に配置してください。設定ファイルの書き方は以下です。
388
- =======
389
344
390
345
### ユニバーサルコードジェネレーター
391
346
ユニバーサルコードジェネレーターはループ・配列アクセス方法等のいくつかの言語仕様を記述するだけでカスタムコードジェネレーターよりも簡単にコード生成することを意図して作成したジェネレーターです。設定ファイルの` code_generator_toml ` で指定します。書き方は以下です。
392
- >>>>>>> test_fmtprediction
393
347
394
348
- * base_indent* 入力部分のインデント数
395
349
- * insert_space_around_operators* 入力部分の変数や演算子の間にスペースを入れるかどうかをtrue/falseで指定
396
350
- * newline_after_input* 入力部分で入力ごとに空行を入れるかどうかをtrue/falseで指定
397
351
- * global_prefix* グローバル変数の宣言時に入れる接頭辞(Javaなどでstaticを指定したりできます)
398
352
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
- =======
415
353
以下のようにテーブルを定義します。各項目はダブルコーテーションあるいはシングルコーテーションを用いた文字列で指定します。Pythonのformatメソッドに渡されるため、波括弧等の文字を直に書きたい場合はエスケープする必要があります。
416
354
テーブルのキーは整数(int), 浮動小数(float), 文字列(str), およびこれら3つを使った1次元配列(seq), 2次元配列(2d_seq)となっています。
417
355
@@ -423,16 +361,10 @@ submit_filename='./combined.nim'
423
361
- * [ default] * デフォルトの値について記述します。例を参照してください。注意: TOMLの表記に癖があるようで、ダブルコーテーション2つ(空の文字列)を表記する際にはstr='""'とするとよいようです。"\"\" "だとエラーになるようです。
424
362
- * [ input_func] * int, float, strについて入力時に呼び出す関数を記述します。
425
363
- * [ arg] * solve関数の引数の記述方法について指定します。` int ` , ` float ` , ` str ` , ` seq ` , ` 2d_seq ` について記述してください。` {name} ` が変数名, ` {type} ` が` seq ` , ` 2d_seq ` についてベースとなる型です。
426
- >>>>>>> test_fmtprediction
427
364
- * [ actual_arg] * ` seq ` , ` 2d_seq ` についてsolve関数を呼び出す際の引数の渡し方について記述します。C++などでmoveをつかってメモリを節約したいときなどに指定できます。省略可能で、省略した場合はそのまま渡されます。
428
365
429
366
- * [ access] * 配列のアクセス方法について記述します。` seq ` , ` 2d_seq ` について指定してください。` {name} ` で変数名, ` {index_i} ` , ` {index_j} ` でインデックス名を指定します。
430
367
431
- <<<<<<< HEAD
432
- 以下は入力コードの冗長性を下げる目的で指定するテーブルで省略可能なものです。指定方法についてはpythonの設定を参照してください。
433
-
434
- - * [ input_func] * int, float, stringについて入力時に呼び出す関数を記述します。
435
- =======
436
368
437
369
以下は宣言・確保・入力を行うためのコードを記述します。いくつかを同時に行う方法も指定できます。いずれも一行または複数行に渡る指定が可能でセミコロン等の終端子も(必要な言語では)記述してください。
438
370
キーワードとして` {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'
444
376
445
377
以下は入力コードの冗長性を下げる目的で指定するテーブルで省略可能なものです。指定方法についてはPythonの設定を参照してください。
446
378
447
- >>>>>>> test_fmtprediction
448
379
- * [ allocate_and_input] * ` seq ` , ` 2d_seq ` について確保と入力をまとめて行うことができる場合に記述します。省略した場合、上記で指定した確保と入力の方式を複合したものが挿入されます
449
380
- * [ declare_and_allocate_and_input] * ` seq ` , ` 2d_seq ` について宣言・確保・入力をまとめて行うことができる場合に記述します。省略した場合、上記で指定した宣言と確保と入力の方式を複合したものが挿入されます
450
381
@@ -465,19 +396,12 @@ footer = "}}"
465
396
[type ]
466
397
int = " long long"
467
398
float = " long double"
468
- <<<<<<< HEAD
469
- string = " std::string"
470
- =======
471
399
str = " std::string"
472
- >>>>>>> test_fmtprediction
473
400
474
401
# デフォルト値
475
402
[default ]
476
403
int = " 0"
477
404
float = " 0.0"
478
- <<<<<<< HEAD
479
- string = " \"\" "
480
- =======
481
405
str = ' ""'
482
406
483
407
# 引数
@@ -497,19 +421,13 @@ seq = "std::move({name})"
497
421
[access ]
498
422
seq = " {name}[{index}]"
499
423
2d_seq = " {name}[{index_i}][{index_j}]"
500
- >>>>>>> test_fmtprediction
501
424
502
425
# 宣言
503
426
[declare ]
504
427
int = " long long {name};"
505
428
float = " long double {name};"
506
- <<<<<<< HEAD
507
- string = " std::string {name};"
508
- seq = " std::std::vector<{type}> {name};"
509
- =======
510
429
str = " std::string {name};"
511
430
seq = " std::vector<{type}> {name};"
512
- >>>>>>> test_fmtprediction
513
431
2d_seq = " std::vector<std::vector<{type}>> {name};"
514
432
515
433
# 確保
@@ -525,41 +443,13 @@ seq = "std::vector<{type}> {name}({length});"
525
443
# 入力
526
444
[input ]
527
445
# 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
- =======
555
446
int = " std::scanf(\" %lld\" , &{name});"
556
447
# float = "std::cin >> {name};"
557
448
float = " std::scanf(\" %Lf\" , &{name});"
558
449
str = " std::cin >> {name};"
559
450
```
560
451
561
452
例えばPythonでの設定方法は以下です。
562
- >>>>>>> test_fmtprediction
563
453
``` toml
564
454
base_indent = 1
565
455
insert_space_around_operators = true
@@ -581,31 +471,19 @@ footer = ""
581
471
[type ]
582
472
int = " int"
583
473
float = " float"
584
- <<<<<<< HEAD
585
- string = "str"
586
- =======
587
474
str = " str"
588
- >>>>>>> test_fmtprediction
589
475
590
476
# デフォルト値
591
477
[default ]
592
478
int = " int()"
593
479
float = " float()"
594
- <<<<<<< HEAD
595
- string = "str()"
596
- =======
597
480
str = " str()"
598
- >>>>>>> test_fmtprediction
599
481
600
482
# 宣言
601
483
[declare ]
602
484
int = " "
603
485
float = " "
604
- <<<<<<< HEAD
605
- string = ""
606
- =======
607
486
str = " "
608
- >>>>>>> test_fmtprediction
609
487
seq = " "
610
488
2d_seq = " "
611
489
@@ -623,21 +501,6 @@ self.declare_and_allocate_2d_seq = "{name} = [[{default}] * ({length_j}) for _ i
623
501
[input_func ]
624
502
int = " int(next(tokens))"
625
503
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
- =======
641
504
str = " next(tokens)"
642
505
643
506
# 入力
@@ -651,7 +514,6 @@ str = "{name} = {input_func}"
651
514
int = " {name} = {input_func} # type: int"
652
515
float = " {name} = {input_func} # type: float"
653
516
str = " {name} = {input_func} # type: str"
654
- >>>>>>> test_fmtprediction
655
517
656
518
# 確保と入力
657
519
[allocate_and_input ]
@@ -667,21 +529,13 @@ seq = "{name} = [{input_func} for _ in range({length})] # type: \"List[{type}]\
667
529
[arg ]
668
530
int = " {name}: int"
669
531
float = " {name}: float"
670
- <<<<<<< HEAD
671
- string = "{name}: str"
672
- =======
673
532
str = " {name}: str"
674
- >>>>>>> test_fmtprediction
675
533
seq = " {name}: \" List[{type}]\" "
676
534
2d_seq = " {name}: \" List[List[{type}]]\" "
677
535
678
536
# 配列アクセス
679
537
[access ]
680
- <<<<<<< HEAD
681
- seq = "{name}[{index_i}]"
682
- =======
683
538
seq = " {name}[{index}]"
684
- >>>>>>> test_fmtprediction
685
539
2d_seq = " {name}[{index_i}][{index_j}]"
686
540
```
687
541
0 commit comments