pyてよn日記

一寸先は闇が人生

AtCoderコンテストC++用ディレクトリ自動生成 with Python

目次

概要

 PythonAtCoderコンテスト用のプロジェクトディレクトリを自動生成する。コンテスト名(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

自動生成してみた

スクリプトは以下。

大雑把に手順をまとめると以下の通りになる。

手順

  1. コンテスト名、コンテスト番号、問題の種類の文字列の3つの変数を用意

  2. 1.を元に作りたいディレクトリ名、C++ファイル名等を作り、ディレクトリを作成。

  3. CMakeLists.txt と 問題ごとのC++ファイルを作成。

  4. 作ったディレクトリの中身を確認。

※ファイルの入出力周りで 作業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ライブラリについては以下の記事を参考にさせていただいた。

note.nkmk.me

note.nkmk.me

終わりに

 最後まで読んでくださりありがとうございます。初めて作業の自動化に挑戦してみました。記事中のスクリプトを少しいじれば他の言語にも対応できると思うのでぜひやってみてください!(そこまで恩恵はないと思いますが…)
 自分なりにスクリプト中にコメントをつけたり、こうしたら分かりやすいかなという風に工夫したつもりなので、間違い箇所、ここはこう書いた方がいい等のご指摘がありましたら積極的にコメントしていただけると助かります。