Skip to content

Latest commit

 

History

History
113 lines (89 loc) · 4.89 KB

File metadata and controls

113 lines (89 loc) · 4.89 KB

エディタとローカルインタプリタ

構成

ローカル環境は独自に Littleman VM を再実装していない。

littleman.js
  ├─ littleman-runtime.js   公式 Go WASM API adapter
  ├─ judge.js               公式 Web runner 相当の judge
  ├─ wasm_exec.js           Go WebAssembly runtime
  └─ littleman.wasm         公式 VM(gitignore 対象)

したがって命令、pipe、tick、Display の実行意味論は公式 WASM そのもの。 今回修正したのは WASM の返却値を誤って扱っていた CLI/judge 部分である。

修正前に確認された問題

littleman.js は簡単な halting program の実行には使えたが、公式 judge の 代替にはならなかった。

  • load() が返す JSON を捨て、structured load error を見落としていた。
  • load 失敗後の {"type":"error","message":"no program loaded"} を繰り返し、 step limit まで実行していた。
  • expected output と expected frames を常に空で渡していた。
  • outputSettled を見ず、正解出力後も halt まで実行していた。
  • round の入力解放、Display frame judge、公開 test 実行がなかった。
  • default limit が 100,000 で、通常の grader の 5,000,000 と異なった。
  • 1 tick ずつ step() を呼び、大きな上限では不要に遅かった。

現在の実装

  • 公式 Web runner と同じ I/O sanitizer と output 比較を使用。
  • editor と同じく外側の空白 margin を crop し、snapshot/error 座標を元へ戻す。
  • load, step, stepN, back の全応答を lossless JSON parse。
  • 2^53 超の int64 は decimal string として保持し、公式 Web runner の JavaScript number 丸めによる false pass/false fail を回避。
  • type: error を operation と source position 付きで例外化。
  • 通常実行は halted まで、judge 実行は halted || outputSettled まで進める。
  • stepN(..., 5000, false) 相当の batch 実行。
  • done, pass, fail, load-error, crash, execution-error, timeout を区別。
  • / 区切り round と段階的 input release。
  • round-grouped Display frames と WASM frameJudge
  • problem detail JSON の publicTestData 一括実行。
  • JSON output、全 tick verbose trace、WASM metadata 表示。

使い方は CLI README を参照。

Web runner と同じ判定順

  1. frame mismatch があれば fail。
  2. 通常 output が完全一致し、全 frame が一致すれば pass。
  3. 値が途中で違えば wrong output。
  4. expected より多ければ extra output。
  5. 異常 halt なら crash。
  6. 正常 halt したが不足なら missing output/frame。
  7. halt も settle もせず上限に達したら timeout。

正しい最後の output または frame を commit した時点で outputSettled: true となり得る。そのため pass に H は不要。

公式 Web エディタ

公式 Editor は grid 編集、逆 step、 pipe/room/display 作図、公開 test、提出までを統合する。

操作 shortcut
Run / Stop Ctrl/⌘ + Enter
step 0 で pause Shift + Ctrl/⌘ + Enter
Play/Pause, Next, Back p, n, b
typeahead 方向 Tab、逆は Shift+Tab
Select / Hand / Room / Pipe / Display v, h, r, p, d
program-flow overlay Alt/⌥ + F

検証結果

npm test の 21 test が公式 WASM に対して成功している。

  • 単一 round の整数 I/O
  • 外側 margin の crop と座標復元
  • load error と bad-op
  • correct、wrong、extra、pending output 比較
  • 非 halt program の早期 pass
  • round 1 完了後の round 2 input release
  • 1×1 Display の frame match/mismatch
  • CLI からの round-grouped frame JSON 読み込み
  • tick timeout
  • public problem JSON
  • CLI の structured load error 終了
  • Y split の runner state
  • 2^53 超の output と register の exact int64 保持

さらに公式 API から取得した Triangle の公開 6 test を、fixture の Littleman program で全件 pass することを確認した。

残る境界

  • 実際の private tests と server-side resource limit はローカルでは再現不能。
  • wall-clock、operation cap 等の内部 grader limit は problem API に公開されない。
  • WASM が更新されれば挙動も変わる。--download 後は回帰 test を再実行する。
  • Web UI の描画・local storage・undo stack は CLI の対象外。
  • 公開前と思われる staging 機能 Y は runtime に存在するが、現 Language Reference には未掲載。正式告知前の提出での利用は推奨しない。

参照