kaggle-environments 0.2.1__py3-none-any.whl → 1.20.1__py3-none-any.whl

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.

Potentially problematic release.


This version of kaggle-environments might be problematic. Click here for more details.

Files changed (214) hide show
  1. kaggle_environments/__init__.py +49 -13
  2. kaggle_environments/agent.py +177 -124
  3. kaggle_environments/api.py +31 -0
  4. kaggle_environments/core.py +295 -170
  5. kaggle_environments/envs/cabt/cabt.js +164 -0
  6. kaggle_environments/envs/cabt/cabt.json +28 -0
  7. kaggle_environments/envs/cabt/cabt.py +186 -0
  8. kaggle_environments/envs/cabt/cg/__init__.py +0 -0
  9. kaggle_environments/envs/cabt/cg/cg.dll +0 -0
  10. kaggle_environments/envs/cabt/cg/game.py +75 -0
  11. kaggle_environments/envs/cabt/cg/libcg.so +0 -0
  12. kaggle_environments/envs/cabt/cg/sim.py +48 -0
  13. kaggle_environments/envs/cabt/test_cabt.py +120 -0
  14. kaggle_environments/envs/chess/chess.js +4289 -0
  15. kaggle_environments/envs/chess/chess.json +60 -0
  16. kaggle_environments/envs/chess/chess.py +4241 -0
  17. kaggle_environments/envs/chess/test_chess.py +60 -0
  18. kaggle_environments/envs/connectx/connectx.ipynb +3186 -0
  19. kaggle_environments/envs/connectx/connectx.js +1 -1
  20. kaggle_environments/envs/connectx/connectx.json +15 -1
  21. kaggle_environments/envs/connectx/connectx.py +6 -23
  22. kaggle_environments/envs/connectx/test_connectx.py +70 -24
  23. kaggle_environments/envs/football/football.ipynb +75 -0
  24. kaggle_environments/envs/football/football.json +91 -0
  25. kaggle_environments/envs/football/football.py +277 -0
  26. kaggle_environments/envs/football/helpers.py +95 -0
  27. kaggle_environments/envs/football/test_football.py +360 -0
  28. kaggle_environments/envs/halite/__init__.py +0 -0
  29. kaggle_environments/envs/halite/halite.ipynb +44741 -0
  30. kaggle_environments/envs/halite/halite.js +199 -83
  31. kaggle_environments/envs/halite/halite.json +31 -18
  32. kaggle_environments/envs/halite/halite.py +164 -303
  33. kaggle_environments/envs/halite/helpers.py +720 -0
  34. kaggle_environments/envs/halite/test_halite.py +190 -0
  35. kaggle_environments/envs/hungry_geese/__init__.py +0 -0
  36. kaggle_environments/envs/{battlegeese/battlegeese.js → hungry_geese/hungry_geese.js} +38 -22
  37. kaggle_environments/envs/{battlegeese/battlegeese.json → hungry_geese/hungry_geese.json} +21 -14
  38. kaggle_environments/envs/hungry_geese/hungry_geese.py +316 -0
  39. kaggle_environments/envs/hungry_geese/test_hungry_geese.py +0 -0
  40. kaggle_environments/envs/identity/identity.json +6 -5
  41. kaggle_environments/envs/identity/identity.py +15 -2
  42. kaggle_environments/envs/kore_fleets/__init__.py +0 -0
  43. kaggle_environments/envs/kore_fleets/helpers.py +1005 -0
  44. kaggle_environments/envs/kore_fleets/kore_fleets.ipynb +114 -0
  45. kaggle_environments/envs/kore_fleets/kore_fleets.js +658 -0
  46. kaggle_environments/envs/kore_fleets/kore_fleets.json +164 -0
  47. kaggle_environments/envs/kore_fleets/kore_fleets.py +555 -0
  48. kaggle_environments/envs/kore_fleets/starter_bots/java/Bot.java +54 -0
  49. kaggle_environments/envs/kore_fleets/starter_bots/java/README.md +26 -0
  50. kaggle_environments/envs/kore_fleets/starter_bots/java/jars/hamcrest-core-1.3.jar +0 -0
  51. kaggle_environments/envs/kore_fleets/starter_bots/java/jars/junit-4.13.2.jar +0 -0
  52. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Board.java +518 -0
  53. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Cell.java +61 -0
  54. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Configuration.java +24 -0
  55. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Direction.java +166 -0
  56. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Fleet.java +72 -0
  57. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/KoreJson.java +97 -0
  58. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Observation.java +72 -0
  59. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Pair.java +13 -0
  60. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Player.java +68 -0
  61. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Point.java +65 -0
  62. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Shipyard.java +70 -0
  63. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/ShipyardAction.java +59 -0
  64. kaggle_environments/envs/kore_fleets/starter_bots/java/main.py +73 -0
  65. kaggle_environments/envs/kore_fleets/starter_bots/java/test/BoardTest.java +567 -0
  66. kaggle_environments/envs/kore_fleets/starter_bots/java/test/ConfigurationTest.java +25 -0
  67. kaggle_environments/envs/kore_fleets/starter_bots/java/test/KoreJsonTest.java +62 -0
  68. kaggle_environments/envs/kore_fleets/starter_bots/java/test/ObservationTest.java +46 -0
  69. kaggle_environments/envs/kore_fleets/starter_bots/java/test/PointTest.java +21 -0
  70. kaggle_environments/envs/kore_fleets/starter_bots/java/test/ShipyardTest.java +22 -0
  71. kaggle_environments/envs/kore_fleets/starter_bots/java/test/configuration.json +1 -0
  72. kaggle_environments/envs/kore_fleets/starter_bots/java/test/fullob.json +1 -0
  73. kaggle_environments/envs/kore_fleets/starter_bots/java/test/observation.json +1 -0
  74. kaggle_environments/envs/kore_fleets/starter_bots/python/__init__.py +0 -0
  75. kaggle_environments/envs/kore_fleets/starter_bots/python/main.py +27 -0
  76. kaggle_environments/envs/kore_fleets/starter_bots/ts/Bot.ts +34 -0
  77. kaggle_environments/envs/kore_fleets/starter_bots/ts/DoNothingBot.ts +12 -0
  78. kaggle_environments/envs/kore_fleets/starter_bots/ts/MinerBot.ts +62 -0
  79. kaggle_environments/envs/kore_fleets/starter_bots/ts/README.md +55 -0
  80. kaggle_environments/envs/kore_fleets/starter_bots/ts/interpreter.ts +402 -0
  81. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Board.ts +514 -0
  82. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Cell.ts +63 -0
  83. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Configuration.ts +25 -0
  84. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Direction.ts +169 -0
  85. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Fleet.ts +76 -0
  86. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/KoreIO.ts +70 -0
  87. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Observation.ts +45 -0
  88. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Pair.ts +11 -0
  89. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Player.ts +68 -0
  90. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Point.ts +65 -0
  91. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Shipyard.ts +72 -0
  92. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/ShipyardAction.ts +58 -0
  93. kaggle_environments/envs/kore_fleets/starter_bots/ts/main.py +73 -0
  94. kaggle_environments/envs/kore_fleets/starter_bots/ts/miner.py +73 -0
  95. kaggle_environments/envs/kore_fleets/starter_bots/ts/package.json +23 -0
  96. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/BoardTest.ts +551 -0
  97. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/ConfigurationTest.ts +16 -0
  98. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/ObservationTest.ts +33 -0
  99. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/PointTest.ts +17 -0
  100. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/ShipyardTest.ts +18 -0
  101. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/configuration.json +1 -0
  102. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/fullob.json +1 -0
  103. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/observation.json +1 -0
  104. kaggle_environments/envs/kore_fleets/starter_bots/ts/tsconfig.json +22 -0
  105. kaggle_environments/envs/kore_fleets/test_kore_fleets.py +331 -0
  106. kaggle_environments/envs/lux_ai_2021/README.md +3 -0
  107. kaggle_environments/envs/lux_ai_2021/__init__.py +0 -0
  108. kaggle_environments/envs/lux_ai_2021/agents.py +11 -0
  109. kaggle_environments/envs/lux_ai_2021/dimensions/754.js +2 -0
  110. kaggle_environments/envs/lux_ai_2021/dimensions/754.js.LICENSE.txt +296 -0
  111. kaggle_environments/envs/lux_ai_2021/dimensions/main.js +1 -0
  112. kaggle_environments/envs/lux_ai_2021/index.html +43 -0
  113. kaggle_environments/envs/lux_ai_2021/lux_ai_2021.json +100 -0
  114. kaggle_environments/envs/lux_ai_2021/lux_ai_2021.py +231 -0
  115. kaggle_environments/envs/lux_ai_2021/test_agents/__init__.py +0 -0
  116. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/game_constants.js +6 -0
  117. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/game_constants.json +59 -0
  118. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/game_objects.js +145 -0
  119. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/io.js +14 -0
  120. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/kit.js +209 -0
  121. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/map.js +107 -0
  122. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/parser.js +79 -0
  123. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/main.js +88 -0
  124. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/main.py +75 -0
  125. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/simple.tar.gz +0 -0
  126. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/__init__.py +0 -0
  127. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/annotate.py +20 -0
  128. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/constants.py +25 -0
  129. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game.py +86 -0
  130. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_constants.json +59 -0
  131. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_constants.py +7 -0
  132. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_map.py +106 -0
  133. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_objects.py +154 -0
  134. kaggle_environments/envs/lux_ai_2021/test_agents/python/random_agent.py +38 -0
  135. kaggle_environments/envs/lux_ai_2021/test_agents/python/simple_agent.py +82 -0
  136. kaggle_environments/envs/lux_ai_2021/test_lux.py +19 -0
  137. kaggle_environments/envs/lux_ai_2021/testing.md +23 -0
  138. kaggle_environments/envs/lux_ai_2021/todo.md.og +18 -0
  139. kaggle_environments/envs/lux_ai_s3/README.md +21 -0
  140. kaggle_environments/envs/lux_ai_s3/agents.py +5 -0
  141. kaggle_environments/envs/lux_ai_s3/index.html +42 -0
  142. kaggle_environments/envs/lux_ai_s3/lux_ai_s3.json +47 -0
  143. kaggle_environments/envs/lux_ai_s3/lux_ai_s3.py +178 -0
  144. kaggle_environments/envs/lux_ai_s3/luxai_s3/__init__.py +1 -0
  145. kaggle_environments/envs/lux_ai_s3/luxai_s3/env.py +819 -0
  146. kaggle_environments/envs/lux_ai_s3/luxai_s3/globals.py +9 -0
  147. kaggle_environments/envs/lux_ai_s3/luxai_s3/params.py +101 -0
  148. kaggle_environments/envs/lux_ai_s3/luxai_s3/profiler.py +141 -0
  149. kaggle_environments/envs/lux_ai_s3/luxai_s3/pygame_render.py +222 -0
  150. kaggle_environments/envs/lux_ai_s3/luxai_s3/spaces.py +27 -0
  151. kaggle_environments/envs/lux_ai_s3/luxai_s3/state.py +464 -0
  152. kaggle_environments/envs/lux_ai_s3/luxai_s3/utils.py +12 -0
  153. kaggle_environments/envs/lux_ai_s3/luxai_s3/wrappers.py +156 -0
  154. kaggle_environments/envs/lux_ai_s3/test_agents/python/agent.py +78 -0
  155. kaggle_environments/envs/lux_ai_s3/test_agents/python/lux/__init__.py +0 -0
  156. kaggle_environments/envs/lux_ai_s3/test_agents/python/lux/kit.py +31 -0
  157. kaggle_environments/envs/lux_ai_s3/test_agents/python/lux/utils.py +17 -0
  158. kaggle_environments/envs/lux_ai_s3/test_agents/python/main.py +66 -0
  159. kaggle_environments/envs/lux_ai_s3/test_lux.py +9 -0
  160. kaggle_environments/envs/mab/__init__.py +0 -0
  161. kaggle_environments/envs/mab/agents.py +12 -0
  162. kaggle_environments/envs/mab/mab.js +100 -0
  163. kaggle_environments/envs/mab/mab.json +74 -0
  164. kaggle_environments/envs/mab/mab.py +146 -0
  165. kaggle_environments/envs/open_spiel/__init__.py +0 -0
  166. kaggle_environments/envs/open_spiel/games/__init__.py +0 -0
  167. kaggle_environments/envs/open_spiel/games/chess/chess.js +441 -0
  168. kaggle_environments/envs/open_spiel/games/chess/image_config.jsonl +20 -0
  169. kaggle_environments/envs/open_spiel/games/chess/openings.jsonl +20 -0
  170. kaggle_environments/envs/open_spiel/games/connect_four/__init__.py +0 -0
  171. kaggle_environments/envs/open_spiel/games/connect_four/connect_four.js +284 -0
  172. kaggle_environments/envs/open_spiel/games/connect_four/connect_four_proxy.py +86 -0
  173. kaggle_environments/envs/open_spiel/games/go/__init__.py +0 -0
  174. kaggle_environments/envs/open_spiel/games/go/go.js +481 -0
  175. kaggle_environments/envs/open_spiel/games/go/go_proxy.py +99 -0
  176. kaggle_environments/envs/open_spiel/games/tic_tac_toe/__init__.py +0 -0
  177. kaggle_environments/envs/open_spiel/games/tic_tac_toe/tic_tac_toe.js +345 -0
  178. kaggle_environments/envs/open_spiel/games/tic_tac_toe/tic_tac_toe_proxy.py +98 -0
  179. kaggle_environments/envs/open_spiel/games/universal_poker/__init__.py +0 -0
  180. kaggle_environments/envs/open_spiel/games/universal_poker/universal_poker.js +431 -0
  181. kaggle_environments/envs/open_spiel/games/universal_poker/universal_poker_proxy.py +159 -0
  182. kaggle_environments/envs/open_spiel/html_playthrough_generator.py +31 -0
  183. kaggle_environments/envs/open_spiel/observation.py +128 -0
  184. kaggle_environments/envs/open_spiel/open_spiel.py +565 -0
  185. kaggle_environments/envs/open_spiel/proxy.py +138 -0
  186. kaggle_environments/envs/open_spiel/test_open_spiel.py +191 -0
  187. kaggle_environments/envs/rps/__init__.py +0 -0
  188. kaggle_environments/envs/rps/agents.py +84 -0
  189. kaggle_environments/envs/rps/helpers.py +25 -0
  190. kaggle_environments/envs/rps/rps.js +117 -0
  191. kaggle_environments/envs/rps/rps.json +63 -0
  192. kaggle_environments/envs/rps/rps.py +90 -0
  193. kaggle_environments/envs/rps/test_rps.py +110 -0
  194. kaggle_environments/envs/rps/utils.py +7 -0
  195. kaggle_environments/envs/tictactoe/test_tictactoe.py +43 -77
  196. kaggle_environments/envs/tictactoe/tictactoe.ipynb +1397 -0
  197. kaggle_environments/envs/tictactoe/tictactoe.json +10 -2
  198. kaggle_environments/envs/tictactoe/tictactoe.py +1 -1
  199. kaggle_environments/errors.py +2 -4
  200. kaggle_environments/helpers.py +377 -0
  201. kaggle_environments/main.py +340 -0
  202. kaggle_environments/schemas.json +23 -18
  203. kaggle_environments/static/player.html +206 -74
  204. kaggle_environments/utils.py +46 -73
  205. {kaggle_environments-0.2.1.dist-info → kaggle_environments-1.20.1.dist-info}/METADATA +36 -114
  206. kaggle_environments-1.20.1.dist-info/RECORD +211 -0
  207. {kaggle_environments-0.2.1.dist-info → kaggle_environments-1.20.1.dist-info}/WHEEL +1 -2
  208. kaggle_environments-1.20.1.dist-info/entry_points.txt +3 -0
  209. kaggle_environments/envs/battlegeese/battlegeese.py +0 -223
  210. kaggle_environments/temp.py +0 -14
  211. kaggle_environments-0.2.1.dist-info/RECORD +0 -32
  212. kaggle_environments-0.2.1.dist-info/entry_points.txt +0 -3
  213. kaggle_environments-0.2.1.dist-info/top_level.txt +0 -1
  214. {kaggle_environments-0.2.1.dist-info → kaggle_environments-1.20.1.dist-info/licenses}/LICENSE +0 -0
