目次
概要
PythonでAtCoderコンテスト用のプロジェクトディレクトリを自動生成する。コンテスト名(e.g. ABC)、第X回(e.g. 107)、問題の種類(e.g. ABCD)を標準入力するだけで、コンテストに必要なC++ファイル、CMakeLists.txtが入ったプロジェクトディレクトリを自動生成できる。
対象者
CLionなど、C++ファイルのビルドにCMakeを使ってる方
経緯
現在C/C++実行環境としてCLionを使っている。CLionはデフォルトで、ビルドにCMakeを使っているため、C++ソースファイルを作るごとにCMakeList.txtに実行ファイルの設定を追加しないといけない。
例えば、AtCoderのコンテストで問題がABCDの4つあるときは、それぞれの問題ごとにデバッグをしたかったら4つ分の設定をCMakeListsに記述しないといけない。毎回それをやるのはめんどくさいのでPythonで自動化してみた。
目的物
Pythonスクリプトが置かれているディレクトリに目的物を生成する。
dire/ ┣ atcoder_auto.py ┣ ABC_107/ (このディレクトリをatcoder_auto.pyで生成する) ┣ ABC107_A.cpp ┣ ABC107_B.cpp ┣ ABC107_C.cpp ┣ ABC107_D.cpp ┣ CMakeLists.txt
自動生成してみた
スクリプトは以下。
大雑把に手順をまとめると以下の通りになる。
手順
※ファイルの入出力周りで 作業3に苦労した。
解説
ポイントは以下の2つ。
with文、ファイルオブジェクト(f_obj)の扱い
with open() のmode="w"
は、ファイルに書き込みを行うオプション。新しいファイルが生成される。指定したファイル名と同じファイル名のファイルが存在すると、上書きして新しいファイルが作られるため注意(白紙に書き込まれる)。f_obj.writelines(list型)
に関して
ファイルオブジェクトのwritelines
メソッドで、リスト型変数をファイルに書き込める。各要素間の改行はされないため、各要素の文字列の最後にエスケープシーケンス(\n)を入れること。
実行結果
実行してみた。CMakeLists.txtもついでに出力した。
$ python atcoder_auto.py Enter 'contest_name' 'contest_num' 'question' separated by space. >>> ABC 107 ABCD # スペース区切りで自分で入力 Made directory ABC_107 --- structure --- ABC_107/ CMakeLists.txt ABC107_D.cpp ABC107_B.cpp ABC107_C.cpp ABC107_A.cpp $ cat ABC_107/CMakeLists.txt # CMakeLists.txt を出力 cmake_minimum_required(VERSION 3.1) project(ABC_107) set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -std=c++11) add_executable(ABC107_A ABC107_A.cpp) add_executable(ABC107_B ABC107_B.cpp) add_executable(ABC107_C ABC107_C.cpp) add_executable(ABC107_D ABC107_D.cpp)
ちゃんとABC_107
のディレクトリができてる。
CMakeLists.txtの設定に関しては前回の記事を参照。
pyteyon.hatenablog.com
メモ
- os.mkdir() のオプション
exist_ok=True
を設定すると、同じディレクトリ名のディレクトリが存在した場合エラーを出さなくなるが、今回はエラーを捕まえるため設定しなかった。osライブラリについては以下の記事を参考にさせていただいた。
終わりに
最後まで読んでくださりありがとうございます。初めて作業の自動化に挑戦してみました。記事中のスクリプトを少しいじれば他の言語にも対応できると思うのでぜひやってみてください!(そこまで恩恵はないと思いますが…)
自分なりにスクリプト中にコメントをつけたり、こうしたら分かりやすいかなという風に工夫したつもりなので、間違い箇所、ここはこう書いた方がいい等のご指摘がありましたら積極的にコメントしていただけると助かります。