dsh-eval-guard 0.2.3 → 0.3.1

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 (221) hide show
  1. package/README.md +91 -13
  2. package/assets/commit0/instance.json +30 -0
  3. package/assets/commit0/workspace.zip +0 -0
  4. package/assets/featurebench/hidden/test_regression.py +690 -0
  5. package/assets/featurebench/instance.json +16 -0
  6. package/assets/featurebench/workspace.zip +0 -0
  7. package/assets/swe-bench-pro/hidden/test.patch +36 -0
  8. package/assets/swe-bench-pro/instance.json +10 -0
  9. package/assets/swe-bench-pro/workspace.zip +0 -0
  10. package/eval/README.md +18 -0
  11. package/eval/arena/arena/README.md +21 -0
  12. package/eval/arena/arena/bt.py +104 -0
  13. package/eval/arena/arena/clock.py +15 -0
  14. package/eval/arena/arena/core.py +265 -0
  15. package/eval/arena/arena/run.cmd +24 -0
  16. package/eval/arena/arena/run.sh +11 -0
  17. package/eval/arena/arena/schedule.py +79 -0
  18. package/eval/arena/arena/tournament.py +183 -0
  19. package/eval/arena/bomberman/bots/README.md +16 -0
  20. package/eval/arena/bomberman/bots/deepseek-v4.1-flash.cpp +447 -0
  21. package/eval/arena/bomberman/bots/doubao-seed-2.1.cpp +542 -0
  22. package/eval/arena/bomberman/bots/glm-5.3.cpp +406 -0
  23. package/eval/arena/bomberman/bots/gpt-6-astra.cpp +768 -0
  24. package/eval/arena/bomberman/bots/gpt-6-sol.cpp +444 -0
  25. package/eval/arena/bomberman/bots/kimi-k3.cpp +432 -0
  26. package/eval/arena/bomberman/bots/mimo-v2.6-pro.cpp +529 -0
  27. package/eval/arena/bomberman/bots/opus-5.5.cpp +548 -0
  28. package/eval/arena/bomberman/bots/qwen-3.8-max.cpp +836 -0
  29. package/eval/arena/bomberman/tournament/README.md +11 -0
  30. package/eval/arena/bomberman/tournament/bt.py +56 -0
  31. package/eval/arena/bomberman/tournament/evaluate.py +199 -0
  32. package/eval/arena/bomberman/tournament/run.py +79 -0
  33. package/eval/arena/bomberman/tournament/schedule-2to10.json.gz +0 -0
  34. package/eval/arena/bomberman/workspace/MANIFEST.json +13 -0
  35. package/eval/arena/bomberman/workspace/README.md +29 -0
  36. package/eval/arena/bomberman/workspace/RULES.md +100 -0
  37. package/eval/arena/bomberman/workspace/baseline.cpp +240 -0
  38. package/eval/arena/bomberman/workspace/clock.py +25 -0
  39. package/eval/arena/bomberman/workspace/engine/arena.py +198 -0
  40. package/eval/arena/bomberman/workspace/engine/build.py +35 -0
  41. package/eval/arena/bomberman/workspace/engine/engine.py +256 -0
  42. package/eval/arena/bomberman/workspace/engine/verify_replay.py +24 -0
  43. package/eval/arena/bomberman/workspace/run.cmd +28 -0
  44. package/eval/arena/bomberman/workspace/run.sh +16 -0
  45. package/eval/arena/bomberman/workspace/viewer/index.html +42 -0
  46. package/eval/arena/ctf/bots/README.md +18 -0
  47. package/eval/arena/ctf/bots/deepseek-v4.1-flash.cpp +601 -0
  48. package/eval/arena/ctf/bots/doubao-seed-2.1-turbo.cpp +320 -0
  49. package/eval/arena/ctf/bots/fable-5.1.cpp +634 -0
  50. package/eval/arena/ctf/bots/glm-5.3.cpp +689 -0
  51. package/eval/arena/ctf/bots/gpt-6-astra.cpp +657 -0
  52. package/eval/arena/ctf/bots/gpt-6.1-sol.cpp +725 -0
  53. package/eval/arena/ctf/bots/kimi-k3.cpp +667 -0
  54. package/eval/arena/ctf/bots/mimo-v2.6-pro.cpp +533 -0
  55. package/eval/arena/ctf/bots/opus-5.5.cpp +645 -0
  56. package/eval/arena/ctf/bots/qwen-3.8-max.cpp +726 -0
  57. package/eval/arena/ctf/bots/sonnet-5.5.cpp +569 -0
  58. package/eval/arena/ctf/tournament/README.md +15 -0
  59. package/eval/arena/ctf/tournament/formal-2to8.json +31 -0
  60. package/eval/arena/ctf/tournament/formal-9to15.json +31 -0
  61. package/eval/arena/ctf/workspace/README.md +41 -0
  62. package/eval/arena/ctf/workspace/RULES.md +119 -0
  63. package/eval/arena/ctf/workspace/arena.py +186 -0
  64. package/eval/arena/ctf/workspace/baseline.cpp +257 -0
  65. package/eval/arena/ctf/workspace/clock.py +15 -0
  66. package/eval/arena/ctf/workspace/core.py +265 -0
  67. package/eval/arena/ctf/workspace/engine.py +389 -0
  68. package/eval/arena/ctf/workspace/run.cmd +24 -0
  69. package/eval/arena/ctf/workspace/run.sh +11 -0
  70. package/eval/arena/ctf/workspace/viewer.html +71 -0
  71. package/eval/arena/land/bots/README.md +17 -0
  72. package/eval/arena/land/bots/deepseek-4.1f@workbuddy#1/bot.cpp +608 -0
  73. package/eval/arena/land/bots/glm-5.3@workbuddy#1/bot.cpp +521 -0
  74. package/eval/arena/land/bots/gpt-6-astra@codex#1/bot.cpp +373 -0
  75. package/eval/arena/land/bots/gpt-6-sol@codex#1/bot.cpp +341 -0
  76. package/eval/arena/land/bots/kimi-k3@workbuddy#1/bot.cpp +492 -0
  77. package/eval/arena/land/bots/mimo-2.6-pro@zcode#1/bot.cpp +652 -0
  78. package/eval/arena/land/bots/mystery-model@zcode#1/bot.cpp +466 -0
  79. package/eval/arena/land/bots/opus-5.5@claude-code#1/bot.cpp +630 -0
  80. package/eval/arena/land/bots/sonnet-5@claude-code#1/bot.cpp +619 -0
  81. package/eval/arena/land/tournament/make_replay_page.py +17 -0
  82. package/eval/arena/land/tournament/rate.py +290 -0
  83. package/eval/arena/land/tournament/round_robin.py +172 -0
  84. package/eval/arena/land/tournament/sparring.cpp +356 -0
  85. package/eval/arena/land/workspace/RULES.md +114 -0
  86. package/eval/arena/land/workspace/TASK.md +46 -0
  87. package/eval/arena/land/workspace/anchors/.build/greedy_f2e6d2dea5ca +0 -0
  88. package/eval/arena/land/workspace/anchors/greedy.cpp +194 -0
  89. package/eval/arena/land/workspace/anchors/random.cpp +80 -0
  90. package/eval/arena/land/workspace/clock.py +64 -0
  91. package/eval/arena/land/workspace/engine/build.py +33 -0
  92. package/eval/arena/land/workspace/engine/game.py +273 -0
  93. package/eval/arena/land/workspace/engine/referee.py +308 -0
  94. package/eval/arena/land/workspace/starter/.build/bot_be32b45b4699 +0 -0
  95. package/eval/arena/land/workspace/starter/bot.cpp +82 -0
  96. package/eval/arena/land/workspace/viewer/viewer.html +210 -0
  97. package/eval/arena/tank/bots/README.md +24 -0
  98. package/eval/arena/tank/bots/half1/deepseek-v4.1-flash.cpp +367 -0
  99. package/eval/arena/tank/bots/half1/doubao-seed-evolving.cpp +402 -0
  100. package/eval/arena/tank/bots/half1/gemini-4-argon.cpp +1132 -0
  101. package/eval/arena/tank/bots/half1/glm-5.3.cpp +551 -0
  102. package/eval/arena/tank/bots/half1/gpt-6-astra.cpp +233 -0
  103. package/eval/arena/tank/bots/half1/gpt-6.1-sol-ultrafast.cpp +350 -0
  104. package/eval/arena/tank/bots/half1/gpt-6.1-sol.cpp +78 -0
  105. package/eval/arena/tank/bots/half1/grok-4.7.cpp +1099 -0
  106. package/eval/arena/tank/bots/half1/haiku-5.5.cpp +210 -0
  107. package/eval/arena/tank/bots/half1/kimi-k3.cpp +353 -0
  108. package/eval/arena/tank/bots/half1/mimo-v2.6-pro.cpp +336 -0
  109. package/eval/arena/tank/bots/half1/muse-wonder-full.cpp +560 -0
  110. package/eval/arena/tank/bots/half1/opus-5.5.cpp +435 -0
  111. package/eval/arena/tank/bots/half1/qwen-3.8-max.cpp +537 -0
  112. package/eval/arena/tank/bots/half2/deepseek-v4.1-flash.cpp +425 -0
  113. package/eval/arena/tank/bots/half2/doubao-seed-evolving.cpp +308 -0
  114. package/eval/arena/tank/bots/half2/gemini-4-argon.cpp +1390 -0
  115. package/eval/arena/tank/bots/half2/glm-5.3.cpp +651 -0
  116. package/eval/arena/tank/bots/half2/gpt-6-astra.cpp +241 -0
  117. package/eval/arena/tank/bots/half2/gpt-6.1-sol-ultrafast.cpp +356 -0
  118. package/eval/arena/tank/bots/half2/gpt-6.1-sol.cpp +87 -0
  119. package/eval/arena/tank/bots/half2/grok-4.7.cpp +1205 -0
  120. package/eval/arena/tank/bots/half2/haiku-5.5.cpp +210 -0
  121. package/eval/arena/tank/bots/half2/kimi-k3.cpp +487 -0
  122. package/eval/arena/tank/bots/half2/mimo-v2.6-pro.cpp +336 -0
  123. package/eval/arena/tank/bots/half2/muse-wonder-full.cpp +560 -0
  124. package/eval/arena/tank/bots/half2/opus-5.5.cpp +476 -0
  125. package/eval/arena/tank/bots/half2/qwen-3.8-max.cpp +392 -0
  126. package/eval/arena/tank/tournament/README.md +24 -0
  127. package/eval/arena/tank/tournament/bt.py +218 -0
  128. package/eval/arena/tank/tournament/final.json +202 -0
  129. package/eval/arena/tank/tournament/halftime.json +146 -0
  130. package/eval/arena/tank/tournament/progress.json +911 -0
  131. package/eval/arena/tank/tournament/schedule.py +100 -0
  132. package/eval/arena/tank/tournament/sparring.cpp +928 -0
  133. package/eval/arena/tank/tournament/tournament.py +1426 -0
  134. package/eval/arena/tank/workspace/README.md +169 -0
  135. package/eval/arena/tank/workspace/RULES.md +443 -0
  136. package/eval/arena/tank/workspace/arena.py +862 -0
  137. package/eval/arena/tank/workspace/baseline.cpp +259 -0
  138. package/eval/arena/tank/workspace/clock.py +103 -0
  139. package/eval/arena/tank/workspace/core.py +712 -0
  140. package/eval/arena/tank/workspace/engine.py +573 -0
  141. package/eval/arena/tank/workspace/history/.lock +0 -0
  142. package/eval/arena/tank/workspace/history/20261017-193610-08715287f91f-bot.cpp +109 -0
  143. package/eval/arena/tank/workspace/history/20261017-193619-f00b2d5635fa-gpt-6-astra.cpp +241 -0
  144. package/eval/arena/tank/workspace/history/20261017-193643-63319e0a2b1a-gpt-6_1-sol-ultrafast.cpp +356 -0
  145. package/eval/arena/tank/workspace/history/20261017-193647-41c1341d0a8a-gemini-4-argon.cpp +1390 -0
  146. package/eval/arena/tank/workspace/history/20261017-193652-e34c0f45539a-gpt-6_1-sol.cpp +87 -0
  147. package/eval/arena/tank/workspace/history/20261017-193654-c026348ce96e-opus-5_5.cpp +476 -0
  148. package/eval/arena/tank/workspace/history/20261017-193655-4a21366e94d1-muse-wonder-full.cpp +560 -0
  149. package/eval/arena/tank/workspace/history/20261017-193657-dbc4e9969c52-mimo-v2_6-pro.cpp +336 -0
  150. package/eval/arena/tank/workspace/history/20261017-193703-723cd036eb31-grok-4_7.cpp +1205 -0
  151. package/eval/arena/tank/workspace/history/20261017-193707-1ebbb227be68-deepseek-v4_1-flash.cpp +425 -0
  152. package/eval/arena/tank/workspace/history/20261017-193709-aeb0e7202ad5-doubao-seed-evolving.cpp +308 -0
  153. package/eval/arena/tank/workspace/history/20261017-193710-b21ebeb9bc76-kimi-k3.cpp +487 -0
  154. package/eval/arena/tank/workspace/history/20261017-193712-54cd86531905-haiku-5_5.cpp +210 -0
  155. package/eval/arena/tank/workspace/history/20261017-193714-efdb8e35c0bf-qwen-3_8-max.cpp +392 -0
  156. package/eval/arena/tank/workspace/history/20261017-193715-681423c23fdb-glm-5_3.cpp +651 -0
  157. package/eval/arena/tank/workspace/history/20261017-193717-1a8b3c75181d-sparring.cpp +928 -0
  158. package/eval/arena/tank/workspace/history/20261017-193720-1e0803a541e8-baseline.cpp +259 -0
  159. package/eval/arena/tank/workspace/history/log.jsonl +103 -0
  160. package/eval/arena/tank/workspace/judge/cycles.hpp +53 -0
  161. package/eval/arena/tank/workspace/judge/fast.cpp +337 -0
  162. package/eval/arena/tank/workspace/judge/referee.cpp +125 -0
  163. package/eval/arena/tank/workspace/judge/speed.cpp +99 -0
  164. package/eval/arena/tank/workspace/run.cmd +31 -0
  165. package/eval/arena/tank/workspace/run.sh +23 -0
  166. package/eval/arena/tank/workspace/tank.hpp +1762 -0
  167. package/eval/arena/tank/workspace/tank_main.cpp +215 -0
  168. package/eval/arena/tank/workspace/viewer.html +1150 -0
  169. package/eval/arena/warehouse/workspace/SPEC.md +130 -0
  170. package/eval/arena/warehouse/workspace/TASK.md +71 -0
  171. package/eval/arena/warehouse/workspace/baseline/common.h +88 -0
  172. package/eval/arena/warehouse/workspace/baseline/main.cpp +27 -0
  173. package/eval/arena/warehouse/workspace/baseline/old_stuff.cpp +87 -0
  174. package/eval/arena/warehouse/workspace/baseline/sim.cpp +427 -0
  175. package/eval/arena/warehouse/workspace/baseline/util.cpp +220 -0
  176. package/eval/arena/warehouse/workspace/clock.py +42 -0
  177. package/eval/arena/warehouse/workspace/src/common.h +88 -0
  178. package/eval/arena/warehouse/workspace/src/main.cpp +27 -0
  179. package/eval/arena/warehouse/workspace/src/old_stuff.cpp +87 -0
  180. package/eval/arena/warehouse/workspace/src/sim.cpp +427 -0
  181. package/eval/arena/warehouse/workspace/src/util.cpp +220 -0
  182. package/eval/arena/warehouse/workspace/tools/bench.py +119 -0
  183. package/eval/arena/warehouse/workspace/tools/check_input.py +161 -0
  184. package/eval/arena/warehouse/workspace/tools/gen.py +132 -0
  185. package/eval/arena/warehouse/workspace/tools/measure.py +107 -0
  186. package/eval/arena/warehouse/workspace/workloads/public/pub_crowded.in +1420 -0
  187. package/eval/arena/warehouse/workspace/workloads/public/pub_crowded.out +9162 -0
  188. package/eval/arena/warehouse/workspace/workloads/public/pub_dynamic.in +1465 -0
  189. package/eval/arena/warehouse/workspace/workloads/public/pub_dynamic.out +3439 -0
  190. package/eval/arena/warehouse/workspace/workloads/public/pub_flood.in +2757 -0
  191. package/eval/arena/warehouse/workspace/workloads/public/pub_flood.out +3126 -0
  192. package/eval/arena/warehouse/workspace/workloads/public/pub_small.in +731 -0
  193. package/eval/arena/warehouse/workspace/workloads/public/pub_small.out +2578 -0
  194. package/eval/arena/warehouse/workspace/workloads/public/pub_wide.in +528 -0
  195. package/eval/arena/warehouse/workspace/workloads/public/pub_wide.out +2026 -0
  196. package/eval/bomberman.py +20 -0
  197. package/eval/commit0.py +21 -0
  198. package/eval/common.py +61 -0
  199. package/eval/ctf.py +20 -0
  200. package/eval/featurebench.py +25 -0
  201. package/eval/land.py +20 -0
  202. package/eval/legacy/bomberman-prices.json +4 -0
  203. package/eval/legacy/bomberman.py +161 -0
  204. package/eval/legacy/commit0.py +91 -0
  205. package/eval/legacy/ctf-prices.json +4 -0
  206. package/eval/legacy/ctf.py +178 -0
  207. package/eval/legacy/featurebench.py +103 -0
  208. package/eval/legacy/land-prices.json +4 -0
  209. package/eval/legacy/land.py +177 -0
  210. package/eval/legacy/swe_bench_pro.py +116 -0
  211. package/eval/legacy/tank-prices.json +3 -0
  212. package/eval/legacy/tank.py +408 -0
  213. package/eval/legacy/warehouse-prices.json +4 -0
  214. package/eval/legacy/warehouse.py +365 -0
  215. package/eval/swe-bench-pro.py +25 -0
  216. package/eval/tank.py +20 -0
  217. package/eval/warehouse.py +20 -0
  218. package/lib/client/index.js +376 -63
  219. package/lib/client/index.js.map +1 -1
  220. package/lib/index.js +684 -27
  221. package/package.json +2 -1
