ローカルでの環境構築方法
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.1
を numpy==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
もこのディレクトリに作成するとします。
以下のようなフォルダ構成になるはずです。
- Dockerfile
- README.md
- example
- hello_world
- example.vsm
- problem.md
- testcase.vsm
- judge
- judge.bat
- judge-py
- judge.py
- mncore2_emuenv
- assemble3
- gpfn3_package_main
- tutorial.md
- ...
- requirements.txt
- ...
- welcome
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"
の設定はお好みに設定ください。