NPC(Nanyo Programming Contest)のテストを自動で行うVSCodeを想定した拡張機能です。以下の内容には必ず目を通してください。
機能
以下、gen.pyなどの入力を作成するファイルを生成ファイル、main.pyなどの解答を作成するファイルを実行ファイル、scorer.pyなどの実行ファイルの出力をもとにスコアを評価するファイルを評価ファイル(ヒューリスティックのみ)と呼ぶ。
コマンドパレット上(ctrl + shift + Pで表示)五つのコマンドが追加されます。
NPC: Fetch Generator
NPC: Run With Generator(s)
NPC: Run With Heuristic (main→gen→scorer)
NPC: Run Judge (seeds.txt, TL & retries)
NPC: Get Recommended Settings (helper)
1. NPC: Fetch Generator
実行した後入力を求められますが、これは参照する問題のページを探しています。
ユーザーは、次の二つのうちいずれかの形式で入力しなければなりません。
例えば、Nanyo Programming Contest 001 の A問題を参照させる場合は、
と入力してください。
入力した後は、自動で指定されたページから Python生成コードを取得し、それをgen.pyに保存します。
2. NPC: Run With Generator(s)
生成ファイルで作った出力を解答ファイルの入力に流し込んでテストケースを一括で回します。
まず、生成コードを尋ねられます。ここで、何も入力しなかった場合は、現在存在しているgen.pyを生成ファイルとして実行し、先述のURL指定法に基づいた文を投げるとそのURLの生成コードを新たにgen.pyとした上で生成ファイルとして実行します。
次に、シード値を獲得します。
シード値は、半角空白区切りまたは半角コンマ区切りで数字を受け取ることができます。
それらを入力し終えると、ついに実行が始まります。右下に表示されるポップアップでも見ながら優雅にお茶でも飲んでください。
実行が終わると、ルートディレクトリ内にinputsとoutputsフォルダができ、その中に各テストケースごとの入出力ファイルが生成されます。また、すべてのテストケースの結果がout.txtに保存されます。
さらに、実行詳細がまとめられたsummary.mdが作られます。以下の内容がかかれています。
各seed毎に
# : 実行番号
seed : seed値
statue : AC/WAなど
err : エラー表示(エラーがなければ何も表示しない)
score : ここでは関係がないため何も表示されない
maintime(ms) : 使用したCPU時間
realtime(ms) : 使用した現実時間
全体で
平均スコア : ここでは関係がないため-が表示される
総合スコア : ここでは関係がないため-が表示される
最大 maintime (ms) : 各ケースごとの使用したCPU時間の最大値
最大 realtime (ms) : 各ケースごとの使用した現実時間の最大値
AC数 (A/B) : AC数/総テストケース数
3. NPC: Run With Heuristic (main→gen→scorer)
NPCH用のコマンドです。
2.NPC: Run With Generator(s)と使い方はほぼ同じです。
しかし最後に、その実行に対してコメントをつけることができます。ぜひ活用してください。
実行詳細がまとめられたsummary.mdが作られます。以下の内容がかかれています。
各seed毎に
# : 実行番号
seed : seed値
statue : AC/WAなど
err : エラー表示(エラーがなければ何も表示しない)
score : 評価ファイルで出力された数値、つまりスコア。-1なら不正な出力(=WA)
maintime(ms) : 使用したCPU時間
realtime(ms) : 使用した現実時間
全体で
平均スコア : ACしたケースの中でのスコアの平均値
総合スコア : ACしたケースのスコアの総和
最大 maintime (ms) : 各ケースごとの使用したCPU時間の最大値
最大 realtime (ms) : 各ケースごとの使用した現実時間の最大値
AC数 (A/B) : AC数/総テストケース数
4. NPC: Run Judge (seeds.txt, TL & retries)
3. NPC: Run With Heuristic (main→gen→scorer)と使い方はほぼ同じです。
seed値を、ルートディレクトリ内にあるseeds.txtから抜き取ります。seeds.txtでは、各行ごとにseed値一つで、seed値ごとに改行してください。
この実行はシステムテストなどの大規模実行を想定しています。そのため、TLEやTLEしたときの再試行回数などの設定が適用されます。
さらに、一度に大量の実行を行うため、重くなることがあります。スレッド数を減らすなどの対策を行うことで、ある程度の障害が取り除かれることがわかっています。
実行詳細がまとめられたsummary.mdが作られます。以下の内容がかかれています。
各seed毎に
# : 実行番号
seed : seed値
statue : AC/WAなど
err : エラー表示(エラーがなければ何も表示しない)
score : 評価ファイルで出力された数値、つまりスコア。-1なら不正な出力(=WA)
maintime(ms) : 使用したCPU時間
realtime(ms) : 使用した現実時間
全体で
平均スコア : ACしたケースの中でのスコアの平均値
総合スコア : ACしたケースのスコアの総和
最大 maintime (ms) : 各ケースごとの使用したCPU時間の最大値
最大 realtime (ms) : 各ケースごとの使用した現実時間の最大値
AC数 (A/B) : AC数/総テストケース数
5. NPC: Get Recommended Settings (helper)
煩雑な設定手法や、そもそもの中身の小難しさによって難化した実行方法を助けるためのコマンドです。初めにエラーを吐かれたらこのコマンドを叩きましょう。
どのような設定項目にすることで動くか自動で検査し、その結果を返します。Pathが見つかったものは設定可能ということを示します。
困ったらこのコマンドを叩いて設定にミスがないか確認してください。 それが解決に早く近づくコツになるでしょう。
使用上の注意
seed = 97
N = generator(seed)
のように、seedという変数を用いてseed値を宣言してください。でないと、正常にシード値を変えて実行できない恐れがあります。また、generator(int(input())),seed = int(input())のような記法はしないでください。必ず、seed = <num>という形でお願いします。
生成ファイル内で出力された結果がの標準入力に渡されます。実行ファイルでの入力受け取り形式と、生成ファイルでの出力形式が違うと適切な結果が得られないので注意してください。
そのため、NPC: Run With Generator(s)で生成コードを取得するのではなく、一度NPC: Fetch Generatorから生成コードを入手し、目で確認することを強くお勧めします。
万一生成コードが無限ループに陥ったり、あるいは悪質であったりするときのために、テスト実行するときの一連の流れ (すべてのテストケース生成および実行ファイルでの実行時間を含む) の制限時間を30000ms(30s)に設定しています。また、生成コードの出力制限は10000000 bytes です。なお、どちらの設定もVSCode内に読み込んだあとに拡張機能の設定から任意の値に変更することができます。
実行させるOSによってそれに合った設定に変更しなければなりません。例えば、通常のWindows環境と、WSL(Linux)上における設定は違うことがあります。
設定から変更可能なもの
Gen Command
生成ファイルの実行コマンドを指定する。デフォルトはpy {wrapper}。もちろんpy gen.pyでもいいが、特段変更してもうまみがない。環境があるならpypy {wrapper}のようにしてもよいが、pypyのコンパイル時間がおそらくメリットを打ち消すのであんまり意味がない。
Gen Filename
生成ファイルとして参照するファイル名。デフォルトはgen.py
Judge Real Timeout Factor(ヒューリスティック,4のみ)
実行制限時間を超えて実行ファイルが動いているとき、強制的に実行を打ち切る時間を設定します。これは、Judge Time Limit Msの設定に依存していて、この値の何倍の実行時間が経過したときに実行を打ち切るかを設定できます。例えば、Judge Time Limit Msが3000msで、この値が2のとき、3000ms × 2 = 6000msが閾値となります。デフォルトは2です。
Judge Retries(ヒューリスティック,4のみ)
1つのseed値に対して、最大で何回実行させるかを設定します。これは、実行制限時間ぎりぎりの提出に対して、突発的な時間のブレを結果から取り除くための設定です。あくまで、最大何回実行できるかということなので、実行が正解した時点でスコアを確定させます。デフォルトは3です。
Judge Time Limit Ms(ヒューリスティック,4のみ)
1つのseed値に対する実行制限時間のことです。単位はmsです。CPU時間が最優先で計測され、正常に計測された場合はそれを実行時間としますが、そうでない場合は、実時間を実行時間とします。なお、基本的に、実時間の方がCPU時間よりも長くなる傾向があります。デフォルトは3000です。
Main Build Command
実行ファイル(main.cppなど)をコンパイルするコマンドを指定する。デフォルトはg++ main.cpp -o {out}。自分の環境に合わせて適切に変化させてください。
Main Build Enabled
実行ファイルに関するビルドコマンドを実行するかどうかを設定する。デフォルトは空。チェックをつけると実行するようになる。
Main Exec
{exe}で実行するときのファイル名を指定する。デフォルトはmain_exec。一番よくわからんので触らないのが吉。
Main Filename
解法ファイルとして参照するファイル名。デフォルトはmain.py
Main Run Command
実行ファイル(main.py/main.cppなど)を実行するときのコマンド。デフォルトはpy {main}。もちろんpy main.pyなどでもよい。C++などのコンパイル言語を使う場合は、{exe}で使うのがよい。
Max Output Bytes
生成ファイルの出力制限。デフォルトは10,000,000bytes(10MB)
Output Dir
入力、出力、summaryを置くファイルのディレクトリ設定。デフォルトは.
Python Path
pythonインタープリターを選択する。デフォルトはpython。推奨はpypy3.11など
Scorer Build Command(ヒューリスティックのみ)
評価ファイルをコンパイルするコマンドを指定する。デフォルトはg++ scorer.cpp -o {out}。空にしておけば無視される。
Scorer Build Enabled(ヒューリスティックのみ)
実行ファイルに関するビルドコマンドを実行するかどうかを設定する。デフォルトは空。チェックをつけると実行するようになる。
Scorer Exec(ヒューリスティックのみ)
{exe}で実行するときのファイル名を指定する。デフォルトはscorer_exec。一番よくわからんので触らないのが吉。
Scorer Filename(ヒューリスティックのみ)
評価ファイルとして参照するファイル名。デフォルトはscorer.py
Scorer Run Command(ヒューリスティックのみ)
評価ファイルを実行するときのコマンド。デフォルトはpy {scorer}。もちろんpy scorer.pyなどでもよい。C++などのコンパイル言語を使う場合は、{exe}で使うのがよいと思う(未検証)。実行速度が問われるわけではないので、pythonで十分なことが多い。
Shared Vars(ヒューリスティックのみ)
詳しくは後述するが、生成コードから評価コードに流したいグローバルな変数を入力しておくことで、評価コードでも呼び出せる。デフォルトは空。複数変数を与えるときは、コンマ区切りな点に注意。
Threads
実行を行うスレッド数。これが0の時は、自動で物理コア数を取得しそのスレッド数で実行する。デフォルトは0。ただし、これによって、out.txtやsummary.mdの実行順序が崩壊することはない
Timeout Ms
生成ファイルおよび解法ファイルを合わせた実行制限時間。デフォルトは30,000ms(30s)
ヒューリスティック使用時
特に、Shared Varsについて説明する。この設定は、ヒューリスティック問題によくある、「解答にはその値はでてこないが、スコア計算をするときに必要になる入力の値」を取得するために用意されている。
ここに、生成コードにでてくるグローバルな変数の中から変数を選んで変数名を入力する(例:N,M,K,seed)。複数入力する場合は、それぞれ半角カンマ区切りな点に注意。
ここに値を入れると、outputs/shared_<seed>.jsonが作られる。評価ファイル内で、このsharedファイルから必要な値を抜き取るようにすることで、生成コードで作成した変数を評価ファイルでも扱うことができるようになる。
評価ファイルがpythonの場合は、以下のように扱うことができる。
import os,json
shared_path = os.environ.get("NPC_SHARED_FILE")
shared = {}
if shared_path and os.path.exists(shared_path):
with open(shared_path, 'r', encoding='utf-8') as f:
shared = json.load(f)
M = shared.get("M") # 生成コード内の変数Mの値を抜き取る
Shared Varsに大量の入力をいれるとその分重くなるので、必要な変数のみ入れること。
要求環境
- Visual Studio Code
- Python(生成ファイルの実行に必須)
- Node.js
- npm
Node.jsはNode.jsのホームページの方からインストールしてください。
npmは設定->システム->開発者向け->sudoの有効化 をonにしてから、
sudo npm install -g npm
を実行することによってインストールできます。
インストール方法(VSCode内の拡張機能導入まで)
最新バージョンをインストールする
VSCodeを開き、左のサイドバーから拡張機能の部分を開き、npcと検索をかけると表示されるので、それをインストールする。
旧バージョンをインストールする
当リポジトリのReleaseから拡張子が.vsixであるものをダウンロードする。
VSCodeを開き、左のサイドバーから拡張機能の部分を開く(ctrl + shift + X でも可)。
一番上に「拡張機能(英語のままならおそらくEXTENSIONS)」という文字があると思うが、そのすぐ右にある詳細ボタンから「VSIXからのインストール...」というものがあるので、そこから先ほどダウンロードしたvsix形式のファイルを選択する。
実行に困ったときは
ctrl+shift+Uを押して、出力を開いたのち、選択からNPC Runnerを選択すると、実行詳細が確認できます。
かなり詳細に記述しているため、困ったらまずここを見ましょう。
履歴
| 日時 |
内容 |
バージョン |
| 2025/08/16 |
READMEを追加。 |
0.1.2 |
| 2025/08/29 |
GUIから設定を変更できるように修正。 |
0.1.3 |
| 2025/08/31 |
C++で動くように修正。 |
0.1.4 |
| 2025/09/07 |
出力ファイルの一括化、並列化、および実行時間の表示ができるように変更。 |
0.1.5 |
| 2025/11/09 |
設定を多様化し、使用可能言語をローカルに依存するように変更。 |
0.1.6 |
| 2025/11/10 |
ヒューリスティック対応。生成ファイル->実行ファイル->評価ファイルの一連の流れを確立。時間測定をCPU時間においても行うように追加。READMEを微調整&修正。 |
0.2.1 |
| 2025/11/13 |
ヒューリスティックのジャッジ用コマンドを作成。 |
0.2.2 |
| 2025/11/23 |
微修正。特に、g++が必須条件になっていたことを修正。 |
0.2.3 |
| 2025/12/12 |
ユーザーにとって設定が難しい問題について、お勧め設定を自動で検査し、教えるコマンドを追加することで改善。その他細部についても微修正。 |
0.2.4 |
| 2025/12/14 |
logs/ < comment>/results.jsonに、実行の時に共有された変数の値を保存しておくように変更 |
0.2.5 |
| 2025/12/20 |
マーケットプレイスに公開 |
0.2.6 |