ローカルでの環境構築方法

judge.zip に、実際にジャッジを行うスクリプトや MN-Core エミュレータが含まれています。

また全ての問題は入出力が収録された testcase.vsm が公開されており、ジャッジスクリプトにこのテストケースを指定することで正誤判定が行えます。

これらを用いて手元でジャッジを行ったり、エミュレーターを使用してデバッグ・実験を行う方法を解説します。

ローカルジャッジ方法

judge.zip をダウンロードして解凍します。

judge-py/judge.py がジャッジスクリプト本体、直下の judge は docker から使用するためのシェルスクリプトです。

Ubuntu 22.04 をご利用の方は次のコマンドを試してください。

pip3 install -r judge-py/requirements.txt python3 judge-py/judge.py example/hello_world/testcase.vsm example/hello_world/example.vsm

Ubuntu 24.04 をご利用の方は、judge-py/requirements.txt の numpy==1.23.1numpy==1.26.4 に修正後、上記のコマンドを試してください。

他の OS をご利用の方は docker をインストールした後、次のコマンドを試してください。

Mac 等:

./judge example/hello_world/testcase.vsm example/hello_world/example.vsm

Windows:

./judge.bat example/hello_world/testcase.vsm example/hello_world/example.vsm

数秒して以下のように表示されたら正常に動作しています。

ACCEPTED!! score=20 j=19 m=1 bytes=250

これからは、Ubuntu でのコマンド例を紹介します。他の OS をご利用の方は適宜コマンド名を読み替えてください。

次に、問題への挑戦方法を解説します。

実際に問題を解くことを想定し、問題のディレクトリを作ります。\(1\) 問目の Welcome 用のディレクトリ welcome/ を作成し、そこに testcase.vsm をダウンロードして保存します。また、welcome用の解答コード welcome.vsm もこのディレクトリに作成するとします。

以下のようなフォルダ構成になるはずです。

welcome/welcome.vsm に、最初の4要素だけ計算する以下のコードを書き込んで保存しましょう。

iinc $m[0,1,2,3] $n[0,1,2,3]

ジャッジをしてみましょう。以下のコマンドを実行すると、次のようなメッセージが得られます。

python3 judge-py/judge.py welcome/testcase.vsm welcome/welcome.vsm

RESULT MISMATCH: pos=4 actual=0 expected=8 error=-8 RESULT MISMATCH: pos=5 actual=0 expected=21 error=-21 RESULT MISMATCH: pos=6 actual=0 expected=39 error=-39 RESULT MISMATCH: pos=7 actual=0 expected=19 error=-19 RESULT MISMATCH: pos=8 actual=0 expected=23 error=-23 RESULT MISMATCH: pos=9 actual=0 expected=11 error=-11 RESULT MISMATCH: pos=10 actual=0 expected=11 error=-11 RESULT MISMATCH: pos=11 actual=0 expected=24 error=-24 RESULT MISMATCH: pos=12 actual=0 expected=36 error=-36 RESULT MISMATCH: pos=13 actual=0 expected=40 error=-40 RESULT MISMATCH: pos=14 actual=0 expected=24 error=-24 RESULT MISMATCH: pos=15 actual=0 expected=3 error=-3 4 value(s) correct, but 12 value(s) mismatch

i=4 から 15 までの12要素に対して RESULT MISMATCH と表示されました。

続きも書き、16 要素全てを処理するコードに直してもう一度実行すると

ACCEPTED!! score=4 j=4 m=0 bytes=61

の様に表示が変わるはずです。書いたコードによっては ACCEPTED!! の後の数値が違うかもしれませんが、これでこの問題は正解です。

デバッグ出力・デバッグ入力 (d get, d set)

Welcome で紹介されていたデバッグ出力 d get を試してみましょう。

以下のコードを実行してみます。

d getd $lm2n0c0b0m0p0 1 iinc $m[0,1,2,3] $n[0,1,2,3] d getd $ln2n0c0b0m0p0 1

同じコマンドを実行してみても、デバッグ出力が表示されないことでしょう。これは、標準では d get 命令が無視されるようになっており、使用したい場合は --enable-get オプションが必要だからです。以下のコマンドを実行してみましょう。

$ python3 judge-py/judge.py --enable-get welcome/testcase.vsm welcome/welcome.vsm

