Competitive programming's library
ざっくり言うと、本ライブラリは競技プログラミングでよく使用するデータ構造や関数、スニペットをまとめたものです。
本ライブラリを構成する最小要素であるデータ構造や関数、スニペットを モジュール と呼ぶことにします。 さらに、モジュールを二種類に分類します。
- シンボル: データ構造や関数、定数など他ソースコードにimport可能なモジュール
- 例1: セグメント木
- 例2: 単一始点最短経路問題をダイクストラ法で解いた結果を返す関数
- スニペット: シンボルでないモジュール(他ソースコードにimport不可能なモジュール)
- 例1: テンプレート
- 例2: 浮動小数点数の小数部の桁数を指定して標準出力するスニペット
このように分類するのは、シンボルとスニペットでテストコードの書き方が異なるからです。
モジュールの集合を パッケージ と呼ぶことにします。 パッケージは、意味のある単位でモジュールをまとめるためのフォルダのようなものです。
本ライブラリの構造は下記のようになります。
- ライブラリ
- シンボルをまとめたパッケージA
- シンボルA-1
- シンボルA-2
- ...
- シンボルをまとめたパッケージB
- シンボルB-1
- シンボルB-2
- ...
- ...
- スニペットをまとめたパッケージsnippet
- スニペット1
- スニペット2
- ...
- シンボルをまとめたパッケージA
(暫定)スニペットはパッケージsnippetにのみ属すものとします。
本リポジトリは前述のライブラリの構造に対応したディレクトリ構造になっています。 具体的には、下記のディレクトリ構造になっています。
- lib: ライブラリのルートディレクトリ
- package_A: シンボルをまとめたパッケージA
- symbol_A_1: シンボルA-1に関するコード・ドキュメント・テストケースを管理
README.md
- ソースコード
- symbol_A_2: シンボルA-2に関するコード・ドキュメント・テストケースを管理
README.md
- ソースコード
- ...
- symbol_A_1: シンボルA-1に関するコード・ドキュメント・テストケースを管理
- package_B: シンボルをまとめたパッケージA
- symbol_B_1: シンボルB-1に関するコード・ドキュメント・テストケースを管理
README.md
- ソースコード
- symbol_B_2: シンボルB-2に関するコード・ドキュメント・テストケースを管理
README.md
- ソースコード
- ...
- symbol_B_1: シンボルB-1に関するコード・ドキュメント・テストケースを管理
- snippet: スニペットをまとめたパッケージsnippet
- snippet_1: スニペット1に関するコード・ドキュメント・テストケースを管理
README.md
- ソースコード
- snippet_2: スニペット1に関するコード・ドキュメント・テストケースを管理
README.md
- ソースコード
- ...
- snippet_1: スニペット1に関するコード・ドキュメント・テストケースを管理
- package_A: シンボルをまとめたパッケージA
各モジュールの README.md
はそのモジュールの使い方を説明するドキュメントです。
ライブラリの構造を表現するファイルが lib.yml
です。
パッケージ/モジュールを追加・削除したら lib.yml
も更新してください。
スニペット生成・自動テストは lib.yml
に記述されているモジュールのみ対象となります。
lib.yml
は以下のYAMLのスキーマにしたがいます。
type: seq
sequence:
- type: map
mapping:
"package": { type: str }
"modules":
type: seq
sequence:
- type: { type: str }
lib.yml
の具体的な記述例を示します。
- package: graph
modules:
- dijkstra
- bellmanford
- package: snippet
modules:
- template
- precision