dsh-eval-guard 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/README.md +91 -13
  2. package/assets/bomberman/workspace.zip +0 -0
  3. package/assets/commit0/instance.json +30 -0
  4. package/assets/commit0/workspace.zip +0 -0
  5. package/assets/ctf/workspace.zip +0 -0
  6. package/assets/featurebench/hidden/test_regression.py +690 -0
  7. package/assets/featurebench/instance.json +16 -0
  8. package/assets/featurebench/workspace.zip +0 -0
  9. package/assets/swe-bench-pro/hidden/test.patch +36 -0
  10. package/assets/swe-bench-pro/instance.json +10 -0
  11. package/assets/swe-bench-pro/workspace.zip +0 -0
  12. package/assets/tank/workspace.zip +0 -0
  13. package/eval/README.md +18 -0
  14. package/eval/arena/arena/README.md +21 -0
  15. package/eval/arena/arena/bt.py +104 -0
  16. package/eval/arena/arena/clock.py +15 -0
  17. package/eval/arena/arena/core.py +265 -0
  18. package/eval/arena/arena/run.cmd +24 -0
  19. package/eval/arena/arena/run.sh +11 -0
  20. package/eval/arena/arena/schedule.py +79 -0
  21. package/eval/arena/arena/tournament.py +183 -0
  22. package/eval/arena/bomberman/bots/README.md +16 -0
  23. package/eval/arena/bomberman/bots/deepseek-v4.1-flash.cpp +447 -0
  24. package/eval/arena/bomberman/bots/doubao-seed-2.1.cpp +542 -0
  25. package/eval/arena/bomberman/bots/glm-5.3.cpp +406 -0
  26. package/eval/arena/bomberman/bots/gpt-6-astra.cpp +768 -0
  27. package/eval/arena/bomberman/bots/gpt-6-sol.cpp +444 -0
  28. package/eval/arena/bomberman/bots/kimi-k3.cpp +432 -0
  29. package/eval/arena/bomberman/bots/mimo-v2.6-pro.cpp +529 -0
  30. package/eval/arena/bomberman/bots/opus-5.5.cpp +548 -0
  31. package/eval/arena/bomberman/bots/qwen-3.8-max.cpp +836 -0
  32. package/eval/arena/bomberman/tournament/README.md +11 -0
  33. package/eval/arena/bomberman/tournament/bt.py +56 -0
  34. package/eval/arena/bomberman/tournament/evaluate.py +199 -0
  35. package/eval/arena/bomberman/tournament/run.py +79 -0
  36. package/eval/arena/bomberman/tournament/schedule-2to10.json.gz +0 -0
  37. package/eval/arena/bomberman/workspace/MANIFEST.json +13 -0
  38. package/eval/arena/bomberman/workspace/README.md +29 -0
  39. package/eval/arena/bomberman/workspace/RULES.md +100 -0
  40. package/eval/arena/bomberman/workspace/baseline.cpp +240 -0
  41. package/eval/arena/bomberman/workspace/clock.py +25 -0
  42. package/eval/arena/bomberman/workspace/engine/arena.py +198 -0
  43. package/eval/arena/bomberman/workspace/engine/build.py +35 -0
  44. package/eval/arena/bomberman/workspace/engine/engine.py +256 -0
  45. package/eval/arena/bomberman/workspace/engine/verify_replay.py +24 -0
  46. package/eval/arena/bomberman/workspace/run.cmd +28 -0
  47. package/eval/arena/bomberman/workspace/run.sh +16 -0
  48. package/eval/arena/bomberman/workspace/viewer/index.html +42 -0
  49. package/eval/arena/ctf/bots/README.md +18 -0
  50. package/eval/arena/ctf/bots/deepseek-v4.1-flash.cpp +601 -0
  51. package/eval/arena/ctf/bots/doubao-seed-2.1-turbo.cpp +320 -0
  52. package/eval/arena/ctf/bots/fable-5.1.cpp +634 -0
  53. package/eval/arena/ctf/bots/glm-5.3.cpp +689 -0
  54. package/eval/arena/ctf/bots/gpt-6-astra.cpp +657 -0
  55. package/eval/arena/ctf/bots/gpt-6.1-sol.cpp +725 -0
  56. package/eval/arena/ctf/bots/kimi-k3.cpp +667 -0
  57. package/eval/arena/ctf/bots/mimo-v2.6-pro.cpp +533 -0
  58. package/eval/arena/ctf/bots/opus-5.5.cpp +645 -0
  59. package/eval/arena/ctf/bots/qwen-3.8-max.cpp +726 -0
  60. package/eval/arena/ctf/bots/sonnet-5.5.cpp +569 -0
  61. package/eval/arena/ctf/tournament/README.md +15 -0
  62. package/eval/arena/ctf/tournament/formal-2to8.json +31 -0
  63. package/eval/arena/ctf/tournament/formal-9to15.json +31 -0
  64. package/eval/arena/ctf/workspace/README.md +41 -0
  65. package/eval/arena/ctf/workspace/RULES.md +119 -0
  66. package/eval/arena/ctf/workspace/arena.py +186 -0
  67. package/eval/arena/ctf/workspace/baseline.cpp +257 -0
  68. package/eval/arena/ctf/workspace/clock.py +15 -0
  69. package/eval/arena/ctf/workspace/core.py +265 -0
  70. package/eval/arena/ctf/workspace/engine.py +389 -0
  71. package/eval/arena/ctf/workspace/run.cmd +24 -0
  72. package/eval/arena/ctf/workspace/run.sh +11 -0
  73. package/eval/arena/ctf/workspace/viewer.html +71 -0
  74. package/eval/arena/land/bots/README.md +17 -0
  75. package/eval/arena/land/bots/deepseek-4.1f@workbuddy#1/bot.cpp +608 -0
  76. package/eval/arena/land/bots/glm-5.3@workbuddy#1/bot.cpp +521 -0
  77. package/eval/arena/land/bots/gpt-6-astra@codex#1/bot.cpp +373 -0
  78. package/eval/arena/land/bots/gpt-6-sol@codex#1/bot.cpp +341 -0
  79. package/eval/arena/land/bots/kimi-k3@workbuddy#1/bot.cpp +492 -0
  80. package/eval/arena/land/bots/mimo-2.6-pro@zcode#1/bot.cpp +652 -0
  81. package/eval/arena/land/bots/mystery-model@zcode#1/bot.cpp +466 -0
  82. package/eval/arena/land/bots/opus-5.5@claude-code#1/bot.cpp +630 -0
  83. package/eval/arena/land/bots/sonnet-5@claude-code#1/bot.cpp +619 -0
  84. package/eval/arena/land/tournament/make_replay_page.py +17 -0
  85. package/eval/arena/land/tournament/rate.py +290 -0
  86. package/eval/arena/land/tournament/round_robin.py +172 -0
  87. package/eval/arena/land/tournament/sparring.cpp +356 -0
  88. package/eval/arena/land/workspace/RULES.md +114 -0
  89. package/eval/arena/land/workspace/TASK.md +46 -0
  90. package/eval/arena/land/workspace/anchors/.build/greedy_f2e6d2dea5ca +0 -0
  91. package/eval/arena/land/workspace/anchors/greedy.cpp +194 -0
  92. package/eval/arena/land/workspace/anchors/random.cpp +80 -0
  93. package/eval/arena/land/workspace/clock.py +64 -0
  94. package/eval/arena/land/workspace/engine/build.py +33 -0
  95. package/eval/arena/land/workspace/engine/game.py +273 -0
  96. package/eval/arena/land/workspace/engine/referee.py +308 -0
  97. package/eval/arena/land/workspace/starter/.build/bot_be32b45b4699 +0 -0
  98. package/eval/arena/land/workspace/starter/bot.cpp +82 -0
  99. package/eval/arena/land/workspace/viewer/viewer.html +210 -0
  100. package/eval/arena/tank/bots/README.md +24 -0
  101. package/eval/arena/tank/bots/half1/deepseek-v4.1-flash.cpp +367 -0
  102. package/eval/arena/tank/bots/half1/doubao-seed-evolving.cpp +402 -0
  103. package/eval/arena/tank/bots/half1/gemini-4-argon.cpp +1132 -0
  104. package/eval/arena/tank/bots/half1/glm-5.3.cpp +551 -0
  105. package/eval/arena/tank/bots/half1/gpt-6-astra.cpp +233 -0
  106. package/eval/arena/tank/bots/half1/gpt-6.1-sol-ultrafast.cpp +350 -0
  107. package/eval/arena/tank/bots/half1/gpt-6.1-sol.cpp +78 -0
  108. package/eval/arena/tank/bots/half1/grok-4.7.cpp +1099 -0
  109. package/eval/arena/tank/bots/half1/haiku-5.5.cpp +210 -0
  110. package/eval/arena/tank/bots/half1/kimi-k3.cpp +353 -0
  111. package/eval/arena/tank/bots/half1/mimo-v2.6-pro.cpp +336 -0
  112. package/eval/arena/tank/bots/half1/muse-wonder-full.cpp +560 -0
  113. package/eval/arena/tank/bots/half1/opus-5.5.cpp +435 -0
  114. package/eval/arena/tank/bots/half1/qwen-3.8-max.cpp +537 -0
  115. package/eval/arena/tank/bots/half2/deepseek-v4.1-flash.cpp +425 -0
  116. package/eval/arena/tank/bots/half2/doubao-seed-evolving.cpp +308 -0
  117. package/eval/arena/tank/bots/half2/gemini-4-argon.cpp +1390 -0
  118. package/eval/arena/tank/bots/half2/glm-5.3.cpp +651 -0
  119. package/eval/arena/tank/bots/half2/gpt-6-astra.cpp +241 -0
  120. package/eval/arena/tank/bots/half2/gpt-6.1-sol-ultrafast.cpp +356 -0
  121. package/eval/arena/tank/bots/half2/gpt-6.1-sol.cpp +87 -0
  122. package/eval/arena/tank/bots/half2/grok-4.7.cpp +1205 -0
  123. package/eval/arena/tank/bots/half2/haiku-5.5.cpp +210 -0
  124. package/eval/arena/tank/bots/half2/kimi-k3.cpp +487 -0
  125. package/eval/arena/tank/bots/half2/mimo-v2.6-pro.cpp +336 -0
  126. package/eval/arena/tank/bots/half2/muse-wonder-full.cpp +560 -0
  127. package/eval/arena/tank/bots/half2/opus-5.5.cpp +476 -0
  128. package/eval/arena/tank/bots/half2/qwen-3.8-max.cpp +392 -0
  129. package/eval/arena/tank/tournament/README.md +24 -0
  130. package/eval/arena/tank/tournament/bt.py +218 -0
  131. package/eval/arena/tank/tournament/final.json +202 -0
  132. package/eval/arena/tank/tournament/halftime.json +146 -0
  133. package/eval/arena/tank/tournament/progress.json +911 -0
  134. package/eval/arena/tank/tournament/schedule.py +100 -0
  135. package/eval/arena/tank/tournament/sparring.cpp +928 -0
  136. package/eval/arena/tank/tournament/tournament.py +1426 -0
  137. package/eval/arena/tank/workspace/README.md +169 -0
  138. package/eval/arena/tank/workspace/RULES.md +443 -0
  139. package/eval/arena/tank/workspace/arena.py +862 -0
  140. package/eval/arena/tank/workspace/baseline.cpp +259 -0
  141. package/eval/arena/tank/workspace/clock.py +103 -0
  142. package/eval/arena/tank/workspace/core.py +712 -0
  143. package/eval/arena/tank/workspace/engine.py +573 -0
  144. package/eval/arena/tank/workspace/history/.lock +0 -0
  145. package/eval/arena/tank/workspace/history/20261017-193610-08715287f91f-bot.cpp +109 -0
  146. package/eval/arena/tank/workspace/history/20261017-193619-f00b2d5635fa-gpt-6-astra.cpp +241 -0
  147. package/eval/arena/tank/workspace/history/20261017-193643-63319e0a2b1a-gpt-6_1-sol-ultrafast.cpp +356 -0
  148. package/eval/arena/tank/workspace/history/20261017-193647-41c1341d0a8a-gemini-4-argon.cpp +1390 -0
  149. package/eval/arena/tank/workspace/history/20261017-193652-e34c0f45539a-gpt-6_1-sol.cpp +87 -0
  150. package/eval/arena/tank/workspace/history/20261017-193654-c026348ce96e-opus-5_5.cpp +476 -0
  151. package/eval/arena/tank/workspace/history/20261017-193655-4a21366e94d1-muse-wonder-full.cpp +560 -0
  152. package/eval/arena/tank/workspace/history/20261017-193657-dbc4e9969c52-mimo-v2_6-pro.cpp +336 -0
  153. package/eval/arena/tank/workspace/history/20261017-193703-723cd036eb31-grok-4_7.cpp +1205 -0
  154. package/eval/arena/tank/workspace/history/20261017-193707-1ebbb227be68-deepseek-v4_1-flash.cpp +425 -0
  155. package/eval/arena/tank/workspace/history/20261017-193709-aeb0e7202ad5-doubao-seed-evolving.cpp +308 -0
  156. package/eval/arena/tank/workspace/history/20261017-193710-b21ebeb9bc76-kimi-k3.cpp +487 -0
  157. package/eval/arena/tank/workspace/history/20261017-193712-54cd86531905-haiku-5_5.cpp +210 -0
  158. package/eval/arena/tank/workspace/history/20261017-193714-efdb8e35c0bf-qwen-3_8-max.cpp +392 -0
  159. package/eval/arena/tank/workspace/history/20261017-193715-681423c23fdb-glm-5_3.cpp +651 -0
  160. package/eval/arena/tank/workspace/history/20261017-193717-1a8b3c75181d-sparring.cpp +928 -0
  161. package/eval/arena/tank/workspace/history/20261017-193720-1e0803a541e8-baseline.cpp +259 -0
  162. package/eval/arena/tank/workspace/history/log.jsonl +103 -0
  163. package/eval/arena/tank/workspace/judge/cycles.hpp +53 -0
  164. package/eval/arena/tank/workspace/judge/fast.cpp +337 -0
  165. package/eval/arena/tank/workspace/judge/referee.cpp +125 -0
  166. package/eval/arena/tank/workspace/judge/speed.cpp +99 -0
  167. package/eval/arena/tank/workspace/run.cmd +31 -0
  168. package/eval/arena/tank/workspace/run.sh +23 -0
  169. package/eval/arena/tank/workspace/tank.hpp +1762 -0
  170. package/eval/arena/tank/workspace/tank_main.cpp +215 -0
  171. package/eval/arena/tank/workspace/viewer.html +1150 -0
  172. package/eval/arena/warehouse/workspace/SPEC.md +130 -0
  173. package/eval/arena/warehouse/workspace/TASK.md +71 -0
  174. package/eval/arena/warehouse/workspace/baseline/common.h +88 -0
  175. package/eval/arena/warehouse/workspace/baseline/main.cpp +27 -0
  176. package/eval/arena/warehouse/workspace/baseline/old_stuff.cpp +87 -0
  177. package/eval/arena/warehouse/workspace/baseline/sim.cpp +427 -0
  178. package/eval/arena/warehouse/workspace/baseline/util.cpp +220 -0
  179. package/eval/arena/warehouse/workspace/clock.py +42 -0
  180. package/eval/arena/warehouse/workspace/src/common.h +88 -0
  181. package/eval/arena/warehouse/workspace/src/main.cpp +27 -0
  182. package/eval/arena/warehouse/workspace/src/old_stuff.cpp +87 -0
  183. package/eval/arena/warehouse/workspace/src/sim.cpp +427 -0
  184. package/eval/arena/warehouse/workspace/src/util.cpp +220 -0
  185. package/eval/arena/warehouse/workspace/tools/bench.py +119 -0
  186. package/eval/arena/warehouse/workspace/tools/check_input.py +161 -0
  187. package/eval/arena/warehouse/workspace/tools/gen.py +132 -0
  188. package/eval/arena/warehouse/workspace/tools/measure.py +107 -0
  189. package/eval/arena/warehouse/workspace/workloads/public/pub_crowded.in +1420 -0
  190. package/eval/arena/warehouse/workspace/workloads/public/pub_crowded.out +9162 -0
  191. package/eval/arena/warehouse/workspace/workloads/public/pub_dynamic.in +1465 -0
  192. package/eval/arena/warehouse/workspace/workloads/public/pub_dynamic.out +3439 -0
  193. package/eval/arena/warehouse/workspace/workloads/public/pub_flood.in +2757 -0
  194. package/eval/arena/warehouse/workspace/workloads/public/pub_flood.out +3126 -0
  195. package/eval/arena/warehouse/workspace/workloads/public/pub_small.in +731 -0
  196. package/eval/arena/warehouse/workspace/workloads/public/pub_small.out +2578 -0
  197. package/eval/arena/warehouse/workspace/workloads/public/pub_wide.in +528 -0
  198. package/eval/arena/warehouse/workspace/workloads/public/pub_wide.out +2026 -0
  199. package/eval/bomberman.py +20 -0
  200. package/eval/commit0.py +21 -0
  201. package/eval/common.py +61 -0
  202. package/eval/ctf.py +20 -0
  203. package/eval/featurebench.py +25 -0
  204. package/eval/land.py +20 -0
  205. package/eval/legacy/bomberman-prices.json +4 -0
  206. package/eval/legacy/bomberman.py +161 -0
  207. package/eval/legacy/commit0.py +91 -0
  208. package/eval/legacy/ctf-prices.json +4 -0
  209. package/eval/legacy/ctf.py +178 -0
  210. package/eval/legacy/featurebench.py +103 -0
  211. package/eval/legacy/land-prices.json +4 -0
  212. package/eval/legacy/land.py +177 -0
  213. package/eval/legacy/swe_bench_pro.py +116 -0
  214. package/eval/legacy/tank-prices.json +3 -0
  215. package/eval/legacy/tank.py +408 -0
  216. package/eval/legacy/warehouse-prices.json +4 -0
  217. package/eval/legacy/warehouse.py +365 -0
  218. package/eval/swe-bench-pro.py +25 -0
  219. package/eval/tank.py +20 -0
  220. package/eval/warehouse.py +20 -0
  221. package/lib/client/index.js +376 -63
  222. package/lib/client/index.js.map +1 -1
  223. package/lib/index.js +684 -27
  224. package/package.json +2 -1