以下の出力が得られるはずです。

------------------- user dump -------------------- DEBUG-LM0(n0c0b0m0p0,2):(0) (0x0000000e0000002a) #d getd $lm2n0c0b0m0p0 1 DEBUG-LM1(n0c0b0m0p0,2):(0) (0x0000000f0000002b) #d getd $ln2n0c0b0m0p0 1 RESULT MISMATCH: pos=4 actual=0 expected=8 error=-8 RESULT MISMATCH: pos=5 actual=0 expected=21 error=-21 …(省略)

同様に、デバッグ用に d set 命令を使用したい場合は --enable-set オプションを追加して下さい。

本ジャッジでは、コードテストでは d get, d set は使用可、提出ではこれらのデバッグコマンドは無視する動作になるので、挙動の違いに気をつけて下さい。

アセンブラ・エミュレータ使用例

judge.py が内部で使用している、アセンブラ assemble3 と、エミュレータ gpfn3_package_main の簡単な使用方法について紹介します。

iinc $m[0,1,2,3] $n[0,1,2,3] d getd $ln0n0c0b0m0p0 6

上の VSM (welcome/welcome.vsm) をアセンブルするコマンド例は以下のとおりです。

$ judge-py/mncore2_emuenv/assemble3 --instruction-mode flat welcome/welcome.vsm

すると、以下のような機械語が得られます。

j 010000000000000000000000000000000000001010000000000000000000000100000000000000000000000000000000101000000000000000000000000000000000000011111111101000100000011111000000000000000000000000000000000111000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000001000000000001000000000000000000000000000000000000000000000010000000000010000000000000000000000000000000000000000000000011000000000011 d getd $ln0n0c0b0m0p0 6

j から始まる、\(426\) bit のバイナリ列が出力されました。これが PE 命令の正体です。\(2\) 行目にはデバッグ命令がそのまま出力されています。

これをエミュレータ gpfn3_package_main に渡すことで、MN-Core 2 の動作を実験することができます。

$ judge-py/mncore2_emuenv/assemble3 --instruction-mode flat welcome/welcome.vsm | judge-py/mncore2_emuenv/gpfn3_package_main

出力結果:

DEBUG-LM1(n0c0b0m0p0,0):(0) (0x0000000000000001) #d getd $ln0n0c0b0m0p0 6 DEBUG-LM1(n0c0b0m0p0,2):(0) (0x0000000000000001) #d getd $ln0n0c0b0m0p0 6 DEBUG-LM1(n0c0b0m0p0,4):(0) (0x0000000000000001) #d getd $ln0n0c0b0m0p0 6 DEBUG-LM1(n0c0b0m0p0,6):(0) (0x0000000000000001) #d getd $ln0n0c0b0m0p0 6 DEBUG-LM1(n0c0b0m0p0,8):(0) (0x0000000000000000) #d getd $ln0n0c0b0m0p0 6 DEBUG-LM1(n0c0b0m0p0,10):(0) (0x0000000000000000) #d getd $ln0n0c0b0m0p0 6

テストケースのジャッジが必要ないときは、こちらの実行方法も参考にして下さい。

VSCode での環境設定例

VSM 用のカラースキーマは用意されていませんが、Shell Script として認識させると、比較的読みやすいカラーリングになり、またコメントアウト用のショートカットも利用できるのでおすすめです。

settings.json.vsm 拡張子用の以下の設定を追加しましょう。

"files.associations": { "*.vsm": "shellscript" },

また、ジャッジや VSM のエミュレータ実行の .vscode/tasks.json 設定例をこちらに用意しています。
{ "version": "2.0.0", "tasks": [ { "label": "Judge", "type": "shell", "command": "sh", "args": [ "-c", "python3 judge-py/judge.py --enable-get --enable-set \"${fileDirname}/testcase.vsm\" \"${file}\"" ], "group": { "kind": "test", "isDefault": true } }, { "label": "Run VSM", "type": "shell", "command": "sh", "args": [ "-c", "judge-py/mncore2_emuenv/assemble3 --instruction-mode flat \"${file}\" | judge-py/mncore2_emuenv/gpfn3_package_main" ], "group": { "kind": "test" } } ] }

"group" の設定はお好みに設定ください。