hogecoder

tsutaj 競技プログラミングの記録

競プロの問題文作成を支援するツール "statements-manager" を作った

この記事は 競プロ Advent Calendar 2022 の 9 日目の記事として書かれました。

昔は大学合宿で、今は JAG (ICPC OB/OG の会) で競プロの作問作業に携わっている tsutaj です。競プロの問題文作成を支援するツール "statements-manager" (略称: ss-manager) を作ったので紹介します。作問作業がより良い形で進められるようになればと思い開発しています。

ツールの概要

作問作業をしたことがある方なら共感してもらえるかなと思いますが、こういう問題が起こってしまった、もしくは起こりそうになったことはありませんか?

  • 問題文に書いてある制約と、データセットで利用している制約が食い違っており、データセットで制約違反を起こしてしまった
  • 想定解法が途中で変化し、あるサンプル入力に対応するサンプル出力を修正する必要があったが、修正前のものをそのまま問題文に書いてしまった
  • Google Docs で問題文を管理し、定期的にローカルファイルに転記して問題文を作っていたが、古いバージョンのものを問題文として利用してしまった

このツールはこういった問題を解消するためのものです。ローカルまたは Google Docs にある問題文を読み込んで、問題の制約やサンプルを埋め込み、Markdown / HTML / PDF 形式で出力します。HTML / PDF のレイアウトは、テンプレートファイルで自由に決められます。

ツールはこんな感じで動きます。問題文中に制約やサンプルの情報が直接的には書かれていないファイルを statements-manager でビルドすると、それらの情報を埋め込んだ HTML ファイルが出力されていることが確認できます。また、制約を表すファイル constraints.hpp が自動で生成されていることも確認できます。

https://statements-manager.readthedocs.io/ja/stable/_images/9f3da08aa3b01c92a81e81cce606b29d9a11d907

リポジトリはこちら

github.com

ドキュメントはこちら

statements-manager.readthedocs.io

ドキュメントは結構ちゃんと書きました!!わからないところがあれば TwitterGitHub でいつでも質問してください!

開発の背景

競プロの問題作成を支援するツールの代表格は Rime ですが、これはテストケースを作ったり解法が想定通りの結果を返すかどうか検証するツールであり、問題文作成を補助する機能はありません。一方で、作問作業をしていると問題文とデータセットとで制約が合わなくなるなどミスにつながることが多々起こるため、どうにかしたいなと思って開発しています。

仕組みの根幹は Library Checker を参考にしています。制約やサンプルを埋め込む機能はそのままに、Google Docs 上に問題文があっても利用可能にしたり、Rime を使っているプロジェクトに導入しやすい形にしたり、出力される HTML や PDF のスタイルを自由に決められるなど、独自の特徴を盛り込んでいます。

想定している使い方

上に書いたとおり Rime に足りない機能を補うのがこのツールなので、Rime と一緒に使うことを想定しています。Rime はかなり便利なツールなのでぜひ使ってみてください。下は便利なリンク集です。

statements-manager を Rime と一緒に使うオススメの方法は ドキュメント に書いています。あわせて読んでみてください。

まとめ

Rime と statements-manager を使って、確実に問題準備をしていきましょう!

使いづらいところや要望があれば GitHub の issueTwitter で連絡ください!