@@ -0,0 +1,341 @@
1
+ #include <bits/stdc++.h>
2
+ using namespace std;
3
+
4
+ // Directions are arranged in opposite pairs.
5
+ static constexpr int dx[4] = {0, 0, -1, 1};
6
+ static constexpr int dy[4] = {-1, 1, 0, 0};
7
+ static constexpr char dc[4] = {'U', 'D', 'L', 'R'};
8
+ static constexpr int SZ = 48 * 48;
9
+
10
+ int W, H, N, ME, MAXT, MOVE_MS, INIT_MS;
11
+ pair<int,int> spawn[4];
12
+ int own[SZ], tr[SZ];
13
+ int prefValue[49][49], nearEnemy[SZ], enemyHome[4], weightEnemy[4],neutralValue[SZ];
14
+
15
+ struct Player { int x, y, d, len, area, deaths; };
16
+ struct State { int turn; Player p[4]; };
17
+ int di(char c) { for (int i=0;i<4;i++) if (dc[i]==c) return i; return 0; }
18
+ bool in(int x,int y){return x>=0&&y>=0&&x<W&&y<H;}
19
+ int pos(int x,int y){return y*W+x;}
20
+ int X(int p){return p%W;}
21
+ int Y(int p){return p/W;}
22
+ int nxt(int p,int d){int x=X(p)+dx[d],y=Y(p)+dy[d];return in(x,y)?pos(x,y):-1;}
23
+
24
+ bool readState(State& s) {
25
+ string t;
26
+ if (!(cin>>t)) return false;
27
+ if(t!="TURN") return false;
28
+ cin>>s.turn;
29
+ for(int k=0;k<N;k++){
30
+ int id; char d;
31
+ cin>>t>>id>>s.p[id].x>>s.p[id].y>>d>>s.p[id].len>>s.p[id].area>>s.p[id].deaths;
32
+ s.p[id].d=di(d);
33
+ }
34
+ cin>>t;
35
+ for(int y=0;y<H;y++){cin>>t; for(int x=0;x<W;x++) own[pos(x,y)]=t[x]=='.'?-1:t[x]-'0';}
36
+ cin>>t;
37
+ for(int y=0;y<H;y++){cin>>t; for(int x=0;x<W;x++) tr[pos(x,y)]=t[x]=='.'?-1:t[x]-'0';}
38
+ cin>>t;
39
+ return true;
40
+ }
41
+
42
+ void makeMaps(const State&s) {
43
+ memset(prefValue,0,sizeof(prefValue));
44
+ for(int k=0;k<N;k++){
45
+ weightEnemy[k]=N==2?190:135;
46
+ enemyHome[k]=1000;
47
+ if(k==ME)continue;
48
+ for(int p=0;p<W*H;p++)if(own[p]==k)
49
+ enemyHome[k]=min(enemyHome[k],abs(X(p)-s.p[k].x)+abs(Y(p)-s.p[k].y));
50
+ }
51
+ for(int y=0;y<H;y++) for(int x=0;x<W;x++) {
52
+ int p=pos(x,y),o=own[p];
53
+ int bd=min(min(x,W-1-x),min(y,H-1-y));
54
+ neutralValue[p]=100+(N==2&&s.turn<200?max(0,200-s.turn)*min(35,bd*2)/200:0);
55
+ int val=o==ME?0:o<0?neutralValue[p]:weightEnemy[o];
56
+ for(int k=0;k<N;k++)if(k!=ME&&abs(x-spawn[k].first)<=1&&abs(y-spawn[k].second)<=1)val=0;
57
+ prefValue[y+1][x+1]=prefValue[y][x+1]+prefValue[y+1][x]-prefValue[y][x]+val;
58
+ int d=1000;
59
+ for(int k=0;k<N;k++)if(k!=ME)d=min(d,abs(x-s.p[k].x)+abs(y-s.p[k].y));
60
+ nearEnemy[p]=d;
61
+ }
62
+ }
63
+ int rect(int a[49][49],int x1,int y1,int x2,int y2) {
64
+ if(x1>x2)swap(x1,x2); if(y1>y2)swap(y1,y2);
65
+ return a[y2+1][x2+1]-a[y1][x2+1]-a[y2+1][x1]+a[y1][x1];
66
+ }
67
+
68
+ // A direction-aware shortest path. Reversing is forbidden only on the first
69
+ // move of each continuation, so the direction is part of the search state.
70
+ struct Paths {
71
+ int ds[SZ*4], par[SZ*4];
72
+ unsigned char pd[SZ*4];
73
+ int bestGoal=-1,bestGoalDepth=1000000,bestGoalRisk=-1;
74
+ void run(int start,int dir,bool insideOnly,int maxDepth=10000,bool stopOnLand=false) {
75
+ fill(ds,ds+W*H*4,1000000);
76
+ bestGoal=-1;bestGoalDepth=1000000;bestGoalRisk=-1;
77
+ int q[SZ*4],head=0,tail=0;
78
+ int s=start*4+dir; ds[s]=0;par[s]=-1;q[tail++]=s;
79
+ while(head<tail){
80
+ int z=q[head++],p=z/4,d=z%4,nd=ds[z]+1;
81
+ if(stopOnLand&&ds[z]>0&&own[p]==ME){
82
+ int risk=nearEnemy[p];
83
+ if(ds[z]<bestGoalDepth||(ds[z]==bestGoalDepth&&
84
+ (risk>bestGoalRisk||(risk==bestGoalRisk&&z<bestGoal)))){
85
+ bestGoal=z;bestGoalDepth=ds[z];bestGoalRisk=risk;
86
+ }
87
+ continue;
88
+ }
89
+ if(ds[z]>=bestGoalDepth)continue;
90
+ if(nd>maxDepth)continue;
91
+ for(int v=0;v<4;v++){
92
+ if(v==(d^1))continue;
93
+ int pp=nxt(p,v);
94
+ if(pp<0||tr[pp]==ME||(insideOnly&&own[pp]!=ME))continue;
95
+ int zz=pp*4+v;
96
+ if(nd<ds[zz]){ds[zz]=nd;par[zz]=z;pd[zz]=v;q[tail++]=zz;}
97
+ }
98
+ }
99
+ }
100
+ vector<int> path(int z) const {
101
+ vector<int> a;
102
+ while(par[z]>=0){a.push_back(pd[z]);z=par[z];}
103
+ reverse(a.begin(),a.end());return a;
104
+ }
105
+ };
106
+
107
+ int enemyDist(const State&,int p) { return nearEnemy[p]; }
108
+ bool immediateHeadRisk(const State&s,int target) {
109
+ int mx=s.p[ME].x,my=s.p[ME].y;
110
+ for(int k=0;k<N;k++) if(k!=ME){
111
+ const auto &e=s.p[k];
112
+ int ep=pos(e.x,e.y);
113
+ for(int d=0;d<4;d++)if(d!=(e.d^1)){
114
+ int v=nxt(ep,d);
115
+ if(v==target || (ep==target&&v==pos(mx,my))) return true;
116
+ }
117
+ }
118
+ return false;
119
+ }
120
+ bool safeStep(const State&s,int d,bool avoidHead=true) {
121
+ const auto&m=s.p[ME];
122
+ if(d==(m.d^1))return false;
123
+ int v=nxt(pos(m.x,m.y),d);
124
+ if(v<0||tr[v]==ME)return false;
125
+ if(avoidHead&&immediateHeadRisk(s,v))return false;
126
+ return true;
127
+ }
128
+
129
+ struct Home {vector<int> path;int dist=10000;};
130
+ Home findHome(const State&s) {
131
+ const auto&m=s.p[ME];
132
+ int start=pos(m.x,m.y);
133
+ Paths b; b.run(start,m.d,false,100,true);
134
+ Home h;
135
+ if(b.bestGoal>=0){h.dist=b.bestGoalDepth;h.path=b.path(b.bestGoal);}
136
+ if(!h.path.empty()&&safeStep(s,h.path[0]))return h;
137
+ Home safer;
138
+ int bestRisk=-1;
139
+ for(int d=0;d<4;d++)if(safeStep(s,d)){
140
+ int p=nxt(start,d);
141
+ if(own[p]==ME)return {{d},1};
142
+ Paths alt;alt.run(p,d,false,99,true);
143
+ if(alt.bestGoal<0)continue;
144
+ int distance=alt.bestGoalDepth+1;
145
+ int risk=alt.bestGoalRisk;
146
+ if(distance<safer.dist||(distance==safer.dist&&risk>bestRisk)){
147
+ safer.dist=distance;bestRisk=risk;
148
+ safer.path={d};
149
+ auto rest=alt.path(alt.bestGoal);
150
+ safer.path.insert(safer.path.end(),rest.begin(),rest.end());
151
+ }
152
+ }
153
+ return safer.path.empty()?h:safer;
154
+ }
155
+
156
+ // Opportunistic cuts. Ignore a trail that its owner can retract before arrival.
157
+ vector<int> findCut(const State&s,int maxDist) {
158
+ const auto&m=s.p[ME];
159
+ Paths b;b.run(pos(m.x,m.y),m.d,false,maxDist);
160
+ int best=-1,score=-100000;
161
+ for(int p=0;p<W*H;p++) if(tr[p]>=0&&tr[p]!=ME){
162
+ int e=tr[p];
163
+ if(s.p[e].len==0)continue;
164
+ int home=enemyHome[e];
165
+ for(int d=0;d<4;d++){
166
+ int z=p*4+d,dist=b.ds[z];
167
+ if(dist<1||dist>maxDist||dist>home)continue;
168
+ auto path=b.path(z);
169
+ if(path.empty()||!safeStep(s,path[0]))continue;
170
+ int val=100-12*dist + 2*s.p[e].len;
171
+ if(val>score){score=val;best=z;}
172
+ }
173
+ }
174
+ return best<0?vector<int>{}:b.path(best);
175
+ }
176
+
177
+ struct Candidate {double score=-1e30;vector<int> route;int gain=0;int dur=0;};
178
+ // Compute exact gain for a closed path by flood filling with the proposed trail
179
+ // and current territory as walls. This also handles irregular old territory.
180
+ int exactGain(const vector<int>&path,int start) {
181
+ static unsigned char wall[SZ],seen[SZ];
182
+ int size=W*H;
183
+ for(int p=0;p<size;p++){wall[p]=(own[p]==ME);seen[p]=0;}
184
+ int p=start,haveTrail=0;
185
+ for(int d:path){
186
+ p=nxt(p,d);if(p<0)return 0;
187
+ if(own[p]!=ME){wall[p]=1;haveTrail=1;}
188
+ else if(haveTrail)break;
189
+ }
190
+ if(!haveTrail||own[p]!=ME)return 0;
191
+ int q[SZ],head=0,tail=0;
192
+ for(int x=0;x<W;x++)for(int v:{x,pos(x,H-1)})if(!wall[v]&&!seen[v])seen[v]=1,q[tail++]=v;
193
+ for(int y=0;y<H;y++)for(int v:{pos(0,y),pos(W-1,y)})if(!wall[v]&&!seen[v])seen[v]=1,q[tail++]=v;
194
+ while(head<tail){int z=q[head++];for(int d=0;d<4;d++){int v=nxt(z,d);if(v>=0&&!wall[v]&&!seen[v])seen[v]=1,q[tail++]=v;}}
195
+ int gain=0;
196
+ for(int v=0;v<size;v++)if(own[v]!=ME&&(wall[v]||!seen[v])){
197
+ int x=X(v),y=Y(v),protectedEnemy=0;
198
+ for(int k=0;k<N;k++)if(k!=ME&&abs(x-spawn[k].first)<=1&&abs(y-spawn[k].second)<=1)protectedEnemy=1;
199
+ if(!protectedEnemy)gain+=own[v]<0?neutralValue[v]:weightEnemy[own[v]];
200
+ }
201
+ return gain;
202
+ }
203
+
204
+ // Build a rectangular expedition, stopping at the first reentry into our land.
205
+ // The approach from the head to launch is entirely inside existing territory.
206
+ Candidate tryLoop(const State&s,int q,int dir1,int dir2,int a,int b,const vector<int>&approach,
207
+ int bestLimit=0) {
208
+ Candidate c;
209
+ int x=X(q),y=Y(q),p=q;
210
+ int dirs[4]={dir1,dir2,dir1^1,dir2^1};
211
+ int lens[4]={a,b,a,b};
212
+ int total=2*(a+b),t=0,ownSeen=0,near=1000,nearEarly=1000;
213
+ vector<int> loop;loop.reserve(total);
214
+ int minx=x,maxx=x,miny=y,maxy=y;
215
+ bool closed=false;
216
+ for(int seg=0;seg<4&&!closed;seg++)for(int j=0;j<lens[seg];j++){
217
+ p=nxt(p,dirs[seg]);if(p<0||tr[p]==ME)return c;
218
+ t++;loop.push_back(dirs[seg]);
219
+ minx=min(minx,X(p));maxx=max(maxx,X(p));miny=min(miny,Y(p));maxy=max(maxy,Y(p));
220
+ if(own[p]!=ME){
221
+ ownSeen=1;
222
+ int ed=enemyDist(s,p);
223
+ near=min(near,ed);if(t<=total/2)nearEarly=min(nearEarly,ed);
224
+ } else if(ownSeen){closed=true;break;}
225
+ }
226
+ if(!closed||t<7)return c;
227
+ int rough=rect(prefValue,minx,miny,maxx,maxy);
228
+ if(rough<bestLimit)return c;
229
+ int duration=(int)approach.size()+t;
230
+ if(s.turn+duration>MAXT)return c;
231
+ // Close enemy heads can easily cut an excursion. Penalize long exposure.
232
+ double threat=max(0.0,0.68*t-nearEarly);
233
+ threat=max(threat,max(0.0,0.55*t-near));
234
+ if(near<3) threat+=15;
235
+ double factor=exp(-threat/8.0);
236
+ double exponent=s.turn<450?1.0:s.turn<525?0.8:0.55;
237
+ double score=(rough/100.0)/pow(duration+9.0,exponent)*factor;
238
+ // Long approach consumes time but is safe; a slight bonus for taking land
239
+ // from rivals rewards pressure when neutral space becomes scarce.
240
+ if(score<0.15)return c;
241
+ c.route=approach;c.route.insert(c.route.end(),loop.begin(),loop.end());
242
+ c.gain=rough;c.dur=duration;c.score=score;
243
+ return c;
244
+ }
245
+
246
+ vector<int> planExpansion(const State&s) {
247
+ auto planningStart=chrono::steady_clock::now();
248
+ const auto&m=s.p[ME];
249
+ int start=pos(m.x,m.y);
250
+ Paths bfs;bfs.run(start,m.d,true,35);
251
+ // The maps are shared with tactical checks and were prepared once per turn.
252
+ static const int lengths[]={4,6,8,10,12,15,19,23};
253
+ vector<Candidate> top;
254
+ top.reserve(64);
255
+ for(int q=0;q<W*H;q++)if(own[q]==ME){
256
+ if(s.turn>0&&(q&31)==0&&
257
+ chrono::steady_clock::now()-planningStart>chrono::milliseconds(22))break;
258
+ for(int out=0;out<4;out++){
259
+ int pp=nxt(q,out);
260
+ if(pp<0||own[pp]==ME||tr[pp]==ME)continue;
261
+ int state=-1,bd=1000000;
262
+ for(int d=0;d<4;d++) if(out!=(d^1)&&bfs.ds[q*4+d]<bd){bd=bfs.ds[q*4+d];state=q*4+d;}
263
+ if(state<0||bd>32)continue;
264
+ vector<int> approach=bfs.path(state);
265
+ for(int side=0;side<4;side++)if((side/2)!=(out/2)){
266
+ for(int a:lengths)for(int b:lengths){
267
+ Candidate c=tryLoop(s,q,out,side,a,b,approach);
268
+ if(c.score<=-1e20)continue;
269
+ if(top.size()<64){top.push_back(move(c));}
270
+ else {
271
+ int wi=0;for(int i=1;i<(int)top.size();i++)if(top[i].score<top[wi].score)wi=i;
272
+ if(c.score>top[wi].score)top[wi]=move(c);
273
+ }
274
+ }
275
+ }
276
+ }
277
+ }
278
+ double best=-1;vector<int> route;
279
+ for(auto &c:top){
280
+ int gain=exactGain(c.route,start);
281
+ if(gain==0)continue;
282
+ double sc=c.score*(double(gain)/max(1,c.gain));
283
+ if(sc>best){best=sc;route=c.route;}
284
+ }
285
+ return route;
286
+ }
287
+
288
+ deque<int> plan;
289
+ int expected=-1,lastDeaths=-1,lastLen=0;
290
+ int decide(const State&s){
291
+ const auto&m=s.p[ME];int here=pos(m.x,m.y);
292
+ makeMaps(s);
293
+ if(expected>=0&&expected!=here)plan.clear();
294
+ if(lastDeaths>=0&&m.deaths!=lastDeaths)plan.clear();
295
+ if(lastLen>0&&m.len==0)plan.clear();
296
+ lastDeaths=m.deaths;lastLen=m.len;
297
+
298
+ // Immediate cuts almost always have higher value than one extra cell of land.
299
+ vector<int> cut=findCut(s,m.len?2:10);
300
+ if(!cut.empty()&&safeStep(s,cut[0])){plan.clear();return cut[0];}
301
+
302
+ if(m.len>0){
303
+ Home home=findHome(s);
304
+ int near=1000;
305
+ for(int p=0;p<W*H;p++)if(tr[p]==ME)near=min(near,enemyDist(s,p));
306
+ bool hurry=plan.empty()||near<=home.dist+4||near<=int(plan.size()*0.43)+2;
307
+ if(!plan.empty()&&!safeStep(s,plan.front()))hurry=true;
308
+ if(hurry&& !home.path.empty()&&safeStep(s,home.path[0],false)){
309
+ plan.clear();
310
+ for(int d:home.path)plan.push_back(d);
311
+ }
312
+ }
313
+ if(plan.empty()&&m.len==0){
314
+ auto v=planExpansion(s);
315
+ for(int d:v)plan.push_back(d);
316
+ }
317
+ if(!plan.empty()&&safeStep(s,plan.front())){
318
+ int d=plan.front();plan.pop_front();return d;
319
+ }
320
+ plan.clear();
321
+ if(m.len>0){Home h=findHome(s);if(!h.path.empty()&&safeStep(s,h.path[0],false))return h.path[0];}
322
+ int best=m.d,bs=-100000;
323
+ for(int d=0;d<4;d++)if(safeStep(s,d,false)){
324
+ int p=nxt(here,d),v=10*enemyDist(s,p)+(own[p]==ME?20:0);
325
+ if(v>bs){bs=v;best=d;}
326
+ }
327
+ return best;
328
+ }
329
+
330
+ int main(){
331
+ ios::sync_with_stdio(false);cin.tie(nullptr);
332
+ string t;cin>>t;
333
+ cin>>W>>H>>MAXT>>N>>ME>>MOVE_MS>>INIT_MS;
334
+ for(int i=0;i<N;i++){int k,x,y;cin>>t>>k>>x>>y;spawn[k]={x,y};}
335
+ State s;
336
+ while(readState(s)){
337
+ int d=decide(s);
338
+ expected=nxt(pos(s.p[ME].x,s.p[ME].y),d);
339
+ cout<<s.turn<<' '<<dc[d]<<'\n'<<flush;
340
+ }
341
+ }