@@ -0,0 +1,166 @@
1
+ package kore;
2
+
3
+
4
+ public class Direction extends Point {
5
+
6
+ public static final Direction NORTH = new Direction(0, 1);
7
+ public static final Direction EAST = new Direction(1, 0);
8
+ public static final Direction SOUTH = new Direction(0, -1);
9
+ public static final Direction WEST = new Direction(-1, 0);
10
+
11
+ private Direction(int x, int y) {
12
+ super(x, y);
13
+ }
14
+
15
+ public boolean equals(Direction other) {
16
+ return this.x == other.x && this.y == other.y;
17
+ }
18
+
19
+ public Direction rotateLeft() {
20
+ if (this.equals(Direction.NORTH)) {
21
+ return Direction.WEST;
22
+ }
23
+ if (this.equals(Direction.WEST)) {
24
+ return Direction.SOUTH;
25
+ }
26
+ if (this.equals(Direction.SOUTH)) {
27
+ return Direction.EAST;
28
+ }
29
+ if (this.equals(Direction.EAST)) {
30
+ return Direction.NORTH;
31
+ }
32
+ throw new IllegalStateException("invalid direction");
33
+ }
34
+
35
+ public Direction rotateRight() {
36
+ if (this.equals(Direction.NORTH)) {
37
+ return Direction.EAST;
38
+ }
39
+ if (this.equals(Direction.EAST)) {
40
+ return Direction.SOUTH;
41
+ }
42
+ if (this.equals(Direction.SOUTH)) {
43
+ return Direction.WEST;
44
+ }
45
+ if (this.equals(Direction.WEST)) {
46
+ return Direction.NORTH;
47
+ }
48
+ throw new IllegalStateException("invalid direction");
49
+ }
50
+
51
+ public Direction opposite() {
52
+ if (this.equals(Direction.NORTH)) {
53
+ return Direction.SOUTH;
54
+ }
55
+ if (this.equals(Direction.EAST)) {
56
+ return Direction.WEST;
57
+ }
58
+ if (this.equals(Direction.SOUTH)) {
59
+ return Direction.NORTH;
60
+ }
61
+ if (this.equals(Direction.WEST)) {
62
+ return Direction.EAST;
63
+ }
64
+ throw new IllegalStateException("invalid direction");
65
+ }
66
+
67
+ public String toChar() {
68
+ if (this.equals(Direction.NORTH)) {
69
+ return "N";
70
+ }
71
+ if (this.equals(Direction.EAST)) {
72
+ return "E";
73
+ }
74
+ if (this.equals(Direction.SOUTH)) {
75
+ return "S";
76
+ }
77
+ if (this.equals(Direction.WEST)) {
78
+ return "W";
79
+ }
80
+ throw new IllegalStateException("invalid direction");
81
+ }
82
+
83
+ public String toString() {
84
+ if (this.equals(Direction.NORTH)) {
85
+ return "NORTH";
86
+ }
87
+ if (this.equals(Direction.EAST)) {
88
+ return "EAST";
89
+ }
90
+ if (this.equals(Direction.SOUTH)) {
91
+ return "SOUTH";
92
+ }
93
+ if (this.equals(Direction.WEST)) {
94
+ return "WEST";
95
+ }
96
+ throw new IllegalStateException("invalid direction");
97
+ }
98
+
99
+ public int toIndex() {
100
+ if (this.equals(Direction.NORTH)) {
101
+ return 0;
102
+ }
103
+ if (this.equals(Direction.EAST)) {
104
+ return 1;
105
+ }
106
+ if (this.equals(Direction.SOUTH)) {
107
+ return 2;
108
+ }
109
+ if (this.equals(Direction.WEST)) {
110
+ return 3;
111
+ }
112
+ throw new IllegalStateException("invalid direction");
113
+ }
114
+
115
+ public static Direction fromString(String dirStr) {
116
+ switch(dirStr) {
117
+ case "NORTH":
118
+ return Direction.NORTH;
119
+ case "EAST":
120
+ return Direction.EAST;
121
+ case "SOUTH":
122
+ return Direction.SOUTH;
123
+ case "WEST":
124
+ return Direction.WEST;
125
+ }
126
+ throw new IllegalStateException("invalid direction");
127
+ }
128
+
129
+ public static Direction fromChar(char dirChar) {
130
+ switch(dirChar) {
131
+ case 'N':
132
+ return Direction.NORTH;
133
+ case 'E':
134
+ return Direction.EAST;
135
+ case 'S':
136
+ return Direction.SOUTH;
137
+ case 'W':
138
+ return Direction.WEST;
139
+ }
140
+ throw new IllegalStateException("invalid direction");
141
+ }
142
+
143
+ public static Direction fromIndex(int index) {
144
+ switch(index) {
145
+ case 0:
146
+ return Direction.NORTH;
147
+ case 1:
148
+ return Direction.EAST;
149
+ case 2:
150
+ return Direction.SOUTH;
151
+ case 3:
152
+ return Direction.WEST;
153
+ }
154
+ throw new IllegalStateException("invalid direction");
155
+ }
156
+
157
+ public static Direction[] listDirections() {
158
+ return new Direction[]{
159
+ Direction.NORTH,
160
+ Direction.EAST,
161
+ Direction.SOUTH,
162
+ Direction.WEST
163
+ };
164
+ }
165
+
166
+ }
@@ -0,0 +1,72 @@
1
+ package kore;
2
+
3
+ public class Fleet {
4
+
5
+ public final String id;
6
+ public int shipCount;
7
+ public Direction direction;
8
+ public Point position;
9
+ public String flightPlan;
10
+ public double kore;
11
+ public final int playerId;
12
+ public final Board board;
13
+
14
+ public Fleet(String fleetId, int shipCount, Direction direction, Point position, double kore, String flightPlan, int playerId, Board board) {
15
+ this.id = fleetId;
16
+ this.shipCount = shipCount;
17
+ this.direction = direction;
18
+ this.position = position;
19
+ this.flightPlan = flightPlan;
20
+ this.kore = kore;
21
+ this.playerId = playerId;
22
+ this.board = board;
23
+ }
24
+
25
+ public Fleet cloneToBoard(Board board) {
26
+ return new Fleet(this.id, this.shipCount, this.direction, this.position, this.kore, this.flightPlan, this.playerId, board);
27
+ }
28
+
29
+ public Cell cell() {
30
+ return this.board.getCellAtPosition(this.position);
31
+ }
32
+
33
+ public Player player() {
34
+ return this.board.players[this.playerId];
35
+ }
36
+
37
+ public double collectionRate() {
38
+ return Math.min(Math.log(this.shipCount) / 10, .99);
39
+ }
40
+
41
+ /**
42
+ * Returns the length of the longest possible flight plan this fleet can be assigned
43
+ * @return
44
+ */
45
+ public static int maxFlightPlanLenForShipCount(int shipCount) {
46
+ return (int) (Math.floor(2 * Math.log(shipCount)) + 1);
47
+ }
48
+
49
+ /**
50
+ * Converts a fleet back to the normalized observation subset that constructed it.
51
+ */
52
+ public String[] observation() {
53
+ return new String[]{
54
+ String.valueOf(this.position.toIndex(this.board.configuration.size)),
55
+ String.valueOf(this.kore),
56
+ String.valueOf(this.shipCount),
57
+ String.valueOf(this.direction.toIndex()),
58
+ this.flightPlan
59
+ };
60
+ }
61
+
62
+ public boolean lessThanOtherAlliedFleet(Fleet other) {
63
+ if (this.shipCount != other.shipCount) {
64
+ return this.shipCount < other.shipCount;
65
+ }
66
+ if (this.kore != other.kore) {
67
+ return this.kore < other.kore;
68
+ }
69
+ return this.direction.toIndex() > other.direction.toIndex();
70
+ }
71
+
72
+ }
@@ -0,0 +1,97 @@
1
+ package kore;
2
+
3
+ /**
4
+ * Don't want to import a full blown json library
5
+ * Our json is simple enough to use this
6
+ */
7
+ public class KoreJson {
8
+
9
+ public static int getIntFromJson(String raw, String key) {
10
+ return (int)Integer.parseInt(getNumberPartFromJson(raw, key));
11
+ }
12
+
13
+ private static String getNumberPartFromJson(String raw, String key) {
14
+ int keyIdx = raw.indexOf(key);
15
+ if (keyIdx < 0) {
16
+ throw new IllegalStateException("couldn't find key in raw");
17
+ }
18
+ String rest = raw.substring(keyIdx + key.length() + 3);
19
+ int end = rest.indexOf(",") > 0 ? rest.indexOf(",") : rest.indexOf("}");
20
+ return rest.substring(0, end);
21
+ }
22
+
23
+ public static int getPlayerIdxFromJson(String raw) {
24
+ String key = "'player': ";
25
+ String key2 = "\"player\": ";
26
+ int keyIdx = Math.max(raw.indexOf(key), raw.indexOf(key2));
27
+ if (keyIdx < 0) {
28
+ throw new IllegalStateException("couldn't find key in raw");
29
+ }
30
+ String rest = raw.substring(keyIdx + key.length());
31
+ int end = rest.indexOf(",") > 0 ? rest.indexOf(",") : rest.indexOf("}");
32
+ return (int)Integer.parseInt(rest.substring(0, end));
33
+ }
34
+
35
+ public static String getStrFromJson(String raw, String key) {
36
+ int keyIdx = raw.indexOf(key);
37
+ if (keyIdx < 0) {
38
+ throw new IllegalStateException("couldn't find key in raw");
39
+ }
40
+ String rest = raw.substring(keyIdx + key.length() + 4);
41
+ int end = rest.indexOf(",") > 0 ? rest.indexOf(",") : rest.indexOf("}");
42
+ return rest.substring(0, end - 1);
43
+ }
44
+
45
+ public static double getDoubleFromJson(String raw, String key) {
46
+ String val = getNumberPartFromJson(raw, key);
47
+ return Double.parseDouble(val);
48
+ }
49
+
50
+ private static String getStrArrStrFromJson(String raw, String key) {
51
+ int keyIdx = raw.indexOf(key);
52
+ if (keyIdx < 0) {
53
+ throw new IllegalStateException("couldn't find key in raw");
54
+ }
55
+ String rest = raw.substring(keyIdx + key.length() + 4);
56
+ int end = rest.indexOf("],") > 0 ? rest.indexOf("],") : rest.indexOf("]}");
57
+ return rest.substring(0, end);
58
+ }
59
+
60
+ public static String[] getPlayerPartsFromJson(String raw) {
61
+ String key = "players";
62
+ int keyIdx = raw.indexOf(key);
63
+ if (keyIdx < 0) {
64
+ throw new IllegalStateException("couldn't find key in raw");
65
+ }
66
+ String rest = raw.substring(keyIdx + key.length() + 5);
67
+ int end = rest.indexOf("]],") > 0 ? rest.indexOf("]],") : rest.indexOf("]]}");
68
+ return rest.substring(0, end).split("], \\[");
69
+ }
70
+
71
+ public static String[] getStrArrFromJson(String raw, String key) {
72
+ String arrStr = getStrArrStrFromJson(raw, key);
73
+ return arrStr.split(", ");
74
+ }
75
+
76
+ public static int[] getIntArrFromJson(String raw, String key) {
77
+ String[] arrStrParts = getStrArrStrFromJson(raw, key).split(", ");
78
+ int[] intArr = new int[arrStrParts.length];
79
+ for (int i = 0; i < arrStrParts[i].length(); i++) {
80
+ intArr[i] = Integer.parseInt(arrStrParts[i]);
81
+ }
82
+ return intArr;
83
+ }
84
+
85
+ public static double[] getDoubleArrFromJson(String raw, String key) {
86
+ String[] arrStrParts = getStrArrStrFromJson(raw, key).split(", ");
87
+ double[] doubleArr = new double[arrStrParts.length];
88
+ for (int i = 0; i < arrStrParts[i].length(); i++) {
89
+ doubleArr[i] = Double.parseDouble(arrStrParts[i]);
90
+ }
91
+ return doubleArr;
92
+ }
93
+
94
+ public static boolean containsKey(String raw, String key) {
95
+ return raw.indexOf(key) > -1;
96
+ }
97
+ }
@@ -0,0 +1,72 @@
1
+ package kore;
2
+
3
+ import java.util.ArrayList;
4
+ import java.util.Arrays;
5
+ import java.util.HashMap;
6
+
7
+ public class Observation {
8
+ public final double[] kore;
9
+ public final double[] playerHlt;
10
+ public final ArrayList<HashMap<String, int[]>> playerShipyards;
11
+ public final ArrayList<HashMap<String, String[]>> playerFleets;
12
+ public final int player;
13
+ public final int step;
14
+ public final double remainingOverageTime;
15
+
16
+ private static String shortenFrontAndBack(String target, int n) {
17
+ return target.substring(n, target.length() - n);
18
+ }
19
+
20
+ public Observation(String rawObservation) {
21
+ // avoid importing json library? worth it?
22
+ this.kore = KoreJson.getDoubleArrFromJson(rawObservation, "kore");
23
+ this.player = KoreJson.getPlayerIdxFromJson(rawObservation);
24
+ this.step = KoreJson.getIntFromJson(rawObservation, "step");
25
+ this.remainingOverageTime = KoreJson.getDoubleFromJson(rawObservation, "remainingOverageTime");
26
+ String[] playerParts = KoreJson.getPlayerPartsFromJson(rawObservation);
27
+ playerHlt = new double[playerParts.length];
28
+ playerShipyards = new ArrayList<HashMap<String, int[]>>();
29
+ playerFleets = new ArrayList<HashMap<String, String[]>>();
30
+
31
+ for (int i = 0; i < playerParts.length; i ++) {
32
+ String playerPart = playerParts[i];
33
+ playerHlt[i] = Double.parseDouble(playerPart.split(", ")[0]);
34
+
35
+ int startShipyards = playerPart.indexOf("{");
36
+ int endShipyards = playerPart.indexOf("}");
37
+ String shipyardsStr = playerPart.substring(startShipyards + 1, endShipyards - 1);
38
+ HashMap<String, int[]> shipyards = new HashMap<String, int[]>();
39
+ Arrays.stream(shipyardsStr.split("], ")).forEach(shipyardStr -> {
40
+ if (shipyardStr.length() == 0) {
41
+ return;
42
+ }
43
+ String[] kvparts = shipyardStr.split(": \\[");
44
+ String shipyardId = shortenFrontAndBack(kvparts[0], 1);
45
+ String[] shipyardStrs = kvparts[1].split(", ");
46
+ int[] shipyard = new int[shipyardStrs.length];
47
+ Integer[] shipyardInts = Arrays.stream(shipyardStrs).map(s -> Integer.parseInt(s)).toArray(Integer[]::new);
48
+ for(int j = 0; j < shipyard.length; j++) {
49
+ shipyard[j] = shipyardInts[j];
50
+ }
51
+ shipyards.put(shipyardId, shipyard);
52
+ });
53
+ playerShipyards.add(shipyards);
54
+
55
+ int startFleets = playerPart.indexOf("}, ");
56
+ String fleetsStr = playerPart.substring(startFleets + 4, playerPart.length() - 1);
57
+ HashMap<String, String[]> fleets = new HashMap<>();
58
+ Arrays.stream(fleetsStr.split("], ")).forEach(fleetStr -> {
59
+ if (fleetStr.length() == 0) {
60
+ return;
61
+ }
62
+ String[] kvparts = fleetStr.split(": ");
63
+ String fleetId = shortenFrontAndBack(kvparts[0], 1);
64
+ String[] fleet = shortenFrontAndBack(kvparts[1], 1).split(", ");
65
+ fleets.put(fleetId, fleet);
66
+ });
67
+ playerFleets.add(fleets);
68
+ }
69
+ }
70
+
71
+
72
+ }
@@ -0,0 +1,13 @@
1
+ package kore;
2
+
3
+ public class Pair<F, S> {
4
+
5
+ public final F first;
6
+ public final S second;
7
+
8
+ public Pair(F first, S second) {
9
+ this.first = first;
10
+ this.second = second;
11
+ }
12
+
13
+ }
@@ -0,0 +1,68 @@
1
+ package kore;
2
+
3
+ import java.util.ArrayList;
4
+ import java.util.Arrays;
5
+ import java.util.HashMap;
6
+ import java.util.stream.Collectors;
7
+
8
+ public class Player {
9
+ public final int id;
10
+ public double kore;
11
+ public final ArrayList<String> shipyardIds;
12
+ public final ArrayList<String> fleetIds;
13
+ public final Board board;
14
+
15
+ public Player(int playerId, double kore, ArrayList<String> shipyardIds, ArrayList<String> fleetIds, Board board) {
16
+ this.id = playerId;
17
+ this.kore = kore;
18
+ this.shipyardIds = shipyardIds;
19
+ this.fleetIds = fleetIds;
20
+ this.board = board;
21
+ }
22
+
23
+ public Player cloneToBoard(Board board) {
24
+ return new Player(this.id, this.kore, new ArrayList<String>(this.shipyardIds.stream().collect(Collectors.toList())), new ArrayList<String>(this.fleetIds.stream().collect(Collectors.toList())), board);
25
+ }
26
+
27
+ /**
28
+ * Returns all shipyards owned by this player.
29
+ * @return
30
+ */
31
+ public Shipyard[] shipyards() {
32
+ return this.board.shipyards.values().stream().filter(shipyard -> this.shipyardIds.stream().anyMatch(sId -> sId == shipyard.id)).toArray(Shipyard[]::new);
33
+ }
34
+
35
+ /**
36
+ * Returns all fleets owned by this player.
37
+ */
38
+ public Fleet[] fleets() {
39
+ return this.board.fleets.values().stream().filter(fleet -> this.fleetIds.stream().anyMatch(fId -> fId == fleet.id)).toArray(Fleet[]::new);
40
+ }
41
+
42
+ /**
43
+ * Returns whether this player is the current player (generally if this returns True, this player is you.
44
+ */
45
+ public boolean isCurrentPlayer() {
46
+ return this.id == this.board.currentPlayerId;
47
+ }
48
+
49
+ /**
50
+ * Returns all queued fleet and shipyard actions for this player formatted for the kore interpreter to receive as an agent response.
51
+ */
52
+ public HashMap<String, ShipyardAction> nextActions() {
53
+ HashMap<String, ShipyardAction> result = new HashMap<>();
54
+ Arrays.stream(this.shipyards()).filter(shipyard -> shipyard.nextAction.isPresent()).forEach(shipyard -> result.put(shipyard.id, shipyard.nextAction.get()));
55
+ return result;
56
+ }
57
+
58
+ /**
59
+ * Converts a player back to the normalized observation subset that constructed it.
60
+ */
61
+ public Object[] observation() {
62
+ HashMap<String, int[]> shipyards = new HashMap<>();
63
+ Arrays.stream(this.shipyards()).forEach(shipyard -> shipyards.put(shipyard.id, shipyard.observation()));
64
+ HashMap<String, String[]> fleets = new HashMap<>();
65
+ Arrays.stream(this.fleets()).forEach(fleet -> fleets.put(fleet.id, fleet.observation()));
66
+ return new Object[]{this.kore, shipyards, fleets};
67
+ }
68
+ }
@@ -0,0 +1,65 @@
1
+ package kore;
2
+
3
+ public class Point {
4
+ public final int x, y;
5
+
6
+ public Point(int x, int y) {
7
+ this.x = x;
8
+ this.y = y;
9
+ }
10
+
11
+ public Point translate(Point offset, int size) {
12
+ return this.add(offset).mod(size);
13
+ }
14
+
15
+ public Point add(Point other) {
16
+ return new Point(this.x + other.x, this.y + other.y);
17
+ }
18
+
19
+ public Point mod(int size) {
20
+ return new Point(this.x % size, this.y % size);
21
+ }
22
+
23
+ /**
24
+ * Gets the manhatten distance between two points
25
+ */
26
+ public int distanceTo(Point other, int size) {
27
+ int abs_x = Math.abs(this.x - other.x);
28
+ int dist_x = abs_x < size/2 ? abs_x : size - abs_x;
29
+ int abs_y = Math.abs(this.y - other.y);
30
+ int dist_y = abs_y < size/2 ? abs_y : size - abs_y;
31
+ return dist_x + dist_y;
32
+ }
33
+
34
+ /**
35
+ * Converts a 2d position in the form (x, y) to an index in the observation.kore list.
36
+ * See fromIndex for the inverse.
37
+ */
38
+ public int toIndex(int size) {
39
+ return (size - this.y - 1) * size + this.x;
40
+ }
41
+
42
+ public static Point fromIndex(int index, int size) {
43
+ return new Point(index % size, size - index/size - 1);
44
+ }
45
+
46
+ public Point abs() {
47
+ return new Point(Math.abs(this.x), Math.abs(this.y));
48
+ }
49
+
50
+ public boolean equals(Point other) {
51
+ return this.x == other.x && this.y == other.y;
52
+ }
53
+
54
+ public String toString() {
55
+ return "(" + this.x + "," + this.y + ")";
56
+ }
57
+
58
+ public Point multiply(int factor) {
59
+ return new Point(factor * this.x, factor * this.y);
60
+ }
61
+
62
+ public Point subtract(Point other) {
63
+ return new Point(this.x - other.x, this.y - other.y);
64
+ }
65
+ }
@@ -0,0 +1,70 @@
1
+ package kore;
2
+
3
+ import java.util.Optional;
4
+
5
+ public class Shipyard {
6
+ public final String id;
7
+ public int shipCount;
8
+ public Point position;
9
+ public int playerId;
10
+ public int turnsControlled;
11
+ public final Board board;
12
+ public Optional<ShipyardAction> nextAction;
13
+ private final int[] SPAWN_VALUES;
14
+
15
+ public Shipyard(String shipyardId, int shipCount, Point position, int playerId, int turnsControlled, Board board, Optional<ShipyardAction> nextAction) {
16
+ this.id = shipyardId;
17
+ this.shipCount = shipCount;
18
+ this.position = position;
19
+ this.playerId = playerId;
20
+ this.turnsControlled = turnsControlled;
21
+ this.board = board;
22
+ this.nextAction = nextAction;
23
+
24
+ int[] upgradeTimes = new int[9];
25
+ for(int i = 1; i < 10; i++) {
26
+ upgradeTimes[i-1] = (int) Math.pow(i, 2) + 1;
27
+ }
28
+ SPAWN_VALUES = new int[9];
29
+ int current = 0;
30
+ for(int i = 1; i < 10; i++) {
31
+ current += upgradeTimes[i-1];
32
+ SPAWN_VALUES[i-1] = current;
33
+ }
34
+ }
35
+
36
+ public Shipyard cloneToBoard(Board board) {
37
+ return new Shipyard(this.id, this.shipCount, this.position, this.playerId, this.turnsControlled, board, this.nextAction);
38
+ }
39
+
40
+ public void setNextAction(ShipyardAction action) {
41
+ this.nextAction = Optional.of(action);
42
+ }
43
+
44
+ public int maxSpawn() {
45
+ for (int i = 0; i < this.SPAWN_VALUES.length; i++) {
46
+ if (this.turnsControlled < this.SPAWN_VALUES[i]) {
47
+ return i + 1;
48
+ }
49
+ }
50
+ return this.SPAWN_VALUES.length + 1;
51
+ }
52
+
53
+ /**
54
+ * Returns the cell this shipyard is on.
55
+ */
56
+ public Cell cell() {
57
+ return this.board.getCellAtPosition(this.position);
58
+ }
59
+
60
+ public Player player() {
61
+ return this.board.players[this.playerId];
62
+ }
63
+
64
+ /**
65
+ * Converts a shipyard back to the normalized observation subset that constructed it.
66
+ */
67
+ public int[] observation() {
68
+ return new int[]{this.position.toIndex(this.board.configuration.size), this.shipCount, this.turnsControlled};
69
+ }
70
+ }
@@ -0,0 +1,59 @@
1
+ package kore;
2
+
3
+ public class ShipyardAction {
4
+ public static final String SPAWN = "SPAWN";
5
+ public static final String LAUNCH = "LAUNCH";
6
+ public final String actionType;
7
+ public final int shipCount;
8
+ public final String flightPlan;
9
+
10
+ public static ShipyardAction spawnShips(int shipCount) {
11
+ return new ShipyardAction(SPAWN, shipCount, "");
12
+ }
13
+
14
+ public static ShipyardAction launchFleetWithFlightPlan(int shipCount, String flightPlan) {
15
+ return new ShipyardAction(LAUNCH, shipCount, flightPlan);
16
+ }
17
+
18
+ public static ShipyardAction fromString(String raw) {
19
+ if (raw.length() == 0) {
20
+ throw new IllegalStateException("invalid raw shipyard empty string");
21
+ }
22
+ int shipCount = Integer.parseInt(raw.split("_")[1]);
23
+ if (raw.startsWith(LAUNCH)) {
24
+ return ShipyardAction.spawnShips(shipCount);
25
+ }
26
+ if (raw.startsWith(SPAWN)) {
27
+ String flightPlan = raw.split("_")[2];
28
+ return ShipyardAction.launchFleetWithFlightPlan(shipCount, flightPlan);
29
+ }
30
+ throw new IllegalStateException("invalid Shipyard Action raw " + raw);
31
+ }
32
+
33
+ public ShipyardAction(String type, int shipCount, String flightPlan) {
34
+ assert type.equals(SPAWN) || type.equals(LAUNCH) : "Type must be SPAWN or LAUNCH";
35
+ assert shipCount >= 0 : "numShips must be a non-negative number";
36
+ this.actionType = type;
37
+ this.shipCount = shipCount;
38
+ this.flightPlan = flightPlan;
39
+ }
40
+
41
+ private boolean isSpawn() {
42
+ return this.actionType.equals(SPAWN);
43
+ }
44
+
45
+ private boolean isLaunch() {
46
+ return this.actionType.equals(LAUNCH);
47
+ }
48
+
49
+ public String toString() {
50
+ if (this.isSpawn()) {
51
+ return String.format("%s_%d", SPAWN, this.shipCount);
52
+ }
53
+ if (this.isLaunch()) {
54
+ return String.format("%s_%d_%s", LAUNCH, this.shipCount, this.flightPlan);
55
+ }
56
+ throw new IllegalStateException("invalid Shpyard Action");
57
+ }
58
+
59
+ }