@@ -0,0 +1,11 @@
1
+ #!/bin/sh
2
+ # 找一个 Python 3.10 以上,在本目录运行给定的脚本。不带参数时显示开发用时。
3
+ cd "$(dirname -- "$0")" || exit 1
4
+ for py in python3 python; do
5
+ if command -v "$py" >/dev/null 2>&1 && "$py" -c 'import sys; sys.exit(sys.version_info < (3, 10))' 2>/dev/null; then
6
+ [ "$#" -eq 0 ] && set -- clock.py
7
+ exec "$py" -X utf8 "$@"
8
+ fi
9
+ done
10
+ echo '没有找到 Python 3.10 以上的版本。请把情况告诉组织方。' >&2
11
+ exit 1
@@ -0,0 +1,71 @@
1
+ <!doctype html>
2
+ <html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
3
+ <title>夺旗回放</title>
4
+ <style>
5
+ :root{color-scheme:dark;--bg:#0f141c;--panel:#18202c;--line:#2a3547;--ink:#e6ecf5;--muted:#93a1b5;font-family:"Segoe UI","Microsoft YaHei",sans-serif}
6
+ *{box-sizing:border-box}body{margin:0;padding:18px;background:var(--bg);color:var(--ink)}
7
+ header{display:flex;flex-wrap:wrap;gap:10px 18px;align-items:baseline;margin-bottom:12px}h1{font-size:22px;margin:0}.muted{color:var(--muted);font-size:12px}
8
+ .layout{display:grid;grid-template-columns:minmax(360px,1fr) 340px;gap:14px}.panel{background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:12px}
9
+ canvas{width:100%;display:block;border-radius:6px;background:#121a26}
10
+ .controls{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-top:10px}
11
+ button,select,input{background:#253247;color:var(--ink);border:1px solid #3c4d68;border-radius:6px;padding:6px 9px;font:inherit;font-size:13px}
12
+ button{cursor:pointer}button:hover{background:#30405a}input[type=range]{flex:1;min-width:160px;padding:0}
13
+ .team{display:flex;justify-content:space-between;gap:8px;padding:6px 8px;border-radius:6px;cursor:pointer;font-size:13px}.team:hover,.team.on{background:#243044}
14
+ .team b{font-size:16px}.sw{display:inline-block;width:10px;height:10px;border-radius:50%;margin-right:6px}
15
+ h2{font-size:13px;color:var(--muted);margin:12px 0 6px}#events,#orders{font-size:12px;line-height:1.7;max-height:190px;overflow:auto;white-space:pre-wrap}
16
+ @media(max-width:860px){.layout{grid-template-columns:1fr}body{padding:10px}}
17
+ </style></head><body>
18
+ <header><h1>夺旗回放</h1><span class="muted" id="sub"></span></header>
19
+ <div class="layout">
20
+ <section class="panel"><canvas id="board"></canvas>
21
+ <div class="controls"><button id="play">播放</button><button id="prev">◀</button><button id="next">▶</button>
22
+ <input id="seek" type="range" min="0" value="0" aria-label="回合"><span id="turn"></span>
23
+ <select id="speed" aria-label="速度"><option value="1">1×</option><option value="3" selected>3×</option><option value="8">8×</option><option value="20">20×</option></select></div>
24
+ <div class="controls"><select id="keys" aria-label="关键回合"><option value="">跳到关键回合…</option></select></div>
25
+ <div class="muted" style="margin-top:8px">圆点 = 角色(数字为 id),金环 = 携旗,星形 = 地上的旗,淡色方块 = 基地,虚线圈 = 旗点。点右侧阵营可高亮。←→ 逐回合,空格播放。</div>
26
+ </section>
27
+ <aside class="panel"><h2>阵营与得分</h2><div id="teams"></div><h2>本回合事件</h2><div id="events"></div><h2>指令</h2><div id="orders"></div></aside>
28
+ </div>
29
+ <script>
30
+ const R=/*__REPLAY__*/null;
31
+ const C=['#ff6b7f','#5ab4ff','#7bd99b','#d7a2ff','#ffcb6b','#5fd9d4','#ff9fd0','#b5cc6e','#a9aeff','#f09c63','#e0e0e0','#8fb3c9','#e8d38a','#c98fa8','#8fd6b2'];
32
+ const $=id=>document.getElementById(id),cv=$('board'),g=cv.getContext('2d');
33
+ let i=0,playing=false,last=0,focus=-1;
34
+ const MV={N:'上',S:'下',E:'右',W:'左',WAIT:'停'},AC={attack:'攻击',pickup:'拾旗',drop:'丢旗',wait:''};
35
+ const name=t=>R.names[t]??('阵营'+t);
36
+ function ev(e){switch(e.type){case'capture':return`★ ${name(e.team)} 交旗(角色${e.unit},旗${e.flag})`;case'pickup':return`角色${e.unit} 拿到旗${e.flag}`;case'drop':return`角色${e.unit} 放下旗${e.flag}`;case'death':return`✖ 角色${e.unit} 阵亡${e.flag!==null?',掉落旗'+e.flag:''}(击杀:${e.by.join('、')})`;case'attack':return`角色${e.unit} → 角色${e.target}`;case'respawn':return`角色${e.unit} 重生`;case'return':return`旗${e.flag} 回位`;default:return JSON.stringify(e)}}
37
+ function render(){
38
+ const f=R.frames[i],H=R.header,n=H.size,s=Math.max(10,Math.floor(760/n));cv.width=cv.height=n*s;
39
+ for(let y=0;y<n;y++)for(let x=0;x<n;x++){g.fillStyle=H.map[y][x]==='#'?'#3e4c63':((x+y)%2?'#16202e':'#182333');g.fillRect(x*s,y*s,s,s)}
40
+ H.bases.forEach((b,t)=>{g.fillStyle=C[t%15]+(focus<0||focus===t?'55':'22');for(const[x,y]of b)g.fillRect(x*s,y*s,s,s)});
41
+ g.setLineDash([3,3]);g.strokeStyle='#ffe08a88';for(const[x,y]of H.flag_spots){g.beginPath();g.arc((x+.5)*s,(y+.5)*s,s*.42,0,7);g.stroke()}g.setLineDash([]);
42
+ for(const e of f.events)if(e.type==='attack'){const a=f.units[e.unit],b=f.units[e.target];const pa=a.pos,pb=b.pos||(f.events.find(z=>z.type==='death'&&z.unit===e.target)||{}).pos;if(pa&&pb){g.strokeStyle='#ffe7a0';g.lineWidth=2;g.beginPath();g.moveTo((pa[0]+.5)*s,(pa[1]+.5)*s);g.lineTo((pb[0]+.5)*s,(pb[1]+.5)*s);g.stroke()}}
43
+ for(const fl of f.flags)if(fl.pos){const[x,y]=fl.pos;star((x+.5)*s,(y+.5)*s,s*.38,'#ffd75e')}
44
+ for(const e of f.events)if(e.type==='death'){const[x,y]=e.pos;g.strokeStyle='#ffb070';g.lineWidth=2;g.beginPath();g.moveTo(x*s+3,y*s+3);g.lineTo(x*s+s-3,y*s+s-3);g.moveTo(x*s+s-3,y*s+3);g.lineTo(x*s+3,y*s+s-3);g.stroke()}
45
+ for(const u of f.units){if(!u.pos)continue;const t=Math.floor(u.id/3),[x,y]=u.pos,cx=(x+.5)*s,cy=(y+.5)*s;g.globalAlpha=focus<0||focus===t?1:.25;
46
+ g.fillStyle=C[t%15];g.beginPath();g.arc(cx,cy,s*.36,0,7);g.fill();if(u.flag!==null){g.strokeStyle='#ffd75e';g.lineWidth=3;g.beginPath();g.arc(cx,cy,s*.48,0,7);g.stroke()}
47
+ g.fillStyle='#0b111a';g.font=`bold ${Math.max(8,s*.36)}px sans-serif`;g.textAlign='center';g.textBaseline='middle';g.fillText(u.id,cx,cy+1);
48
+ g.fillStyle='#0b111a';g.fillRect(x*s+2,y*s+1,s-4,2);g.fillStyle=u.hp>50?'#8fe3b5':'#ffc56b';g.fillRect(x*s+2,y*s+1,(s-4)*u.hp/H.rules.hp,2)}
49
+ g.globalAlpha=1;
50
+ $('turn').textContent=`${f.turn} / ${R.frames.at(-1).turn}`;$('seek').value=i;
51
+ const order=[...Array(H.teams).keys()].sort((a,b)=>f.score[b]-f.score[a]);
52
+ $('teams').replaceChildren(...order.map(t=>{const d=document.createElement('div');d.className='team'+(focus===t?' on':'');d.onclick=()=>{focus=focus===t?-1:t;render()};
53
+ const alive=f.units.filter(u=>Math.floor(u.id/3)===t).map(u=>u.pos?(u.flag!==null?'⚑':'●'):'○').join('');
54
+ d.innerHTML=`<span><span class="sw" style="background:${C[t%15]}"></span>${esc(name(t))} <span class="muted">${alive}</span></span><b>${f.score[t]}</b>`;return d}));
55
+ $('events').textContent=f.events.filter(e=>e.type!=='attack'||focus<0||Math.floor(e.unit/3)===focus).map(ev).join('\n')+(f.faults?'\n'+f.faults.map(x=>`程序故障 ${name(x.team)}:${x.reason}`).join('\n'):'')||'无';
56
+ $('orders').textContent=Object.entries(f.orders).filter(([t])=>focus<0||+t===focus).map(([t,cs])=>`${name(+t)}:`+cs.map(c=>`${c.id} ${MV[c.move]??'停'}${AC[c.act]?' '+AC[c.act]:''}${c.act==='attack'?' '+c.target:''}${c.note?'「'+c.note+'」':''}`).join(',')).join('\n')||'—';
57
+ }
58
+ function star(x,y,r,col){g.fillStyle=col;g.beginPath();for(let k=0;k<10;k++){const a=Math.PI/5*k-Math.PI/2,rr=k%2?r*.45:r;g.lineTo(x+rr*Math.cos(a),y+rr*Math.sin(a))}g.fill()}
59
+ function esc(t){return String(t).replace(/[&<>]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;'}[c]))}
60
+ function go(k){playing=false;$('play').textContent='播放';i=Math.max(0,Math.min(R.frames.length-1,k));render()}
61
+ function tick(t){if(playing&&t-last>=300/+$('speed').value){last=t;if(i<R.frames.length-1){i++;render()}else go(i)}requestAnimationFrame(tick)}
62
+ if(R){
63
+ $('sub').textContent=`${R.header.teams} 方 · 地图 ${R.header.size}×${R.header.size} · 种子 ${R.header.seed} · 最终得分 ${R.result.score.join(' / ')}`;
64
+ $('seek').max=R.frames.length-1;
65
+ R.frames.forEach((f,k)=>{const es=f.events.filter(e=>e.type==='capture'||(e.type==='death'&&e.flag!==null));if(es.length){const o=document.createElement('option');o.value=k;o.textContent=`${f.turn} 回合:${es.map(ev).join(';')}`;$('keys').append(o)}});
66
+ $('play').onclick=()=>{if(i===R.frames.length-1)i=0;playing=!playing;$('play').textContent=playing?'暂停':'播放'};
67
+ $('prev').onclick=()=>go(i-1);$('next').onclick=()=>go(i+1);$('seek').oninput=e=>go(+e.target.value);$('keys').onchange=e=>{if(e.target.value!=='')go(+e.target.value)};
68
+ addEventListener('keydown',e=>{if(e.target.tagName==='SELECT'||e.target.tagName==='INPUT')return;if(e.key==='ArrowRight')go(i+1);if(e.key==='ArrowLeft')go(i-1);if(e.key===' '){e.preventDefault();$('play').click()}});
69
+ render();requestAnimationFrame(tick)
70
+ }else $('sub').textContent='这是回放模板,请打开对战后生成的 HTML 文件。';
71
+ </script></body></html>
@@ -0,0 +1,17 @@
1
+ # 各模型的交卷代码
2
+
3
+ 都是模型在比赛中独立写出的原样代码,主办方没有改动。文件夹名是正式赛里的编号(`模型@工具#第几次`),赛事脚本和逐局结果都用这个编号。
4
+
5
+ | 文件夹 | 模型 | 工具 |
6
+ |---|---|---|
7
+ | `sonnet-5@claude-code#1` | Sonnet 5.5(日志模型 ID 是 `claude-sonnet-5`,实际被灰度到 5.5,见 `../CONDITIONS.md` 注 1) | Claude Code |
8
+ | `gpt-6-astra@codex#1` | GPT-6 Astra | Codex |
9
+ | `opus-5.5@claude-code#1` | Opus 5.5 | Claude Code |
10
+ | `gpt-6-sol@codex#1` | GPT-6 Sol | Codex |
11
+ | `mimo-2.6-pro@zcode#1` | MiMo V2.6 Pro | ZCode |
12
+ | `kimi-k3@workbuddy#1` | Kimi K3 | WorkBuddy |
13
+ | `glm-5.3@workbuddy#1` | GLM 5.3 | WorkBuddy |
14
+ | `mystery-model@zcode#1` | Spacebunny(OpenRouter 隐身模型,后确认为 MiniMax M3.1 Flash) | ZCode |
15
+ | `deepseek-4.1f@workbuddy#1` | DeepSeek V4.1 Flash | WorkBuddy |
16
+
17
+ 基准 bot 在 `../workspace/anchors/`(random、greedy),出题方陪练 bot 在 `../tournament/sparring.cpp`。