ankanmbz commited on
Commit
d6a830d
·
verified ·
1 Parent(s): 8ae0918

Upload 5 files

Browse files
Files changed (5) hide show
  1. README.md +50 -3
  2. special_tokens_map.json +6 -0
  3. tokenizer.py +110 -0
  4. tokenizer_config.json +20 -0
  5. vocab.json +846 -0
README.md CHANGED
@@ -1,3 +1,50 @@
1
- ---
2
- license: mit
3
- ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Chess Tokenizer
2
+
3
+ This chess tokenizer uses a large vocabulary (~900+ tokens) with semantically meaningful units like 'w.', 'b.', piece+square combinations ('♙e4', '♞f6'), and complete suffixes ('..', '.x.', '.+'). This design reduces sequence length by ~60% compared to character-level tokenization, enabling faster training, better gradient flow in recurrent models, and more efficient learning of chess move patterns by treating logical units as single tokens rather than splitting them into meaningless characters.
4
+
5
+ ## Vocabulary Size
6
+ - Total tokens: 844
7
+ - Special tokens: 4
8
+
9
+ ## Usage
10
+
11
+ ### Load the tokenizer
12
+ ```python
13
+ from tokenizer import ChessTokenizer
14
+
15
+ tokenizer = ChessTokenizer("./chess_tokenizer")
16
+ ```
17
+
18
+ ### Encode text
19
+ ```python
20
+ text = "w.♙e2♙e4.."
21
+ ids = tokenizer.encode(text)
22
+ print(ids)
23
+ ```
24
+
25
+ ### Decode IDs
26
+ ```python
27
+ decoded = tokenizer.decode(ids)
28
+ print(decoded)
29
+ ```
30
+
31
+ ### Batch processing
32
+ ```python
33
+ texts = ["w.♙e2♙e4..", "b.♟c7♟c5.."]
34
+ batch_ids = tokenizer.batch_encode(texts, max_length=128, padding=True)
35
+ ```
36
+
37
+ ## Special Tokens
38
+ {
39
+ "<pad>": 0,
40
+ "<sos>": 1,
41
+ "<eos>": 2,
42
+ "<unk>": 3
43
+ }
44
+
45
+ ## Files
46
+ - `vocab.json`: Token to ID mapping
47
+ - `tokenizer_config.json`: Configuration
48
+ - `special_tokens_map.json`: Special token definitions
49
+ - `tokenizer.py`: Tokenizer implementation
50
+ - `README.md`: This file
special_tokens_map.json ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ {
2
+ "pad_token": "<pad>",
3
+ "sos_token": "<sos>",
4
+ "eos_token": "<eos>",
5
+ "unk_token": "<unk>"
6
+ }
tokenizer.py ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import re
3
+ from pathlib import Path
4
+
5
+ class ChessTokenizer:
6
+ """Chess move tokenizer for neural networks"""
7
+
8
+ def __init__(self, tokenizer_dir):
9
+ self.tokenizer_dir = Path(tokenizer_dir)
10
+
11
+ # Load vocab
12
+ with open(self.tokenizer_dir / "vocab.json", 'r', encoding='utf-8') as f:
13
+ self.token_to_id = json.load(f)
14
+
15
+ self.id_to_token = {v: k for k, v in self.token_to_id.items()}
16
+
17
+ # Load config
18
+ with open(self.tokenizer_dir / "tokenizer_config.json", 'r') as f:
19
+ self.config = json.load(f)
20
+
21
+ self.pattern = self.config['pattern']
22
+ self.special_tokens = self.config['special_tokens']
23
+ self.pad_token_id = self.special_tokens['<pad>']
24
+ self.sos_token_id = self.special_tokens['<sos>']
25
+ self.eos_token_id = self.special_tokens['<eos>']
26
+ self.unk_token_id = self.special_tokens['<unk>']
27
+ self.vocab_size = len(self.token_to_id)
28
+
29
+ def tokenize(self, text):
30
+ """Tokenize a chess move string into tokens"""
31
+ tokens = re.findall(self.pattern, text)
32
+ return tokens
33
+
34
+ def encode(self, text, add_special_tokens=True, max_length=None, padding=False):
35
+ """Convert text to token IDs"""
36
+ tokens = self.tokenize(text)
37
+
38
+ # Convert to IDs
39
+ ids = [self.token_to_id.get(token, self.unk_token_id) for token in tokens]
40
+
41
+ # Add special tokens
42
+ if add_special_tokens:
43
+ ids = [self.sos_token_id] + ids + [self.eos_token_id]
44
+
45
+ # Truncate if needed
46
+ if max_length and len(ids) > max_length:
47
+ ids = ids[:max_length]
48
+
49
+ # Pad if needed
50
+ if padding and max_length and len(ids) < max_length:
51
+ ids = ids + [self.pad_token_id] * (max_length - len(ids))
52
+
53
+ return ids
54
+
55
+ def decode(self, ids, skip_special_tokens=True):
56
+ """Convert token IDs back to text"""
57
+ tokens = []
58
+ for id in ids:
59
+ token = self.id_to_token.get(id, '<unk>')
60
+ if skip_special_tokens and token in self.special_tokens:
61
+ continue
62
+ tokens.append(token)
63
+ return ''.join(tokens)
64
+
65
+ def batch_encode(self, texts, add_special_tokens=True, max_length=None, padding=False):
66
+ """Encode multiple texts"""
67
+ return [self.encode(text, add_special_tokens, max_length, padding) for text in texts]
68
+
69
+ def batch_decode(self, batch_ids, skip_special_tokens=True):
70
+ """Decode multiple sequences"""
71
+ return [self.decode(ids, skip_special_tokens) for ids in batch_ids]
72
+
73
+ def __len__(self):
74
+ return self.vocab_size
75
+
76
+ def save_pretrained(self, save_directory):
77
+ """Save tokenizer to directory"""
78
+ save_dir = Path(save_directory)
79
+ save_dir.mkdir(exist_ok=True, parents=True)
80
+
81
+ # Copy all files
82
+ import shutil
83
+ for file in self.tokenizer_dir.glob("*.json"):
84
+ shutil.copy(file, save_dir / file.name)
85
+ shutil.copy(self.tokenizer_dir / "tokenizer.py", save_dir / "tokenizer.py")
86
+ print(f"Tokenizer saved to {save_directory}")
87
+
88
+ @classmethod
89
+ def from_pretrained(cls, tokenizer_dir):
90
+ """Load tokenizer from directory"""
91
+ return cls(tokenizer_dir)
92
+
93
+
94
+ # Example usage
95
+ if __name__ == "__main__":
96
+ # Load tokenizer
97
+ tokenizer = ChessTokenizer("./")
98
+
99
+ # Test tokenization
100
+ test_move = "w.♙e2♙e4.."
101
+ print(f"Input: {test_move}")
102
+
103
+ tokens = tokenizer.tokenize(test_move)
104
+ print(f"Tokens: {tokens}")
105
+
106
+ ids = tokenizer.encode(test_move)
107
+ print(f"Token IDs: {ids}")
108
+
109
+ decoded = tokenizer.decode(ids)
110
+ print(f"Decoded: {decoded}")
tokenizer_config.json ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "tokenizer_type": "chess_custom",
3
+ "vocab_size": 844,
4
+ "model_max_length": 512,
5
+ "pattern": "w\\.|b\\.|[\u2654\u2655\u2656\u2657\u2658\u2659\u265a\u265b\u265c\u265d\u265e\u265f][a-h][1-8]|[a-h][1-8]|\\.\\.[+#x\\.]*|\\.x\\.[+#]*|\\.\\.x\\.[+#]*|\\+#|\\+|x|\\.",
6
+ "special_tokens": {
7
+ "<pad>": 0,
8
+ "<sos>": 1,
9
+ "<eos>": 2,
10
+ "<unk>": 3
11
+ },
12
+ "pad_token": "<pad>",
13
+ "sos_token": "<sos>",
14
+ "eos_token": "<eos>",
15
+ "unk_token": "<unk>",
16
+ "training_config": {
17
+ "dataset_column": "moves_custom",
18
+ "separator": " "
19
+ }
20
+ }
vocab.json ADDED
@@ -0,0 +1,846 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "<pad>": 0,
3
+ "<sos>": 1,
4
+ "<eos>": 2,
5
+ "<unk>": 3,
6
+ " ": 4,
7
+ "!": 5,
8
+ "\"": 6,
9
+ "#": 7,
10
+ "$": 8,
11
+ "%": 9,
12
+ "&": 10,
13
+ "'": 11,
14
+ "(": 12,
15
+ ")": 13,
16
+ "*": 14,
17
+ "+": 15,
18
+ ",": 16,
19
+ "-": 17,
20
+ ".": 18,
21
+ "/": 19,
22
+ "0": 20,
23
+ "1": 21,
24
+ "2": 22,
25
+ "3": 23,
26
+ "4": 24,
27
+ "5": 25,
28
+ "6": 26,
29
+ "7": 27,
30
+ "8": 28,
31
+ "9": 29,
32
+ ":": 30,
33
+ ";": 31,
34
+ "<": 32,
35
+ "=": 33,
36
+ ">": 34,
37
+ "?": 35,
38
+ "@": 36,
39
+ "A": 37,
40
+ "B": 38,
41
+ "C": 39,
42
+ "D": 40,
43
+ "E": 41,
44
+ "F": 42,
45
+ "G": 43,
46
+ "H": 44,
47
+ "I": 45,
48
+ "J": 46,
49
+ "K": 47,
50
+ "L": 48,
51
+ "M": 49,
52
+ "N": 50,
53
+ "O": 51,
54
+ "P": 52,
55
+ "Q": 53,
56
+ "R": 54,
57
+ "S": 55,
58
+ "T": 56,
59
+ "U": 57,
60
+ "V": 58,
61
+ "W": 59,
62
+ "X": 60,
63
+ "Y": 61,
64
+ "Z": 62,
65
+ "[": 63,
66
+ "\\": 64,
67
+ "]": 65,
68
+ "^": 66,
69
+ "_": 67,
70
+ "`": 68,
71
+ "a": 69,
72
+ "b": 70,
73
+ "c": 71,
74
+ "d": 72,
75
+ "e": 73,
76
+ "f": 74,
77
+ "g": 75,
78
+ "h": 76,
79
+ "i": 77,
80
+ "j": 78,
81
+ "k": 79,
82
+ "l": 80,
83
+ "m": 81,
84
+ "n": 82,
85
+ "o": 83,
86
+ "p": 84,
87
+ "q": 85,
88
+ "r": 86,
89
+ "s": 87,
90
+ "t": 88,
91
+ "u": 89,
92
+ "v": 90,
93
+ "w": 91,
94
+ "x": 92,
95
+ "y": 93,
96
+ "z": 94,
97
+ "{": 95,
98
+ "|": 96,
99
+ "}": 97,
100
+ "~": 98,
101
+ "..": 99,
102
+ "w.": 100,
103
+ "b.": 101,
104
+ ".x.": 102,
105
+ "..+": 103,
106
+ "♞f6": 104,
107
+ "♘f3": 105,
108
+ "♜f8": 106,
109
+ "♖f1": 107,
110
+ "♚g8": 108,
111
+ "♔g1": 109,
112
+ "♘c3": 110,
113
+ "♙d4": 111,
114
+ "♙e4": 112,
115
+ ".x.+": 113,
116
+ "♖d1": 114,
117
+ "♞c6": 115,
118
+ "♟d5": 116,
119
+ "♟c5": 117,
120
+ "♝f8": 118,
121
+ "♞d7": 119,
122
+ "♗f1": 120,
123
+ "♛d8": 121,
124
+ "♚e8": 122,
125
+ "♔e1": 123,
126
+ "♖a1": 124,
127
+ "♕d1": 125,
128
+ "♜a8": 126,
129
+ "♝c8": 127,
130
+ "♗c1": 128,
131
+ "♖h1": 129,
132
+ "♜h8": 130,
133
+ "♜d8": 131,
134
+ "♞b8": 132,
135
+ "♖e1": 133,
136
+ "♙c4": 134,
137
+ "♞g8": 135,
138
+ "♘b1": 136,
139
+ "♟e6": 137,
140
+ "♘g1": 138,
141
+ "♙d2": 139,
142
+ "♟d7": 140,
143
+ "♟e5": 141,
144
+ "♙e2": 142,
145
+ "♜e8": 143,
146
+ "♟e7": 144,
147
+ "♜c8": 145,
148
+ "♟c7": 146,
149
+ "♙c2": 147,
150
+ "♝e7": 148,
151
+ "♟g6": 149,
152
+ "♖c1": 150,
153
+ "♗e3": 151,
154
+ "♘d2": 152,
155
+ "♟d6": 153,
156
+ "♗d3": 154,
157
+ "♙f4": 155,
158
+ "♟b5": 156,
159
+ "♟c6": 157,
160
+ "♘d4": 158,
161
+ "♟g7": 159,
162
+ "♟b7": 160,
163
+ "♙d5": 161,
164
+ "♟a7": 162,
165
+ "♚g7": 163,
166
+ "♙g3": 164,
167
+ "♙h2": 165,
168
+ "♙g2": 166,
169
+ "♙f2": 167,
170
+ "♟f5": 168,
171
+ "♙c3": 169,
172
+ "♝g7": 170,
173
+ "♙b2": 171,
174
+ "♟h7": 172,
175
+ "♙a2": 173,
176
+ "♟a6": 174,
177
+ "♙e5": 175,
178
+ "♗e2": 176,
179
+ "♗g5": 177,
180
+ "♟d4": 178,
181
+ "♛c7": 179,
182
+ "♟f7": 180,
183
+ "♙g4": 181,
184
+ "♔g2": 182,
185
+ "♙h4": 183,
186
+ "♙a4": 184,
187
+ "♕d2": 185,
188
+ "♙b4": 186,
189
+ "♞d5": 187,
190
+ "♙h3": 188,
191
+ "♟h6": 189,
192
+ "♟a5": 190,
193
+ "♕e2": 191,
194
+ "♝d7": 192,
195
+ "♜b8": 193,
196
+ "♚f7": 194,
197
+ "♗f4": 195,
198
+ "♗c4": 196,
199
+ "♝e6": 197,
200
+ "♔f2": 198,
201
+ "♙b3": 199,
202
+ "♘e4": 200,
203
+ "♞e5": 201,
204
+ "♟h5": 202,
205
+ "♘e5": 203,
206
+ "♘e2": 204,
207
+ "♟g5": 205,
208
+ "♕c2": 206,
209
+ "♙f3": 207,
210
+ "♛e7": 208,
211
+ "♟b6": 209,
212
+ "♙e3": 210,
213
+ "♗g2": 211,
214
+ "♞e4": 212,
215
+ "♟f6": 213,
216
+ "♖b1": 214,
217
+ "♚e7": 215,
218
+ "♝b7": 216,
219
+ "♙a3": 217,
220
+ "♞e7": 218,
221
+ "♚f8": 219,
222
+ "♝d6": 220,
223
+ "♝f5": 221,
224
+ "♗d2": 222,
225
+ "♛b6": 223,
226
+ "♚f6": 224,
227
+ "♔e2": 225,
228
+ "♛d7": 226,
229
+ "♗b5": 227,
230
+ "♝g4": 228,
231
+ "♔f3": 229,
232
+ "♝c5": 230,
233
+ "♕d3": 231,
234
+ "♟e4": 232,
235
+ "♘d5": 233,
236
+ "♝b4": 234,
237
+ "♔e3": 235,
238
+ "♔f1": 236,
239
+ "♕f3": 237,
240
+ "♞c5": 238,
241
+ "♝f6": 239,
242
+ "♚h7": 240,
243
+ "♔h2": 241,
244
+ "♙c5": 242,
245
+ "♟c4": 243,
246
+ "♚e6": 244,
247
+ "♙f5": 245,
248
+ "♟b4": 246,
249
+ "♞d4": 247,
250
+ "♚h8": 248,
251
+ "♛f6": 249,
252
+ "♕b3": 250,
253
+ "♔g3": 251,
254
+ "♚g6": 252,
255
+ "♚d7": 253,
256
+ "♛a5": 254,
257
+ "♔c1": 255,
258
+ "♙b5": 256,
259
+ "♙d3": 257,
260
+ "♔h1": 258,
261
+ "♘c4": 259,
262
+ "♛d6": 260,
263
+ "♞b6": 261,
264
+ "♖d2": 262,
265
+ "♗f3": 263,
266
+ "♕e3": 264,
267
+ "♔d3": 265,
268
+ "♗b2": 266,
269
+ "♔d2": 267,
270
+ "♕d4": 268,
271
+ "♙g5": 269,
272
+ "♚d6": 270,
273
+ "♟f4": 271,
274
+ "♙h5": 272,
275
+ "♗d4": 273,
276
+ "♛d5": 274,
277
+ "♝c6": 275,
278
+ "♗e4": 276,
279
+ "♘g5": 277,
280
+ "♘b5": 278,
281
+ "♜d7": 279,
282
+ "♘b3": 280,
283
+ "♖e2": 281,
284
+ "♘e3": 282,
285
+ "♝e5": 283,
286
+ "♟a4": 284,
287
+ "♝d5": 285,
288
+ "♙a5": 286,
289
+ "♜g8": 287,
290
+ "♕e4": 288,
291
+ "♗b3": 289,
292
+ "♜e7": 290,
293
+ "♞c4": 291,
294
+ "♘g3": 292,
295
+ "♞g4": 293,
296
+ "♞f5": 294,
297
+ "♟g4": 295,
298
+ "♖a7": 296,
299
+ "♜c7": 297,
300
+ "♞e6": 298,
301
+ "♘f4": 299,
302
+ "♖g1": 300,
303
+ "♜a2": 301,
304
+ "♖e3": 302,
305
+ "♖d3": 303,
306
+ "♖b7": 304,
307
+ "♜b2": 305,
308
+ "♖c7": 306,
309
+ "♝d4": 307,
310
+ "♚e5": 308,
311
+ "♚c8": 309,
312
+ "♛e5": 310,
313
+ "♗d5": 311,
314
+ "♔e4": 312,
315
+ "♔f4": 313,
316
+ "♜c2": 314,
317
+ "♞b4": 315,
318
+ "♟h4": 316,
319
+ "♖d7": 317,
320
+ "♕c3": 318,
321
+ "♚f5": 319,
322
+ "♘d3": 320,
323
+ "♘c5": 321,
324
+ "♖c2": 322,
325
+ "♘f5": 323,
326
+ "♕g4": 324,
327
+ "♞g6": 325,
328
+ "♛c5": 326,
329
+ "♞f4": 327,
330
+ "♛c6": 328,
331
+ "♗e5": 329,
332
+ "♜f7": 330,
333
+ "♞h5": 331,
334
+ "♗c3": 332,
335
+ "♛e6": 333,
336
+ "♝e4": 334,
337
+ "♚c7": 335,
338
+ "♖d4": 336,
339
+ "♖d6": 337,
340
+ "♕f4": 338,
341
+ "♗c2": 339,
342
+ "♞d6": 340,
343
+ "♔c2": 341,
344
+ "♖f3": 342,
345
+ "♕c4": 343,
346
+ "♜d2": 344,
347
+ "♘c6": 345,
348
+ "♘d6": 346,
349
+ "♖d5": 347,
350
+ "♖f2": 348,
351
+ "♜c4": 349,
352
+ "♕g3": 350,
353
+ "♝a6": 351,
354
+ "♗g3": 352,
355
+ "♔d4": 353,
356
+ "♞a5": 354,
357
+ "♚c6": 355,
358
+ "♛d4": 356,
359
+ "♜e6": 357,
360
+ "♔c3": 358,
361
+ "♗f6": 359,
362
+ "♕a4": 360,
363
+ "♝c3": 361,
364
+ "♖a6": 362,
365
+ "♖d8": 363,
366
+ "♚d5": 364,
367
+ "♕d5": 365,
368
+ "♜a3": 366,
369
+ "♜d5": 367,
370
+ "♜d6": 368,
371
+ "♜c3": 369,
372
+ "♖e4": 370,
373
+ "♛g5": 371,
374
+ "♖e5": 372,
375
+ "♕h5": 373,
376
+ "♖c6": 374,
377
+ "♜d4": 375,
378
+ "♔b1": 376,
379
+ "♖e7": 377,
380
+ "♗h4": 378,
381
+ "♖c3": 379,
382
+ "♜f6": 380,
383
+ "♕f2": 381,
384
+ "♞a6": 382,
385
+ "♔g4": 383,
386
+ "♞d3": 384,
387
+ "♜d1": 385,
388
+ "♚d8": 386,
389
+ "♚g5": 387,
390
+ "♗c6": 388,
391
+ "♞c3": 389,
392
+ "♚h6": 390,
393
+ "♛f5": 391,
394
+ "♘a4": 392,
395
+ "♖c5": 393,
396
+ "♗c5": 394,
397
+ "♞e8": 395,
398
+ "♛c8": 396,
399
+ "♜e5": 397,
400
+ "♜c6": 398,
401
+ "♝g6": 399,
402
+ "♜c5": 400,
403
+ "♖b6": 401,
404
+ "♔h3": 402,
405
+ "♛e8": 403,
406
+ "♜b3": 404,
407
+ "♜a1": 405,
408
+ "♕e5": 406,
409
+ "♜e4": 407,
410
+ "♙d6": 408,
411
+ "♙f6": 409,
412
+ "♝f3": 410,
413
+ "♜a4": 411,
414
+ "♜b4": 412,
415
+ "♜e2": 413,
416
+ "♜c1": 414,
417
+ "♛h4": 415,
418
+ "♖c8": 416,
419
+ "♛e4": 417,
420
+ "♖a5": 418,
421
+ "♞f8": 419,
422
+ "♜d3": 420,
423
+ "♛b7": 421,
424
+ "♘h4": 422,
425
+ "♖c4": 423,
426
+ "♙e6": 424,
427
+ "♝c4": 425,
428
+ "♖f7": 426,
429
+ "♝g5": 427,
430
+ "♜a7": 428,
431
+ "♖e6": 429,
432
+ "♕e1": 430,
433
+ "♞c7": 431,
434
+ "♖a8": 432,
435
+ "♘e6": 433,
436
+ "♗h6": 434,
437
+ "♜b7": 435,
438
+ "♛f7": 436,
439
+ "♘f6": 437,
440
+ "♗d6": 438,
441
+ "♘f1": 439,
442
+ "♜e1": 440,
443
+ "♖e8": 441,
444
+ "♖f4": 442,
445
+ "♖b5": 443,
446
+ "♜f5": 444,
447
+ "♕g5": 445,
448
+ "♛b4": 446,
449
+ "♝b6": 447,
450
+ "♕h4": 448,
451
+ "♛g6": 449,
452
+ "♝b5": 450,
453
+ "♔c4": 451,
454
+ "♚c5": 452,
455
+ "♜f2": 453,
456
+ "♛f4": 454,
457
+ "♗f2": 455,
458
+ "♝d3": 456,
459
+ "♙g6": 457,
460
+ "♟c3": 458,
461
+ "♜b6": 459,
462
+ "♜b1": 460,
463
+ "♗f5": 461,
464
+ "♖b3": 462,
465
+ "♙c6": 463,
466
+ "♕f5": 464,
467
+ "♔d1": 465,
468
+ "♖a4": 466,
469
+ "♕c1": 467,
470
+ "♜f4": 468,
471
+ "♜a5": 469,
472
+ "♞e3": 470,
473
+ "♗a4": 471,
474
+ "♖a3": 472,
475
+ "♜a6": 473,
476
+ "♝h6": 474,
477
+ "♛b2": 475,
478
+ "♖g3": 476,
479
+ "♚f4": 477,
480
+ "♚e4": 478,
481
+ "♖b2": 479,
482
+ "♛c4": 480,
483
+ "♕d6": 481,
484
+ "♘c2": 482,
485
+ "♖h7": 483,
486
+ "♖a2": 484,
487
+ "♖b8": 485,
488
+ "♘a3": 486,
489
+ "♜e3": 487,
490
+ "♔e5": 488,
491
+ "♔f5": 489,
492
+ "♝d8": 490,
493
+ "♖g7": 491,
494
+ "♖b4": 492,
495
+ "♖f5": 493,
496
+ "♖f6": 494,
497
+ "♘e1": 495,
498
+ "♟b3": 496,
499
+ "♜b5": 497,
500
+ "♔b2": 498,
501
+ "♜g2": 499,
502
+ "♝f4": 500,
503
+ "♕c5": 501,
504
+ "♗a3": 502,
505
+ "♙b6": 503,
506
+ "♝h5": 504,
507
+ "♚d4": 505,
508
+ "♕e6": 506,
509
+ "♘g4": 507,
510
+ "♝c7": 508,
511
+ "♛h5": 509,
512
+ "♜h2": 510,
513
+ "♗e6": 511,
514
+ "♗g4": 512,
515
+ "♕b2": 513,
516
+ "♛c3": 514,
517
+ "♕b7": 515,
518
+ "♚b8": 516,
519
+ "♚b7": 517,
520
+ "♜f3": 518,
521
+ "♝e8": 519,
522
+ "♕b4": 520,
523
+ "♛b5": 521,
524
+ "♛g4": 522,
525
+ "♕h6": 523,
526
+ "♔g5": 524,
527
+ "♕f6": 525,
528
+ "♕b5": 526,
529
+ "♚b6": 527,
530
+ "♕d8": 528,
531
+ "♔d5": 529,
532
+ "♙a6": 530,
533
+ "♗b4": 531,
534
+ "♛b8": 532,
535
+ "♔b3": 533,
536
+ "♞f3": 534,
537
+ "♟f3": 535,
538
+ "♕c6": 536,
539
+ "♝e3": 537,
540
+ "♗h3": 538,
541
+ "♚g4": 539,
542
+ "♜g6": 540,
543
+ "♟a3": 541,
544
+ "♖h3": 542,
545
+ "♟d3": 543,
546
+ "♖f8": 544,
547
+ "♙h6": 545,
548
+ "♜f1": 546,
549
+ "♗d1": 547,
550
+ "♖h6": 548,
551
+ "♟e3": 549,
552
+ "♛e3": 550,
553
+ "♖g6": 551,
554
+ "♗e7": 552,
555
+ "♞g5": 553,
556
+ "♔c5": 554,
557
+ "♖g5": 555,
558
+ "♟g3": 556,
559
+ "♕c7": 557,
560
+ "♛d1": 558,
561
+ "♛c2": 559,
562
+ "♖h5": 560,
563
+ "♜g4": 561,
564
+ "♚c4": 562,
565
+ "♜g7": 563,
566
+ "♖h8": 564,
567
+ "♜h4": 565,
568
+ "♜h3": 566,
569
+ "♕e7": 567,
570
+ "♜g3": 568,
571
+ "♖g4": 569,
572
+ "♛d2": 570,
573
+ "♛d3": 571,
574
+ "♝b2": 572,
575
+ "♜h1": 573,
576
+ "♗b6": 574,
577
+ "♝f7": 575,
578
+ "♛f3": 576,
579
+ "♞h6": 577,
580
+ "♖h4": 578,
581
+ "♘d1": 579,
582
+ "♕g6": 580,
583
+ "♕d7": 581,
584
+ "♕h3": 582,
585
+ "♝h3": 583,
586
+ "♘b6": 584,
587
+ "♔h4": 585,
588
+ "♜g5": 586,
589
+ "♛a4": 587,
590
+ "♗g7": 588,
591
+ "♗b7": 589,
592
+ "♜g1": 590,
593
+ "♗e1": 591,
594
+ "♛a6": 592,
595
+ "♖g2": 593,
596
+ "♕f7": 594,
597
+ "♔b4": 595,
598
+ "♘d7": 596,
599
+ "♖g8": 597,
600
+ "♚h5": 598,
601
+ "♛a2": 599,
602
+ "♗a6": 600,
603
+ "♞f7": 601,
604
+ "♘f2": 602,
605
+ "♜h5": 603,
606
+ "♛e2": 604,
607
+ "♕b6": 605,
608
+ "♞b3": 606,
609
+ "♚b5": 607,
610
+ "♟h3": 608,
611
+ "♘e7": 609,
612
+ "♛f8": 610,
613
+ "♘b4": 611,
614
+ "♕a7": 612,
615
+ "♛a3": 613,
616
+ "♛f2": 614,
617
+ "♕c8": 615,
618
+ "♛e1": 616,
619
+ "♞b5": 617,
620
+ "♕e8": 618,
621
+ "♜h6": 619,
622
+ "♛c1": 620,
623
+ "♛g7": 621,
624
+ "♘a5": 622,
625
+ "♗d7": 623,
626
+ "♛b3": 624,
627
+ "♔f6": 625,
628
+ "♕a5": 626,
629
+ "♘c7": 627,
630
+ "♕a3": 628,
631
+ "♝e2": 629,
632
+ "♘h3": 630,
633
+ "♞a4": 631,
634
+ "..+#": 632,
635
+ "♞d8": 633,
636
+ "♕a6": 634,
637
+ "♕b1": 635,
638
+ "♗g6": 636,
639
+ "♞d2": 637,
640
+ "♛a1": 638,
641
+ "♛h3": 639,
642
+ "♚f3": 640,
643
+ "♝g2": 641,
644
+ "♗b1": 642,
645
+ "♝h4": 643,
646
+ "♘g6": 644,
647
+ "♝b3": 645,
648
+ "♛g3": 646,
649
+ "♘f7": 647,
650
+ "♔b5": 648,
651
+ "♝d2": 649,
652
+ "♕g2": 650,
653
+ "♝a4": 651,
654
+ "♚e3": 652,
655
+ "♕a8": 653,
656
+ "♔e6": 654,
657
+ "♕b8": 655,
658
+ "♚b4": 656,
659
+ "♘h5": 657,
660
+ "♗c7": 658,
661
+ "♔d6": 659,
662
+ "♛b1": 660,
663
+ "♝c2": 661,
664
+ "♞g3": 662,
665
+ "♚d3": 663,
666
+ "♔g6": 664,
667
+ "♗f7": 665,
668
+ "♘c1": 666,
669
+ "♞c8": 667,
670
+ "♞e2": 668,
671
+ "♘h2": 669,
672
+ "♛h6": 670,
673
+ "♞h7": 671,
674
+ "♝a3": 672,
675
+ "♝a5": 673,
676
+ "♚g3": 674,
677
+ "♛a7": 675,
678
+ "♔c6": 676,
679
+ "♞g7": 677,
680
+ "♜h7": 678,
681
+ "♖h2": 679,
682
+ "♕f1": 680,
683
+ "♚c3": 681,
684
+ "♕h8": 682,
685
+ "♗h5": 683,
686
+ "♕h7": 684,
687
+ "♞c2": 685,
688
+ "♗a5": 686,
689
+ "♝f2": 687,
690
+ "♞h4": 688,
691
+ "♛a8": 689,
692
+ "♕g7": 690,
693
+ "♝g3": 691,
694
+ "♔h5": 692,
695
+ "♕f8": 693,
696
+ "♞f2": 694,
697
+ "♚h4": 695,
698
+ "♔a2": 696,
699
+ "♔b6": 697,
700
+ "♛f1": 698,
701
+ "♛h1": 699,
702
+ "♚b3": 700,
703
+ "♗a2": 701,
704
+ "♘b7": 702,
705
+ "♚a7": 703,
706
+ "♙a7": 704,
707
+ "♞b2": 705,
708
+ "♕g8": 706,
709
+ "♝a7": 707,
710
+ "♞b7": 708,
711
+ "♛g2": 709,
712
+ "♘g2": 710,
713
+ "♕a2": 711,
714
+ "♙d7": 712,
715
+ "♛h2": 713,
716
+ "♕a1": 714,
717
+ "♙b7": 715,
718
+ "♗h2": 716,
719
+ "♔a1": 717,
720
+ "♝f1": 718,
721
+ "♗f8": 719,
722
+ "♛g1": 720,
723
+ "♗h7": 721,
724
+ "♟b2": 722,
725
+ "♟a2": 723,
726
+ "♙f7": 724,
727
+ "♗a7": 725,
728
+ "♔a3": 726,
729
+ "♝h7": 727,
730
+ "♘b2": 728,
731
+ "♙c7": 729,
732
+ "♚a6": 730,
733
+ "♙h7": 731,
734
+ "♝a2": 732,
735
+ "♘h6": 733,
736
+ "♙g7": 734,
737
+ "♝a8": 735,
738
+ "♝b8": 736,
739
+ "♗d8": 737,
740
+ "♔h6": 738,
741
+ "♔f7": 739,
742
+ "♟c2": 740,
743
+ "♙e7": 741,
744
+ "♝c1": 742,
745
+ "♚f2": 743,
746
+ "♝d1": 744,
747
+ "♚a8": 745,
748
+ "♗c8": 746,
749
+ "♔a4": 747,
750
+ "♔e7": 748,
751
+ "♚a5": 749,
752
+ "♗e8": 750,
753
+ "♔g7": 751,
754
+ "♟d2": 752,
755
+ "♝e1": 753,
756
+ "♚c2": 754,
757
+ "♚h3": 755,
758
+ "♚e2": 756,
759
+ "♔c7": 757,
760
+ "♟f2": 758,
761
+ "♚g2": 759,
762
+ "♞h3": 760,
763
+ "♟h2": 761,
764
+ "♚b2": 762,
765
+ "♔a5": 763,
766
+ "♔d7": 764,
767
+ "♟e2": 765,
768
+ "♚d2": 766,
769
+ "♔b7": 767,
770
+ "♟g2": 768,
771
+ "♚a4": 769,
772
+ "♘a2": 770,
773
+ "♝h2": 771,
774
+ "♘g7": 772,
775
+ "♝b1": 773,
776
+ "♘c8": 774,
777
+ "♞a7": 775,
778
+ "♕h2": 776,
779
+ "♞a3": 777,
780
+ "♘a7": 778,
781
+ "♗a1": 779,
782
+ "♘a6": 780,
783
+ "♗g1": 781,
784
+ "♘e8": 782,
785
+ "♚a3": 783,
786
+ "♞a2": 784,
787
+ "♔a6": 785,
788
+ "♗b8": 786,
789
+ "♞g2": 787,
790
+ "♘d8": 788,
791
+ "♘f8": 789,
792
+ "♛h7": 790,
793
+ "♞d1": 791,
794
+ "♝h8": 792,
795
+ "♘h7": 793,
796
+ "♞c1": 794,
797
+ "♔h7": 795,
798
+ "♞e1": 796,
799
+ "♕g1": 797,
800
+ "♛g8": 798,
801
+ "♝a1": 799,
802
+ "♗a8": 800,
803
+ "♞f1": 801,
804
+ "♚h2": 802,
805
+ "♗g8": 803,
806
+ "♝g8": 804,
807
+ "♚a2": 805,
808
+ "♝g1": 806,
809
+ "♔a7": 807,
810
+ ".x.+#": 808,
811
+ "♔g8": 809,
812
+ "♚b1": 810,
813
+ "♛h8": 811,
814
+ "♞h2": 812,
815
+ "♗h1": 813,
816
+ "♕h1": 814,
817
+ "♚g1": 815,
818
+ "♚f1": 816,
819
+ "♔f8": 817,
820
+ "♘a8": 818,
821
+ "♚e1": 819,
822
+ "♔b8": 820,
823
+ "♔e8": 821,
824
+ "♚c1": 822,
825
+ "♚d1": 823,
826
+ "♞a8": 824,
827
+ "♔c8": 825,
828
+ "♔d8": 826,
829
+ "♘b8": 827,
830
+ "♚a1": 828,
831
+ "♔h8": 829,
832
+ "♞a1": 830,
833
+ "♞b1": 831,
834
+ "♘a1": 832,
835
+ "♝h1": 833,
836
+ "♚h1": 834,
837
+ "♘h1": 835,
838
+ "♗h8": 836,
839
+ "♞h8": 837,
840
+ "♔a8": 838,
841
+ "♘g8": 839,
842
+ "♘h8": 840,
843
+ "♞g1": 841,
844
+ "♞h1": 842,
845
+ "+#": 843
846
+ }