In [198]:
import numpy as np
from numpy.lib import stride_tricks
In [199]:
def mask_to_int(mask):
to_remove = '[] '
s = str(mask.ravel())
for c in to_remove:
s = s.replace(c, '')
return eval('0b{}'.format(s))
In [200]:
def gen_int_masks(MASKS, h=6, w=5):
result = {}
for r, row in enumerate(MASKS):
for c, mask in enumerate(row):
all_moves = mask_to_int(mask)
result[1 << 29-(5*r+c)] = [1 << i for i in range(29,-1,-1) if (1 << i & all_moves) and (i != 29-(5*r+c))]
return result
In [201]:
def print_bits(masks):
for anchor, moves in masks.items():
print('Anchor: {:030b}'.format(anchor))
print(' Masks:')
for move in moves:
print(' {:030b}'.format(move))
print('-'*40, end='\n\n')
In [202]:
def raw_heuristic_to_b_w_cpp(w_var_name, b_var_name, s, queen_hueristic=None):
w_result = ''
b_result = ''
white_raw = np.array(s.split())
if queen_hueristic:
white_queen_raw = np.array(queen_hueristic.split())
ppromo = (1 << 30)
w_result += 'static std::unordered_map<unsigned int, int> {} = {{\n'.format(w_var_name)
if 'pawn' in w_var_name:
for i in range(29, -1, -1):
w_result += ' {{{}, {}}},\n'.format(((1 << i) | ppromo), np.flip(white_queen_raw, axis=0)[i])
for i in range(29, -1, -1):
w_result += ' {{{}, {}}},\n'.format((1 << i), np.flip(white_raw, axis=0)[i])
w_result += ' {0, 0},\n'
w_result += '};\n\n'
b_result += 'static std::unordered_map<unsigned int, int> {} = {{\n'.format(b_var_name)
if 'pawn' in w_var_name:
for i in range(29, -1, -1):
b_result += ' {{{}, {}}},\n'.format(((1 << i) | ppromo), white_queen_raw[i])
for i in range(29, -1, -1):
b_result += ' {{{}, {}}},\n'.format((1 << i), white_raw[i])
b_result += ' {0, 0},\n'
b_result += '};\n\n'
return w_result, b_result
In [203]:
BOARD_HEIGHT = 6
BOARD_WIDTH = 5
MASK_HEIGHT = 2 * BOARD_HEIGHT - 1
MASK_WIDTH = 2 * BOARD_WIDTH - 1
print('MASK_HEIGHT: {}\n'
' MASK_WIDTH: {}'.format(MASK_HEIGHT, MASK_WIDTH))
MASK_ANCHOR = (MASK_HEIGHT // 2, MASK_WIDTH // 2)
print(MASK_ANCHOR)
MASK_HEIGHT: 11
MASK_WIDTH: 9
(5, 4)
In [204]:
BASE_MASK = np.zeros((MASK_HEIGHT, MASK_WIDTH), np.int32)
In [205]:
FULL_NS_MASK = BASE_MASK.copy()
FULL_NS_MASK[:, MASK_ANCHOR[1]] += 1
FULL_EW_MASK = BASE_MASK.copy()
FULL_EW_MASK[MASK_ANCHOR[0], :] += 1
FULL_NS_MASK, FULL_EW_MASK
Out[205]:
(array([[0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0]], dtype=int32),
array([[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=int32))
In [206]:
FULL_DIAGS_MASK = (np.eye(min(MASK_HEIGHT, MASK_WIDTH), dtype=np.int) | np.fliplr(np.eye(min(MASK_HEIGHT, MASK_WIDTH), dtype=np.int)))
tb_pad = (MASK_HEIGHT - FULL_DIAGS_MASK.shape[0]) // 2
lr_pad = (MASK_WIDTH - FULL_DIAGS_MASK.shape[1]) // 2
FULL_DIAGS_MASK = np.lib.pad(FULL_DIAGS_MASK, ((tb_pad, tb_pad),(lr_pad, lr_pad)), 'constant')
print(FULL_DIAGS_MASK, FULL_DIAGS_MASK.shape)
[[0 0 0 0 0 0 0 0 0]
[1 0 0 0 0 0 0 0 1]
[0 1 0 0 0 0 0 1 0]
[0 0 1 0 0 0 1 0 0]
[0 0 0 1 0 1 0 0 0]
[0 0 0 0 1 0 0 0 0]
[0 0 0 1 0 1 0 0 0]
[0 0 1 0 0 0 1 0 0]
[0 1 0 0 0 0 0 1 0]
[1 0 0 0 0 0 0 0 1]
[0 0 0 0 0 0 0 0 0]] (11, 9)
In [207]:
ROOK = FULL_NS_MASK | FULL_EW_MASK
print(ROOK, ROOK.shape)
[[0 0 0 0 1 0 0 0 0]
[0 0 0 0 1 0 0 0 0]
[0 0 0 0 1 0 0 0 0]
[0 0 0 0 1 0 0 0 0]
[0 0 0 0 1 0 0 0 0]
[1 1 1 1 1 1 1 1 1]
[0 0 0 0 1 0 0 0 0]
[0 0 0 0 1 0 0 0 0]
[0 0 0 0 1 0 0 0 0]
[0 0 0 0 1 0 0 0 0]
[0 0 0 0 1 0 0 0 0]] (11, 9)
In [208]:
ROOK_MASKS = np.rot90(stride_tricks.as_strided(ROOK, shape=(6, 5, 6, 5), strides=ROOK.strides + ROOK.strides), k=2)
ROOK_MASKS
Out[208]:
array([[[[1, 1, 1, 1, 1],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0]],
[[1, 1, 1, 1, 1],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0]],
[[1, 1, 1, 1, 1],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0]],
[[1, 1, 1, 1, 1],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0]],
[[1, 1, 1, 1, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1]]],
[[[1, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0]],
[[0, 1, 0, 0, 0],
[1, 1, 1, 1, 1],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0]],
[[0, 0, 1, 0, 0],
[1, 1, 1, 1, 1],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0]],
[[0, 0, 0, 1, 0],
[1, 1, 1, 1, 1],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0]],
[[0, 0, 0, 0, 1],
[1, 1, 1, 1, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1]]],
[[[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0]],
[[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[1, 1, 1, 1, 1],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0]],
[[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[1, 1, 1, 1, 1],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0]],
[[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[1, 1, 1, 1, 1],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0]],
[[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[1, 1, 1, 1, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1]]],
[[[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0]],
[[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[1, 1, 1, 1, 1],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0]],
[[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[1, 1, 1, 1, 1],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0]],
[[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[1, 1, 1, 1, 1],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0]],
[[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[1, 1, 1, 1, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1]]],
[[[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[1, 0, 0, 0, 0]],
[[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[1, 1, 1, 1, 1],
[0, 1, 0, 0, 0]],
[[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[1, 1, 1, 1, 1],
[0, 0, 1, 0, 0]],
[[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[1, 1, 1, 1, 1],
[0, 0, 0, 1, 0]],
[[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[1, 1, 1, 1, 1],
[0, 0, 0, 0, 1]]],
[[[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 1, 1, 1, 1]],
[[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[1, 1, 1, 1, 1]],
[[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[1, 1, 1, 1, 1]],
[[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[1, 1, 1, 1, 1]],
[[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[1, 1, 1, 1, 1]]]], dtype=int32)
In [209]:
QUEEN = FULL_DIAGS_MASK | ROOK
print(QUEEN, QUEEN.shape)
[[0 0 0 0 1 0 0 0 0]
[1 0 0 0 1 0 0 0 1]
[0 1 0 0 1 0 0 1 0]
[0 0 1 0 1 0 1 0 0]
[0 0 0 1 1 1 0 0 0]
[1 1 1 1 1 1 1 1 1]
[0 0 0 1 1 1 0 0 0]
[0 0 1 0 1 0 1 0 0]
[0 1 0 0 1 0 0 1 0]
[1 0 0 0 1 0 0 0 1]
[0 0 0 0 1 0 0 0 0]] (11, 9)
In [210]:
QUEEN_MASKS = np.rot90(stride_tricks.as_strided(QUEEN, shape=(6, 5, 6, 5), strides=QUEEN.strides + QUEEN.strides), k=2)
QUEEN_MASKS
Out[210]:
array([[[[1, 1, 1, 1, 1],
[1, 1, 0, 0, 0],
[1, 0, 1, 0, 0],
[1, 0, 0, 1, 0],
[1, 0, 0, 0, 1],
[1, 0, 0, 0, 0]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 0, 0],
[0, 1, 0, 1, 0],
[0, 1, 0, 0, 1],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0]],
[[1, 1, 1, 1, 1],
[0, 1, 1, 1, 0],
[1, 0, 1, 0, 1],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0]],
[[1, 1, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 1, 0, 1, 0],
[1, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0]],
[[1, 1, 1, 1, 1],
[0, 0, 0, 1, 1],
[0, 0, 1, 0, 1],
[0, 1, 0, 0, 1],
[1, 0, 0, 0, 1],
[0, 0, 0, 0, 1]]],
[[[1, 1, 0, 0, 0],
[1, 1, 1, 1, 1],
[1, 1, 0, 0, 0],
[1, 0, 1, 0, 0],
[1, 0, 0, 1, 0],
[1, 0, 0, 0, 1]],
[[1, 1, 1, 0, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 0, 0],
[0, 1, 0, 1, 0],
[0, 1, 0, 0, 1],
[0, 1, 0, 0, 0]],
[[0, 1, 1, 1, 0],
[1, 1, 1, 1, 1],
[0, 1, 1, 1, 0],
[1, 0, 1, 0, 1],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0]],
[[0, 0, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 1, 0, 1, 0],
[1, 0, 0, 1, 0],
[0, 0, 0, 1, 0]],
[[0, 0, 0, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 0, 1, 1],
[0, 0, 1, 0, 1],
[0, 1, 0, 0, 1],
[1, 0, 0, 0, 1]]],
[[[1, 0, 1, 0, 0],
[1, 1, 0, 0, 0],
[1, 1, 1, 1, 1],
[1, 1, 0, 0, 0],
[1, 0, 1, 0, 0],
[1, 0, 0, 1, 0]],
[[0, 1, 0, 1, 0],
[1, 1, 1, 0, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 0, 0],
[0, 1, 0, 1, 0],
[0, 1, 0, 0, 1]],
[[1, 0, 1, 0, 1],
[0, 1, 1, 1, 0],
[1, 1, 1, 1, 1],
[0, 1, 1, 1, 0],
[1, 0, 1, 0, 1],
[0, 0, 1, 0, 0]],
[[0, 1, 0, 1, 0],
[0, 0, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 1, 0, 1, 0],
[1, 0, 0, 1, 0]],
[[0, 0, 1, 0, 1],
[0, 0, 0, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 0, 1, 1],
[0, 0, 1, 0, 1],
[0, 1, 0, 0, 1]]],
[[[1, 0, 0, 1, 0],
[1, 0, 1, 0, 0],
[1, 1, 0, 0, 0],
[1, 1, 1, 1, 1],
[1, 1, 0, 0, 0],
[1, 0, 1, 0, 0]],
[[0, 1, 0, 0, 1],
[0, 1, 0, 1, 0],
[1, 1, 1, 0, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 0, 0],
[0, 1, 0, 1, 0]],
[[0, 0, 1, 0, 0],
[1, 0, 1, 0, 1],
[0, 1, 1, 1, 0],
[1, 1, 1, 1, 1],
[0, 1, 1, 1, 0],
[1, 0, 1, 0, 1]],
[[1, 0, 0, 1, 0],
[0, 1, 0, 1, 0],
[0, 0, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 1, 0, 1, 0]],
[[0, 1, 0, 0, 1],
[0, 0, 1, 0, 1],
[0, 0, 0, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 0, 1, 1],
[0, 0, 1, 0, 1]]],
[[[1, 0, 0, 0, 1],
[1, 0, 0, 1, 0],
[1, 0, 1, 0, 0],
[1, 1, 0, 0, 0],
[1, 1, 1, 1, 1],
[1, 1, 0, 0, 0]],
[[0, 1, 0, 0, 0],
[0, 1, 0, 0, 1],
[0, 1, 0, 1, 0],
[1, 1, 1, 0, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 0, 0]],
[[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[1, 0, 1, 0, 1],
[0, 1, 1, 1, 0],
[1, 1, 1, 1, 1],
[0, 1, 1, 1, 0]],
[[0, 0, 0, 1, 0],
[1, 0, 0, 1, 0],
[0, 1, 0, 1, 0],
[0, 0, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 1, 1, 1]],
[[1, 0, 0, 0, 1],
[0, 1, 0, 0, 1],
[0, 0, 1, 0, 1],
[0, 0, 0, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 0, 1, 1]]],
[[[1, 0, 0, 0, 0],
[1, 0, 0, 0, 1],
[1, 0, 0, 1, 0],
[1, 0, 1, 0, 0],
[1, 1, 0, 0, 0],
[1, 1, 1, 1, 1]],
[[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 1],
[0, 1, 0, 1, 0],
[1, 1, 1, 0, 0],
[1, 1, 1, 1, 1]],
[[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[1, 0, 1, 0, 1],
[0, 1, 1, 1, 0],
[1, 1, 1, 1, 1]],
[[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[1, 0, 0, 1, 0],
[0, 1, 0, 1, 0],
[0, 0, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[0, 0, 0, 0, 1],
[1, 0, 0, 0, 1],
[0, 1, 0, 0, 1],
[0, 0, 1, 0, 1],
[0, 0, 0, 1, 1],
[1, 1, 1, 1, 1]]]])
In [211]:
KING = np.lib.pad(np.ones((3,3), dtype=np.int), (((MASK_HEIGHT-3)//2, (MASK_HEIGHT-3)//2),((MASK_WIDTH-3)//2, (MASK_WIDTH-3)//2)), 'constant')
print(KING, KING.shape)
[[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 1 1 1 0 0 0]
[0 0 0 1 1 1 0 0 0]
[0 0 0 1 1 1 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]] (11, 9)
In [212]:
KING_MASKS = np.rot90(stride_tricks.as_strided(KING, shape=(6, 5, 6, 5), strides=KING.strides + KING.strides), k=2)
KING_MASKS
Out[212]:
array([[[[1, 1, 0, 0, 0],
[1, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[1, 1, 1, 0, 0],
[1, 1, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 1, 1],
[0, 0, 0, 1, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[1, 1, 0, 0, 0],
[1, 1, 0, 0, 0],
[1, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[1, 1, 1, 0, 0],
[1, 1, 1, 0, 0],
[1, 1, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 1, 1],
[0, 0, 0, 1, 1],
[0, 0, 0, 1, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[1, 1, 0, 0, 0],
[1, 1, 0, 0, 0],
[1, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[1, 1, 1, 0, 0],
[1, 1, 1, 0, 0],
[1, 1, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 1, 1],
[0, 0, 0, 1, 1],
[0, 0, 0, 1, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 1, 0, 0, 0],
[1, 1, 0, 0, 0],
[1, 1, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 1, 1, 0, 0],
[1, 1, 1, 0, 0],
[1, 1, 1, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 1],
[0, 0, 0, 1, 1],
[0, 0, 0, 1, 1],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 1, 0, 0, 0],
[1, 1, 0, 0, 0],
[1, 1, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 1, 1, 0, 0],
[1, 1, 1, 0, 0],
[1, 1, 1, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 0, 1, 1, 1]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 1],
[0, 0, 0, 1, 1],
[0, 0, 0, 1, 1]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 1, 0, 0, 0],
[1, 1, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 1, 1, 0, 0],
[1, 1, 1, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 1, 1],
[0, 0, 1, 1, 1]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 1],
[0, 0, 0, 1, 1]]]])
In [213]:
BISHOP = {
'ATTACK': FULL_DIAGS_MASK,
'MOVE' : KING | FULL_DIAGS_MASK
}
print('ATTACK')
print(BISHOP['ATTACK'])
print('MOVE')
print(BISHOP['MOVE'])
ATTACK
[[0 0 0 0 0 0 0 0 0]
[1 0 0 0 0 0 0 0 1]
[0 1 0 0 0 0 0 1 0]
[0 0 1 0 0 0 1 0 0]
[0 0 0 1 0 1 0 0 0]
[0 0 0 0 1 0 0 0 0]
[0 0 0 1 0 1 0 0 0]
[0 0 1 0 0 0 1 0 0]
[0 1 0 0 0 0 0 1 0]
[1 0 0 0 0 0 0 0 1]
[0 0 0 0 0 0 0 0 0]]
MOVE
[[0 0 0 0 0 0 0 0 0]
[1 0 0 0 0 0 0 0 1]
[0 1 0 0 0 0 0 1 0]
[0 0 1 0 0 0 1 0 0]
[0 0 0 1 1 1 0 0 0]
[0 0 0 1 1 1 0 0 0]
[0 0 0 1 1 1 0 0 0]
[0 0 1 0 0 0 1 0 0]
[0 1 0 0 0 0 0 1 0]
[1 0 0 0 0 0 0 0 1]
[0 0 0 0 0 0 0 0 0]]
In [214]:
BISHOP_ATTACK_MASKS = np.rot90(stride_tricks.as_strided(BISHOP['ATTACK'], shape=(6, 5, 6, 5), strides=BISHOP['ATTACK'].strides + BISHOP['MOVE'].strides), k=2)
BISHOP_ATTACK_MASKS
Out[214]:
array([[[[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0]],
[[0, 1, 0, 0, 0],
[1, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 1, 0, 0],
[0, 1, 0, 1, 0],
[1, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 1, 0],
[0, 0, 1, 0, 1],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1]],
[[1, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0]],
[[0, 1, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 1, 0],
[1, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 1, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 1],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0]]],
[[[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0]],
[[0, 0, 0, 1, 0],
[1, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1]],
[[1, 0, 0, 0, 1],
[0, 1, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 1, 0],
[1, 0, 0, 0, 1],
[0, 0, 0, 0, 0]],
[[0, 1, 0, 0, 0],
[0, 0, 1, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 1],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0]],
[[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0]]],
[[[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0]],
[[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[1, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 1, 0, 0],
[0, 0, 0, 1, 0]],
[[0, 0, 0, 0, 0],
[1, 0, 0, 0, 1],
[0, 1, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 1, 0],
[1, 0, 0, 0, 1]],
[[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 1],
[0, 1, 0, 0, 0]],
[[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0]]],
[[[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[1, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 1, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 1],
[0, 1, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 1, 0]],
[[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 1]],
[[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[1, 0, 1, 0, 0],
[0, 1, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 1],
[0, 1, 0, 1, 0],
[0, 0, 1, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 1],
[0, 0, 0, 1, 0]],
[[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1]]]])
In [215]:
BISHOP_MOVE_MASKS = np.rot90(stride_tricks.as_strided(BISHOP['MOVE'], shape=(6, 5, 6, 5), strides=BISHOP['MOVE'].strides + BISHOP['MOVE'].strides), k=2)
BISHOP_MOVE_MASKS
Out[215]:
array([[[[1, 1, 0, 0, 0],
[1, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0]],
[[1, 1, 1, 0, 0],
[1, 1, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[1, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 1, 1],
[0, 0, 0, 1, 1],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[1, 1, 0, 0, 0],
[1, 1, 0, 0, 0],
[1, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1]],
[[1, 1, 1, 0, 0],
[1, 1, 1, 0, 0],
[1, 1, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0]],
[[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[1, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 1, 1],
[0, 0, 0, 1, 1],
[0, 0, 0, 1, 1],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0]]],
[[[0, 0, 1, 0, 0],
[1, 1, 0, 0, 0],
[1, 1, 0, 0, 0],
[1, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0]],
[[0, 0, 0, 1, 0],
[1, 1, 1, 0, 0],
[1, 1, 1, 0, 0],
[1, 1, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1]],
[[1, 0, 0, 0, 1],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[1, 0, 0, 0, 1],
[0, 0, 0, 0, 0]],
[[0, 1, 0, 0, 0],
[0, 0, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0]],
[[0, 0, 1, 0, 0],
[0, 0, 0, 1, 1],
[0, 0, 0, 1, 1],
[0, 0, 0, 1, 1],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0]]],
[[[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[1, 1, 0, 0, 0],
[1, 1, 0, 0, 0],
[1, 1, 0, 0, 0],
[0, 0, 1, 0, 0]],
[[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[1, 1, 1, 0, 0],
[1, 1, 1, 0, 0],
[1, 1, 1, 0, 0],
[0, 0, 0, 1, 0]],
[[0, 0, 0, 0, 0],
[1, 0, 0, 0, 1],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[1, 0, 0, 0, 1]],
[[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 1, 0, 0, 0]],
[[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 1],
[0, 0, 0, 1, 1],
[0, 0, 0, 1, 1],
[0, 0, 1, 0, 0]]],
[[[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[1, 1, 0, 0, 0],
[1, 1, 0, 0, 0],
[1, 1, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[1, 1, 1, 0, 0],
[1, 1, 1, 0, 0],
[1, 1, 1, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 1],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0]],
[[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 0, 1, 1, 1]],
[[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 1],
[0, 0, 0, 1, 1],
[0, 0, 0, 1, 1]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[1, 1, 0, 0, 0],
[1, 1, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[1, 1, 1, 0, 0],
[1, 1, 1, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 1],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 1, 1],
[0, 0, 1, 1, 1]],
[[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 1],
[0, 0, 0, 1, 1]]]])
In [216]:
BLACK_PAWN = {
'ATTACK': np.lib.pad(np.array([[0,1,0],[1,0,1]], dtype=np.int), (((MASK_HEIGHT - 2)//2 + 1,4),(3,3)), 'constant'),
'MOVE' : np.lib.pad(np.ones((2,1), dtype=np.int), (((MASK_HEIGHT - 2)//2 + 1,4),(4,4)), 'constant')
}
print('ATTACK')
print(BLACK_PAWN['ATTACK'])
print('MOVE')
print(BLACK_PAWN['MOVE'])
ATTACK
[[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 1 0 0 0 0]
[0 0 0 1 0 1 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]]
MOVE
[[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 1 0 0 0 0]
[0 0 0 0 1 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]]
In [217]:
B_PAWN_ATTACK_MASKS = np.rot90(stride_tricks.as_strided(BLACK_PAWN['ATTACK'], shape=(6, 5, 6, 5), strides=BLACK_PAWN['ATTACK'].strides + BLACK_PAWN['MOVE'].strides), k=2)
B_PAWN_ATTACK_MASKS
Out[217]:
array([[[[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 1, 0, 0, 0],
[1, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 1, 0, 0],
[0, 1, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 1, 0],
[0, 0, 1, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 1, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 1, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 1],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 1, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 1, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 1]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1]]]])
In [218]:
B_PAWN_MOVE_MASKS = np.rot90(stride_tricks.as_strided(BLACK_PAWN['MOVE'], shape=(6, 5, 6, 5), strides=BLACK_PAWN['MOVE'].strides + BLACK_PAWN['MOVE'].strides), k=2)
B_PAWN_MOVE_MASKS
Out[218]:
array([[[[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1]]]])
In [219]:
WHITE_PAWN = {
'ATTACK': np.flipud(BLACK_PAWN['ATTACK']),
'MOVE' : np.flipud(BLACK_PAWN['MOVE'])
}
print('ATTACK')
print(WHITE_PAWN['ATTACK'])
print('MOVE')
print(WHITE_PAWN['MOVE'])
ATTACK
[[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 1 0 1 0 0 0]
[0 0 0 0 1 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]]
MOVE
[[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 1 0 0 0 0]
[0 0 0 0 1 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]]
In [220]:
W_PAWN_MOVE_MASKS = np.rot90(stride_tricks.as_strided(WHITE_PAWN['MOVE'], shape=(6, 5, 6, 5), strides=WHITE_PAWN['MOVE'].strides + WHITE_PAWN['MOVE'].strides), k=2)
W_PAWN_MOVE_MASKS
Out[220]:
array([[[[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1]]]])
In [221]:
W_PAWN_ATTACK_MASKS = np.rot90(stride_tricks.as_strided(WHITE_PAWN['ATTACK'], shape=(6, 5, 6, 5), strides=WHITE_PAWN['ATTACK'].strides + WHITE_PAWN['ATTACK'].strides), k=2)
W_PAWN_ATTACK_MASKS
Out[221]:
array([[[[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[1, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 1, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 1, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[1, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 1, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 1, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 1, 0, 0],
[0, 1, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 1, 0],
[0, 0, 1, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 1],
[0, 0, 0, 1, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1]]]])
In [222]:
KNIGHT = np.lib.pad(np.array(
[[0,1,0,1,0],
[1,0,0,0,1],
[0,0,1,0,0],
[1,0,0,0,1],
[0,1,0,1,0]]), ((3,3),(2,2)), 'constant')
print(KNIGHT)
[[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 1 0 1 0 0 0]
[0 0 1 0 0 0 1 0 0]
[0 0 0 0 1 0 0 0 0]
[0 0 1 0 0 0 1 0 0]
[0 0 0 1 0 1 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]]
In [223]:
KNIGHT_MASKS = np.rot90(stride_tricks.as_strided(KNIGHT, shape=(6, 5, 6, 5), strides=KNIGHT.strides + KNIGHT.strides), k=2)
KNIGHT_MASKS
Out[223]:
array([[[[1, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 1, 0, 0, 0],
[0, 0, 0, 1, 0],
[1, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 1, 0, 0],
[1, 0, 0, 0, 1],
[0, 1, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 1, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 1],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 1, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 1, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 1, 0],
[1, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[1, 0, 0, 0, 1],
[0, 0, 1, 0, 0],
[1, 0, 0, 0, 1],
[0, 1, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 1, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 1, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[1, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 1, 0],
[1, 0, 1, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 1, 0, 1, 0],
[1, 0, 0, 0, 1],
[0, 0, 1, 0, 0],
[1, 0, 0, 0, 1],
[0, 1, 0, 1, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 1, 0, 1],
[0, 1, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 1],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[1, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 1, 0],
[1, 0, 1, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 1, 0, 1, 0],
[1, 0, 0, 0, 1],
[0, 0, 1, 0, 0],
[1, 0, 0, 0, 1],
[0, 1, 0, 1, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 1, 0, 1],
[0, 1, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 1]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 1, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 1, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 1, 0],
[1, 0, 0, 0, 1],
[0, 0, 1, 0, 0],
[1, 0, 0, 0, 1]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 1],
[0, 1, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 1, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 1, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[1, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 1, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 1, 0],
[1, 0, 0, 0, 1],
[0, 0, 1, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 1],
[0, 1, 0, 0, 0],
[0, 0, 0, 1, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 1]]]])
In [224]:
KNIGHT_MASKS[(3,2)].ravel()
Out[224]:
array([0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0,
0, 1, 0, 1, 0, 1, 0])
In [225]:
import pandas as pd
n_masks = gen_int_masks(KNIGHT_MASKS)
print(n_masks)
print_bits(n_masks)
{536870912: [4194304, 262144], 268435456: [2097152, 524288, 131072], 134217728: [16777216, 1048576, 262144, 65536], 67108864: [8388608, 131072, 32768], 33554432: [4194304, 65536], 16777216: [134217728, 131072, 8192], 8388608: [67108864, 65536, 16384, 4096], 4194304: [536870912, 33554432, 524288, 32768, 8192, 2048], 2097152: [268435456, 262144, 4096, 1024], 1048576: [134217728, 131072, 2048], 524288: [268435456, 4194304, 4096, 256], 262144: [536870912, 134217728, 2097152, 2048, 512, 128], 131072: [268435456, 67108864, 16777216, 1048576, 16384, 1024, 256, 64], 65536: [134217728, 33554432, 8388608, 8192, 128, 32], 32768: [67108864, 4194304, 4096, 64], 16384: [8388608, 131072, 128, 8], 8192: [16777216, 4194304, 65536, 64, 16, 4], 4096: [8388608, 2097152, 524288, 32768, 512, 32, 8, 2], 2048: [4194304, 1048576, 262144, 256, 4, 1], 1024: [2097152, 131072, 128, 2], 512: [262144, 4096, 4], 256: [524288, 131072, 2048, 2], 128: [262144, 65536, 16384, 1024, 16, 1], 64: [131072, 32768, 8192, 8], 32: [65536, 4096, 4], 16: [8192, 128], 8: [16384, 4096, 64], 4: [8192, 2048, 512, 32], 2: [4096, 1024, 256], 1: [2048, 128]}
Anchor: 100000000000000000000000000000
Masks:
000000010000000000000000000000
000000000001000000000000000000
----------------------------------------
Anchor: 010000000000000000000000000000
Masks:
000000001000000000000000000000
000000000010000000000000000000
000000000000100000000000000000
----------------------------------------
Anchor: 001000000000000000000000000000
Masks:
000001000000000000000000000000
000000000100000000000000000000
000000000001000000000000000000
000000000000010000000000000000
----------------------------------------
Anchor: 000100000000000000000000000000
Masks:
000000100000000000000000000000
000000000000100000000000000000
000000000000001000000000000000
----------------------------------------
Anchor: 000010000000000000000000000000
Masks:
000000010000000000000000000000
000000000000010000000000000000
----------------------------------------
Anchor: 000001000000000000000000000000
Masks:
001000000000000000000000000000
000000000000100000000000000000
000000000000000010000000000000
----------------------------------------
Anchor: 000000100000000000000000000000
Masks:
000100000000000000000000000000
000000000000010000000000000000
000000000000000100000000000000
000000000000000001000000000000
----------------------------------------
Anchor: 000000010000000000000000000000
Masks:
100000000000000000000000000000
000010000000000000000000000000
000000000010000000000000000000
000000000000001000000000000000
000000000000000010000000000000
000000000000000000100000000000
----------------------------------------
Anchor: 000000001000000000000000000000
Masks:
010000000000000000000000000000
000000000001000000000000000000
000000000000000001000000000000
000000000000000000010000000000
----------------------------------------
Anchor: 000000000100000000000000000000
Masks:
001000000000000000000000000000
000000000000100000000000000000
000000000000000000100000000000
----------------------------------------
Anchor: 000000000010000000000000000000
Masks:
010000000000000000000000000000
000000010000000000000000000000
000000000000000001000000000000
000000000000000000000100000000
----------------------------------------
Anchor: 000000000001000000000000000000
Masks:
100000000000000000000000000000
001000000000000000000000000000
000000001000000000000000000000
000000000000000000100000000000
000000000000000000001000000000
000000000000000000000010000000
----------------------------------------
Anchor: 000000000000100000000000000000
Masks:
010000000000000000000000000000
000100000000000000000000000000
000001000000000000000000000000
000000000100000000000000000000
000000000000000100000000000000
000000000000000000010000000000
000000000000000000000100000000
000000000000000000000001000000
----------------------------------------
Anchor: 000000000000010000000000000000
Masks:
001000000000000000000000000000
000010000000000000000000000000
000000100000000000000000000000
000000000000000010000000000000
000000000000000000000010000000
000000000000000000000000100000
----------------------------------------
Anchor: 000000000000001000000000000000
Masks:
000100000000000000000000000000
000000010000000000000000000000
000000000000000001000000000000
000000000000000000000001000000
----------------------------------------
Anchor: 000000000000000100000000000000
Masks:
000000100000000000000000000000
000000000000100000000000000000
000000000000000000000010000000
000000000000000000000000001000
----------------------------------------
Anchor: 000000000000000010000000000000
Masks:
000001000000000000000000000000
000000010000000000000000000000
000000000000010000000000000000
000000000000000000000001000000
000000000000000000000000010000
000000000000000000000000000100
----------------------------------------
Anchor: 000000000000000001000000000000
Masks:
000000100000000000000000000000
000000001000000000000000000000
000000000010000000000000000000
000000000000001000000000000000
000000000000000000001000000000
000000000000000000000000100000
000000000000000000000000001000
000000000000000000000000000010
----------------------------------------
Anchor: 000000000000000000100000000000
Masks:
000000010000000000000000000000
000000000100000000000000000000
000000000001000000000000000000
000000000000000000000100000000
000000000000000000000000000100
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000000000010000000000
Masks:
000000001000000000000000000000
000000000000100000000000000000
000000000000000000000010000000
000000000000000000000000000010
----------------------------------------
Anchor: 000000000000000000001000000000
Masks:
000000000001000000000000000000
000000000000000001000000000000
000000000000000000000000000100
----------------------------------------
Anchor: 000000000000000000000100000000
Masks:
000000000010000000000000000000
000000000000100000000000000000
000000000000000000100000000000
000000000000000000000000000010
----------------------------------------
Anchor: 000000000000000000000010000000
Masks:
000000000001000000000000000000
000000000000010000000000000000
000000000000000100000000000000
000000000000000000010000000000
000000000000000000000000010000
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000000000000001000000
Masks:
000000000000100000000000000000
000000000000001000000000000000
000000000000000010000000000000
000000000000000000000000001000
----------------------------------------
Anchor: 000000000000000000000000100000
Masks:
000000000000010000000000000000
000000000000000001000000000000
000000000000000000000000000100
----------------------------------------
Anchor: 000000000000000000000000010000
Masks:
000000000000000010000000000000
000000000000000000000010000000
----------------------------------------
Anchor: 000000000000000000000000001000
Masks:
000000000000000100000000000000
000000000000000001000000000000
000000000000000000000001000000
----------------------------------------
Anchor: 000000000000000000000000000100
Masks:
000000000000000010000000000000
000000000000000000100000000000
000000000000000000001000000000
000000000000000000000000100000
----------------------------------------
Anchor: 000000000000000000000000000010
Masks:
000000000000000001000000000000
000000000000000000010000000000
000000000000000000000100000000
----------------------------------------
Anchor: 000000000000000000000000000001
Masks:
000000000000000000100000000000
000000000000000000000010000000
----------------------------------------
In [226]:
w_pm_masks = gen_int_masks(W_PAWN_MOVE_MASKS)
print(w_pm_masks)
print_bits(w_pm_masks)
{536870912: [], 268435456: [], 134217728: [], 67108864: [], 33554432: [], 16777216: [536870912], 8388608: [268435456], 4194304: [134217728], 2097152: [67108864], 1048576: [33554432], 524288: [16777216], 262144: [8388608], 131072: [4194304], 65536: [2097152], 32768: [1048576], 16384: [524288], 8192: [262144], 4096: [131072], 2048: [65536], 1024: [32768], 512: [16384], 256: [8192], 128: [4096], 64: [2048], 32: [1024], 16: [512], 8: [256], 4: [128], 2: [64], 1: [32]}
Anchor: 100000000000000000000000000000
Masks:
----------------------------------------
Anchor: 010000000000000000000000000000
Masks:
----------------------------------------
Anchor: 001000000000000000000000000000
Masks:
----------------------------------------
Anchor: 000100000000000000000000000000
Masks:
----------------------------------------
Anchor: 000010000000000000000000000000
Masks:
----------------------------------------
Anchor: 000001000000000000000000000000
Masks:
100000000000000000000000000000
----------------------------------------
Anchor: 000000100000000000000000000000
Masks:
010000000000000000000000000000
----------------------------------------
Anchor: 000000010000000000000000000000
Masks:
001000000000000000000000000000
----------------------------------------
Anchor: 000000001000000000000000000000
Masks:
000100000000000000000000000000
----------------------------------------
Anchor: 000000000100000000000000000000
Masks:
000010000000000000000000000000
----------------------------------------
Anchor: 000000000010000000000000000000
Masks:
000001000000000000000000000000
----------------------------------------
Anchor: 000000000001000000000000000000
Masks:
000000100000000000000000000000
----------------------------------------
Anchor: 000000000000100000000000000000
Masks:
000000010000000000000000000000
----------------------------------------
Anchor: 000000000000010000000000000000
Masks:
000000001000000000000000000000
----------------------------------------
Anchor: 000000000000001000000000000000
Masks:
000000000100000000000000000000
----------------------------------------
Anchor: 000000000000000100000000000000
Masks:
000000000010000000000000000000
----------------------------------------
Anchor: 000000000000000010000000000000
Masks:
000000000001000000000000000000
----------------------------------------
Anchor: 000000000000000001000000000000
Masks:
000000000000100000000000000000
----------------------------------------
Anchor: 000000000000000000100000000000
Masks:
000000000000010000000000000000
----------------------------------------
Anchor: 000000000000000000010000000000
Masks:
000000000000001000000000000000
----------------------------------------
Anchor: 000000000000000000001000000000
Masks:
000000000000000100000000000000
----------------------------------------
Anchor: 000000000000000000000100000000
Masks:
000000000000000010000000000000
----------------------------------------
Anchor: 000000000000000000000010000000
Masks:
000000000000000001000000000000
----------------------------------------
Anchor: 000000000000000000000001000000
Masks:
000000000000000000100000000000
----------------------------------------
Anchor: 000000000000000000000000100000
Masks:
000000000000000000010000000000
----------------------------------------
Anchor: 000000000000000000000000010000
Masks:
000000000000000000001000000000
----------------------------------------
Anchor: 000000000000000000000000001000
Masks:
000000000000000000000100000000
----------------------------------------
Anchor: 000000000000000000000000000100
Masks:
000000000000000000000010000000
----------------------------------------
Anchor: 000000000000000000000000000010
Masks:
000000000000000000000001000000
----------------------------------------
Anchor: 000000000000000000000000000001
Masks:
000000000000000000000000100000
----------------------------------------
In [227]:
w_pa_masks = gen_int_masks(W_PAWN_ATTACK_MASKS)
print(w_pa_masks)
print_bits(w_pa_masks)
{536870912: [], 268435456: [], 134217728: [], 67108864: [], 33554432: [], 16777216: [268435456], 8388608: [536870912, 134217728], 4194304: [268435456, 67108864], 2097152: [134217728, 33554432], 1048576: [67108864], 524288: [8388608], 262144: [16777216, 4194304], 131072: [8388608, 2097152], 65536: [4194304, 1048576], 32768: [2097152], 16384: [262144], 8192: [524288, 131072], 4096: [262144, 65536], 2048: [131072, 32768], 1024: [65536], 512: [8192], 256: [16384, 4096], 128: [8192, 2048], 64: [4096, 1024], 32: [2048], 16: [256], 8: [512, 128], 4: [256, 64], 2: [128, 32], 1: [64]}
Anchor: 100000000000000000000000000000
Masks:
----------------------------------------
Anchor: 010000000000000000000000000000
Masks:
----------------------------------------
Anchor: 001000000000000000000000000000
Masks:
----------------------------------------
Anchor: 000100000000000000000000000000
Masks:
----------------------------------------
Anchor: 000010000000000000000000000000
Masks:
----------------------------------------
Anchor: 000001000000000000000000000000
Masks:
010000000000000000000000000000
----------------------------------------
Anchor: 000000100000000000000000000000
Masks:
100000000000000000000000000000
001000000000000000000000000000
----------------------------------------
Anchor: 000000010000000000000000000000
Masks:
010000000000000000000000000000
000100000000000000000000000000
----------------------------------------
Anchor: 000000001000000000000000000000
Masks:
001000000000000000000000000000
000010000000000000000000000000
----------------------------------------
Anchor: 000000000100000000000000000000
Masks:
000100000000000000000000000000
----------------------------------------
Anchor: 000000000010000000000000000000
Masks:
000000100000000000000000000000
----------------------------------------
Anchor: 000000000001000000000000000000
Masks:
000001000000000000000000000000
000000010000000000000000000000
----------------------------------------
Anchor: 000000000000100000000000000000
Masks:
000000100000000000000000000000
000000001000000000000000000000
----------------------------------------
Anchor: 000000000000010000000000000000
Masks:
000000010000000000000000000000
000000000100000000000000000000
----------------------------------------
Anchor: 000000000000001000000000000000
Masks:
000000001000000000000000000000
----------------------------------------
Anchor: 000000000000000100000000000000
Masks:
000000000001000000000000000000
----------------------------------------
Anchor: 000000000000000010000000000000
Masks:
000000000010000000000000000000
000000000000100000000000000000
----------------------------------------
Anchor: 000000000000000001000000000000
Masks:
000000000001000000000000000000
000000000000010000000000000000
----------------------------------------
Anchor: 000000000000000000100000000000
Masks:
000000000000100000000000000000
000000000000001000000000000000
----------------------------------------
Anchor: 000000000000000000010000000000
Masks:
000000000000010000000000000000
----------------------------------------
Anchor: 000000000000000000001000000000
Masks:
000000000000000010000000000000
----------------------------------------
Anchor: 000000000000000000000100000000
Masks:
000000000000000100000000000000
000000000000000001000000000000
----------------------------------------
Anchor: 000000000000000000000010000000
Masks:
000000000000000010000000000000
000000000000000000100000000000
----------------------------------------
Anchor: 000000000000000000000001000000
Masks:
000000000000000001000000000000
000000000000000000010000000000
----------------------------------------
Anchor: 000000000000000000000000100000
Masks:
000000000000000000100000000000
----------------------------------------
Anchor: 000000000000000000000000010000
Masks:
000000000000000000000100000000
----------------------------------------
Anchor: 000000000000000000000000001000
Masks:
000000000000000000001000000000
000000000000000000000010000000
----------------------------------------
Anchor: 000000000000000000000000000100
Masks:
000000000000000000000100000000
000000000000000000000001000000
----------------------------------------
Anchor: 000000000000000000000000000010
Masks:
000000000000000000000010000000
000000000000000000000000100000
----------------------------------------
Anchor: 000000000000000000000000000001
Masks:
000000000000000000000001000000
----------------------------------------
In [228]:
b_pm_masks = gen_int_masks(B_PAWN_MOVE_MASKS)
print(b_pm_masks)
print_bits(b_pm_masks)
{536870912: [16777216], 268435456: [8388608], 134217728: [4194304], 67108864: [2097152], 33554432: [1048576], 16777216: [524288], 8388608: [262144], 4194304: [131072], 2097152: [65536], 1048576: [32768], 524288: [16384], 262144: [8192], 131072: [4096], 65536: [2048], 32768: [1024], 16384: [512], 8192: [256], 4096: [128], 2048: [64], 1024: [32], 512: [16], 256: [8], 128: [4], 64: [2], 32: [1], 16: [], 8: [], 4: [], 2: [], 1: []}
Anchor: 100000000000000000000000000000
Masks:
000001000000000000000000000000
----------------------------------------
Anchor: 010000000000000000000000000000
Masks:
000000100000000000000000000000
----------------------------------------
Anchor: 001000000000000000000000000000
Masks:
000000010000000000000000000000
----------------------------------------
Anchor: 000100000000000000000000000000
Masks:
000000001000000000000000000000
----------------------------------------
Anchor: 000010000000000000000000000000
Masks:
000000000100000000000000000000
----------------------------------------
Anchor: 000001000000000000000000000000
Masks:
000000000010000000000000000000
----------------------------------------
Anchor: 000000100000000000000000000000
Masks:
000000000001000000000000000000
----------------------------------------
Anchor: 000000010000000000000000000000
Masks:
000000000000100000000000000000
----------------------------------------
Anchor: 000000001000000000000000000000
Masks:
000000000000010000000000000000
----------------------------------------
Anchor: 000000000100000000000000000000
Masks:
000000000000001000000000000000
----------------------------------------
Anchor: 000000000010000000000000000000
Masks:
000000000000000100000000000000
----------------------------------------
Anchor: 000000000001000000000000000000
Masks:
000000000000000010000000000000
----------------------------------------
Anchor: 000000000000100000000000000000
Masks:
000000000000000001000000000000
----------------------------------------
Anchor: 000000000000010000000000000000
Masks:
000000000000000000100000000000
----------------------------------------
Anchor: 000000000000001000000000000000
Masks:
000000000000000000010000000000
----------------------------------------
Anchor: 000000000000000100000000000000
Masks:
000000000000000000001000000000
----------------------------------------
Anchor: 000000000000000010000000000000
Masks:
000000000000000000000100000000
----------------------------------------
Anchor: 000000000000000001000000000000
Masks:
000000000000000000000010000000
----------------------------------------
Anchor: 000000000000000000100000000000
Masks:
000000000000000000000001000000
----------------------------------------
Anchor: 000000000000000000010000000000
Masks:
000000000000000000000000100000
----------------------------------------
Anchor: 000000000000000000001000000000
Masks:
000000000000000000000000010000
----------------------------------------
Anchor: 000000000000000000000100000000
Masks:
000000000000000000000000001000
----------------------------------------
Anchor: 000000000000000000000010000000
Masks:
000000000000000000000000000100
----------------------------------------
Anchor: 000000000000000000000001000000
Masks:
000000000000000000000000000010
----------------------------------------
Anchor: 000000000000000000000000100000
Masks:
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000000000000000010000
Masks:
----------------------------------------
Anchor: 000000000000000000000000001000
Masks:
----------------------------------------
Anchor: 000000000000000000000000000100
Masks:
----------------------------------------
Anchor: 000000000000000000000000000010
Masks:
----------------------------------------
Anchor: 000000000000000000000000000001
Masks:
----------------------------------------
In [229]:
b_pa_masks = gen_int_masks(B_PAWN_ATTACK_MASKS)
print(b_pa_masks)
print_bits(b_pa_masks)
{536870912: [8388608], 268435456: [16777216, 4194304], 134217728: [8388608, 2097152], 67108864: [4194304, 1048576], 33554432: [2097152], 16777216: [262144], 8388608: [524288, 131072], 4194304: [262144, 65536], 2097152: [131072, 32768], 1048576: [65536], 524288: [8192], 262144: [16384, 4096], 131072: [8192, 2048], 65536: [4096, 1024], 32768: [2048], 16384: [256], 8192: [512, 128], 4096: [256, 64], 2048: [128, 32], 1024: [64], 512: [8], 256: [16, 4], 128: [8, 2], 64: [4, 1], 32: [2], 16: [], 8: [], 4: [], 2: [], 1: []}
Anchor: 100000000000000000000000000000
Masks:
000000100000000000000000000000
----------------------------------------
Anchor: 010000000000000000000000000000
Masks:
000001000000000000000000000000
000000010000000000000000000000
----------------------------------------
Anchor: 001000000000000000000000000000
Masks:
000000100000000000000000000000
000000001000000000000000000000
----------------------------------------
Anchor: 000100000000000000000000000000
Masks:
000000010000000000000000000000
000000000100000000000000000000
----------------------------------------
Anchor: 000010000000000000000000000000
Masks:
000000001000000000000000000000
----------------------------------------
Anchor: 000001000000000000000000000000
Masks:
000000000001000000000000000000
----------------------------------------
Anchor: 000000100000000000000000000000
Masks:
000000000010000000000000000000
000000000000100000000000000000
----------------------------------------
Anchor: 000000010000000000000000000000
Masks:
000000000001000000000000000000
000000000000010000000000000000
----------------------------------------
Anchor: 000000001000000000000000000000
Masks:
000000000000100000000000000000
000000000000001000000000000000
----------------------------------------
Anchor: 000000000100000000000000000000
Masks:
000000000000010000000000000000
----------------------------------------
Anchor: 000000000010000000000000000000
Masks:
000000000000000010000000000000
----------------------------------------
Anchor: 000000000001000000000000000000
Masks:
000000000000000100000000000000
000000000000000001000000000000
----------------------------------------
Anchor: 000000000000100000000000000000
Masks:
000000000000000010000000000000
000000000000000000100000000000
----------------------------------------
Anchor: 000000000000010000000000000000
Masks:
000000000000000001000000000000
000000000000000000010000000000
----------------------------------------
Anchor: 000000000000001000000000000000
Masks:
000000000000000000100000000000
----------------------------------------
Anchor: 000000000000000100000000000000
Masks:
000000000000000000000100000000
----------------------------------------
Anchor: 000000000000000010000000000000
Masks:
000000000000000000001000000000
000000000000000000000010000000
----------------------------------------
Anchor: 000000000000000001000000000000
Masks:
000000000000000000000100000000
000000000000000000000001000000
----------------------------------------
Anchor: 000000000000000000100000000000
Masks:
000000000000000000000010000000
000000000000000000000000100000
----------------------------------------
Anchor: 000000000000000000010000000000
Masks:
000000000000000000000001000000
----------------------------------------
Anchor: 000000000000000000001000000000
Masks:
000000000000000000000000001000
----------------------------------------
Anchor: 000000000000000000000100000000
Masks:
000000000000000000000000010000
000000000000000000000000000100
----------------------------------------
Anchor: 000000000000000000000010000000
Masks:
000000000000000000000000001000
000000000000000000000000000010
----------------------------------------
Anchor: 000000000000000000000001000000
Masks:
000000000000000000000000000100
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000000000000000100000
Masks:
000000000000000000000000000010
----------------------------------------
Anchor: 000000000000000000000000010000
Masks:
----------------------------------------
Anchor: 000000000000000000000000001000
Masks:
----------------------------------------
Anchor: 000000000000000000000000000100
Masks:
----------------------------------------
Anchor: 000000000000000000000000000010
Masks:
----------------------------------------
Anchor: 000000000000000000000000000001
Masks:
----------------------------------------
In [230]:
b_attack_masks = gen_int_masks(BISHOP_ATTACK_MASKS)
print(b_attack_masks)
print_bits(b_attack_masks)
{536870912: [8388608, 131072, 2048, 32], 268435456: [16777216, 4194304, 65536, 1024], 134217728: [8388608, 2097152, 524288, 32768], 67108864: [4194304, 1048576, 262144, 16384], 33554432: [2097152, 131072, 8192, 512], 16777216: [268435456, 262144, 4096, 64, 1], 8388608: [536870912, 134217728, 524288, 131072, 2048, 32], 4194304: [268435456, 67108864, 262144, 65536, 16384, 1024], 2097152: [134217728, 33554432, 131072, 32768, 8192, 512], 1048576: [67108864, 65536, 4096, 256, 16], 524288: [134217728, 8388608, 8192, 128, 2], 262144: [67108864, 16777216, 4194304, 16384, 4096, 64, 1], 131072: [536870912, 33554432, 8388608, 2097152, 8192, 2048, 512, 32], 65536: [268435456, 4194304, 1048576, 4096, 1024, 256, 16], 32768: [134217728, 2097152, 2048, 128, 8], 16384: [67108864, 4194304, 262144, 256, 4], 8192: [33554432, 2097152, 524288, 131072, 512, 128, 2], 4096: [16777216, 1048576, 262144, 65536, 256, 64, 16, 1], 2048: [536870912, 8388608, 131072, 32768, 128, 32, 8], 1024: [268435456, 4194304, 65536, 64, 4], 512: [33554432, 2097152, 131072, 8192, 8], 256: [1048576, 65536, 16384, 4096, 16, 4], 128: [524288, 32768, 8192, 2048, 8, 2], 64: [16777216, 262144, 4096, 1024, 4, 1], 32: [536870912, 8388608, 131072, 2048, 2], 16: [1048576, 65536, 4096, 256], 8: [32768, 2048, 512, 128], 4: [16384, 1024, 256, 64], 2: [524288, 8192, 128, 32], 1: [16777216, 262144, 4096, 64]}
Anchor: 100000000000000000000000000000
Masks:
000000100000000000000000000000
000000000000100000000000000000
000000000000000000100000000000
000000000000000000000000100000
----------------------------------------
Anchor: 010000000000000000000000000000
Masks:
000001000000000000000000000000
000000010000000000000000000000
000000000000010000000000000000
000000000000000000010000000000
----------------------------------------
Anchor: 001000000000000000000000000000
Masks:
000000100000000000000000000000
000000001000000000000000000000
000000000010000000000000000000
000000000000001000000000000000
----------------------------------------
Anchor: 000100000000000000000000000000
Masks:
000000010000000000000000000000
000000000100000000000000000000
000000000001000000000000000000
000000000000000100000000000000
----------------------------------------
Anchor: 000010000000000000000000000000
Masks:
000000001000000000000000000000
000000000000100000000000000000
000000000000000010000000000000
000000000000000000001000000000
----------------------------------------
Anchor: 000001000000000000000000000000
Masks:
010000000000000000000000000000
000000000001000000000000000000
000000000000000001000000000000
000000000000000000000001000000
000000000000000000000000000001
----------------------------------------
Anchor: 000000100000000000000000000000
Masks:
100000000000000000000000000000
001000000000000000000000000000
000000000010000000000000000000
000000000000100000000000000000
000000000000000000100000000000
000000000000000000000000100000
----------------------------------------
Anchor: 000000010000000000000000000000
Masks:
010000000000000000000000000000
000100000000000000000000000000
000000000001000000000000000000
000000000000010000000000000000
000000000000000100000000000000
000000000000000000010000000000
----------------------------------------
Anchor: 000000001000000000000000000000
Masks:
001000000000000000000000000000
000010000000000000000000000000
000000000000100000000000000000
000000000000001000000000000000
000000000000000010000000000000
000000000000000000001000000000
----------------------------------------
Anchor: 000000000100000000000000000000
Masks:
000100000000000000000000000000
000000000000010000000000000000
000000000000000001000000000000
000000000000000000000100000000
000000000000000000000000010000
----------------------------------------
Anchor: 000000000010000000000000000000
Masks:
001000000000000000000000000000
000000100000000000000000000000
000000000000000010000000000000
000000000000000000000010000000
000000000000000000000000000010
----------------------------------------
Anchor: 000000000001000000000000000000
Masks:
000100000000000000000000000000
000001000000000000000000000000
000000010000000000000000000000
000000000000000100000000000000
000000000000000001000000000000
000000000000000000000001000000
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000100000000000000000
Masks:
100000000000000000000000000000
000010000000000000000000000000
000000100000000000000000000000
000000001000000000000000000000
000000000000000010000000000000
000000000000000000100000000000
000000000000000000001000000000
000000000000000000000000100000
----------------------------------------
Anchor: 000000000000010000000000000000
Masks:
010000000000000000000000000000
000000010000000000000000000000
000000000100000000000000000000
000000000000000001000000000000
000000000000000000010000000000
000000000000000000000100000000
000000000000000000000000010000
----------------------------------------
Anchor: 000000000000001000000000000000
Masks:
001000000000000000000000000000
000000001000000000000000000000
000000000000000000100000000000
000000000000000000000010000000
000000000000000000000000001000
----------------------------------------
Anchor: 000000000000000100000000000000
Masks:
000100000000000000000000000000
000000010000000000000000000000
000000000001000000000000000000
000000000000000000000100000000
000000000000000000000000000100
----------------------------------------
Anchor: 000000000000000010000000000000
Masks:
000010000000000000000000000000
000000001000000000000000000000
000000000010000000000000000000
000000000000100000000000000000
000000000000000000001000000000
000000000000000000000010000000
000000000000000000000000000010
----------------------------------------
Anchor: 000000000000000001000000000000
Masks:
000001000000000000000000000000
000000000100000000000000000000
000000000001000000000000000000
000000000000010000000000000000
000000000000000000000100000000
000000000000000000000001000000
000000000000000000000000010000
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000000000100000000000
Masks:
100000000000000000000000000000
000000100000000000000000000000
000000000000100000000000000000
000000000000001000000000000000
000000000000000000000010000000
000000000000000000000000100000
000000000000000000000000001000
----------------------------------------
Anchor: 000000000000000000010000000000
Masks:
010000000000000000000000000000
000000010000000000000000000000
000000000000010000000000000000
000000000000000000000001000000
000000000000000000000000000100
----------------------------------------
Anchor: 000000000000000000001000000000
Masks:
000010000000000000000000000000
000000001000000000000000000000
000000000000100000000000000000
000000000000000010000000000000
000000000000000000000000001000
----------------------------------------
Anchor: 000000000000000000000100000000
Masks:
000000000100000000000000000000
000000000000010000000000000000
000000000000000100000000000000
000000000000000001000000000000
000000000000000000000000010000
000000000000000000000000000100
----------------------------------------
Anchor: 000000000000000000000010000000
Masks:
000000000010000000000000000000
000000000000001000000000000000
000000000000000010000000000000
000000000000000000100000000000
000000000000000000000000001000
000000000000000000000000000010
----------------------------------------
Anchor: 000000000000000000000001000000
Masks:
000001000000000000000000000000
000000000001000000000000000000
000000000000000001000000000000
000000000000000000010000000000
000000000000000000000000000100
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000000000000000100000
Masks:
100000000000000000000000000000
000000100000000000000000000000
000000000000100000000000000000
000000000000000000100000000000
000000000000000000000000000010
----------------------------------------
Anchor: 000000000000000000000000010000
Masks:
000000000100000000000000000000
000000000000010000000000000000
000000000000000001000000000000
000000000000000000000100000000
----------------------------------------
Anchor: 000000000000000000000000001000
Masks:
000000000000001000000000000000
000000000000000000100000000000
000000000000000000001000000000
000000000000000000000010000000
----------------------------------------
Anchor: 000000000000000000000000000100
Masks:
000000000000000100000000000000
000000000000000000010000000000
000000000000000000000100000000
000000000000000000000001000000
----------------------------------------
Anchor: 000000000000000000000000000010
Masks:
000000000010000000000000000000
000000000000000010000000000000
000000000000000000000010000000
000000000000000000000000100000
----------------------------------------
Anchor: 000000000000000000000000000001
Masks:
000001000000000000000000000000
000000000001000000000000000000
000000000000000001000000000000
000000000000000000000001000000
----------------------------------------
In [231]:
b_move_masks = gen_int_masks(BISHOP_MOVE_MASKS)
print(b_move_masks)
print_bits(b_move_masks)
{536870912: [268435456, 16777216, 8388608, 131072, 2048, 32], 268435456: [536870912, 134217728, 16777216, 8388608, 4194304, 65536, 1024], 134217728: [268435456, 67108864, 8388608, 4194304, 2097152, 524288, 32768], 67108864: [134217728, 33554432, 4194304, 2097152, 1048576, 262144, 16384], 33554432: [67108864, 2097152, 1048576, 131072, 8192, 512], 16777216: [536870912, 268435456, 8388608, 524288, 262144, 4096, 64, 1], 8388608: [536870912, 268435456, 134217728, 16777216, 4194304, 524288, 262144, 131072, 2048, 32], 4194304: [268435456, 134217728, 67108864, 8388608, 2097152, 262144, 131072, 65536, 16384, 1024], 2097152: [134217728, 67108864, 33554432, 4194304, 1048576, 131072, 65536, 32768, 8192, 512], 1048576: [67108864, 33554432, 2097152, 65536, 32768, 4096, 256, 16], 524288: [134217728, 16777216, 8388608, 262144, 16384, 8192, 128, 2], 262144: [67108864, 16777216, 8388608, 4194304, 524288, 131072, 16384, 8192, 4096, 64, 1], 131072: [536870912, 33554432, 8388608, 4194304, 2097152, 262144, 65536, 8192, 4096, 2048, 512, 32], 65536: [268435456, 4194304, 2097152, 1048576, 131072, 32768, 4096, 2048, 1024, 256, 16], 32768: [134217728, 2097152, 1048576, 65536, 2048, 1024, 128, 8], 16384: [67108864, 4194304, 524288, 262144, 8192, 512, 256, 4], 8192: [33554432, 2097152, 524288, 262144, 131072, 16384, 4096, 512, 256, 128, 2], 4096: [16777216, 1048576, 262144, 131072, 65536, 8192, 2048, 256, 128, 64, 16, 1], 2048: [536870912, 8388608, 131072, 65536, 32768, 4096, 1024, 128, 64, 32, 8], 1024: [268435456, 4194304, 65536, 32768, 2048, 64, 32, 4], 512: [33554432, 2097152, 131072, 16384, 8192, 256, 16, 8], 256: [1048576, 65536, 16384, 8192, 4096, 512, 128, 16, 8, 4], 128: [524288, 32768, 8192, 4096, 2048, 256, 64, 8, 4, 2], 64: [16777216, 262144, 4096, 2048, 1024, 128, 32, 4, 2, 1], 32: [536870912, 8388608, 131072, 2048, 1024, 64, 2, 1], 16: [1048576, 65536, 4096, 512, 256, 8], 8: [32768, 2048, 512, 256, 128, 16, 4], 4: [16384, 1024, 256, 128, 64, 8, 2], 2: [524288, 8192, 128, 64, 32, 4, 1], 1: [16777216, 262144, 4096, 64, 32, 2]}
Anchor: 100000000000000000000000000000
Masks:
010000000000000000000000000000
000001000000000000000000000000
000000100000000000000000000000
000000000000100000000000000000
000000000000000000100000000000
000000000000000000000000100000
----------------------------------------
Anchor: 010000000000000000000000000000
Masks:
100000000000000000000000000000
001000000000000000000000000000
000001000000000000000000000000
000000100000000000000000000000
000000010000000000000000000000
000000000000010000000000000000
000000000000000000010000000000
----------------------------------------
Anchor: 001000000000000000000000000000
Masks:
010000000000000000000000000000
000100000000000000000000000000
000000100000000000000000000000
000000010000000000000000000000
000000001000000000000000000000
000000000010000000000000000000
000000000000001000000000000000
----------------------------------------
Anchor: 000100000000000000000000000000
Masks:
001000000000000000000000000000
000010000000000000000000000000
000000010000000000000000000000
000000001000000000000000000000
000000000100000000000000000000
000000000001000000000000000000
000000000000000100000000000000
----------------------------------------
Anchor: 000010000000000000000000000000
Masks:
000100000000000000000000000000
000000001000000000000000000000
000000000100000000000000000000
000000000000100000000000000000
000000000000000010000000000000
000000000000000000001000000000
----------------------------------------
Anchor: 000001000000000000000000000000
Masks:
100000000000000000000000000000
010000000000000000000000000000
000000100000000000000000000000
000000000010000000000000000000
000000000001000000000000000000
000000000000000001000000000000
000000000000000000000001000000
000000000000000000000000000001
----------------------------------------
Anchor: 000000100000000000000000000000
Masks:
100000000000000000000000000000
010000000000000000000000000000
001000000000000000000000000000
000001000000000000000000000000
000000010000000000000000000000
000000000010000000000000000000
000000000001000000000000000000
000000000000100000000000000000
000000000000000000100000000000
000000000000000000000000100000
----------------------------------------
Anchor: 000000010000000000000000000000
Masks:
010000000000000000000000000000
001000000000000000000000000000
000100000000000000000000000000
000000100000000000000000000000
000000001000000000000000000000
000000000001000000000000000000
000000000000100000000000000000
000000000000010000000000000000
000000000000000100000000000000
000000000000000000010000000000
----------------------------------------
Anchor: 000000001000000000000000000000
Masks:
001000000000000000000000000000
000100000000000000000000000000
000010000000000000000000000000
000000010000000000000000000000
000000000100000000000000000000
000000000000100000000000000000
000000000000010000000000000000
000000000000001000000000000000
000000000000000010000000000000
000000000000000000001000000000
----------------------------------------
Anchor: 000000000100000000000000000000
Masks:
000100000000000000000000000000
000010000000000000000000000000
000000001000000000000000000000
000000000000010000000000000000
000000000000001000000000000000
000000000000000001000000000000
000000000000000000000100000000
000000000000000000000000010000
----------------------------------------
Anchor: 000000000010000000000000000000
Masks:
001000000000000000000000000000
000001000000000000000000000000
000000100000000000000000000000
000000000001000000000000000000
000000000000000100000000000000
000000000000000010000000000000
000000000000000000000010000000
000000000000000000000000000010
----------------------------------------
Anchor: 000000000001000000000000000000
Masks:
000100000000000000000000000000
000001000000000000000000000000
000000100000000000000000000000
000000010000000000000000000000
000000000010000000000000000000
000000000000100000000000000000
000000000000000100000000000000
000000000000000010000000000000
000000000000000001000000000000
000000000000000000000001000000
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000100000000000000000
Masks:
100000000000000000000000000000
000010000000000000000000000000
000000100000000000000000000000
000000010000000000000000000000
000000001000000000000000000000
000000000001000000000000000000
000000000000010000000000000000
000000000000000010000000000000
000000000000000001000000000000
000000000000000000100000000000
000000000000000000001000000000
000000000000000000000000100000
----------------------------------------
Anchor: 000000000000010000000000000000
Masks:
010000000000000000000000000000
000000010000000000000000000000
000000001000000000000000000000
000000000100000000000000000000
000000000000100000000000000000
000000000000001000000000000000
000000000000000001000000000000
000000000000000000100000000000
000000000000000000010000000000
000000000000000000000100000000
000000000000000000000000010000
----------------------------------------
Anchor: 000000000000001000000000000000
Masks:
001000000000000000000000000000
000000001000000000000000000000
000000000100000000000000000000
000000000000010000000000000000
000000000000000000100000000000
000000000000000000010000000000
000000000000000000000010000000
000000000000000000000000001000
----------------------------------------
Anchor: 000000000000000100000000000000
Masks:
000100000000000000000000000000
000000010000000000000000000000
000000000010000000000000000000
000000000001000000000000000000
000000000000000010000000000000
000000000000000000001000000000
000000000000000000000100000000
000000000000000000000000000100
----------------------------------------
Anchor: 000000000000000010000000000000
Masks:
000010000000000000000000000000
000000001000000000000000000000
000000000010000000000000000000
000000000001000000000000000000
000000000000100000000000000000
000000000000000100000000000000
000000000000000001000000000000
000000000000000000001000000000
000000000000000000000100000000
000000000000000000000010000000
000000000000000000000000000010
----------------------------------------
Anchor: 000000000000000001000000000000
Masks:
000001000000000000000000000000
000000000100000000000000000000
000000000001000000000000000000
000000000000100000000000000000
000000000000010000000000000000
000000000000000010000000000000
000000000000000000100000000000
000000000000000000000100000000
000000000000000000000010000000
000000000000000000000001000000
000000000000000000000000010000
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000000000100000000000
Masks:
100000000000000000000000000000
000000100000000000000000000000
000000000000100000000000000000
000000000000010000000000000000
000000000000001000000000000000
000000000000000001000000000000
000000000000000000010000000000
000000000000000000000010000000
000000000000000000000001000000
000000000000000000000000100000
000000000000000000000000001000
----------------------------------------
Anchor: 000000000000000000010000000000
Masks:
010000000000000000000000000000
000000010000000000000000000000
000000000000010000000000000000
000000000000001000000000000000
000000000000000000100000000000
000000000000000000000001000000
000000000000000000000000100000
000000000000000000000000000100
----------------------------------------
Anchor: 000000000000000000001000000000
Masks:
000010000000000000000000000000
000000001000000000000000000000
000000000000100000000000000000
000000000000000100000000000000
000000000000000010000000000000
000000000000000000000100000000
000000000000000000000000010000
000000000000000000000000001000
----------------------------------------
Anchor: 000000000000000000000100000000
Masks:
000000000100000000000000000000
000000000000010000000000000000
000000000000000100000000000000
000000000000000010000000000000
000000000000000001000000000000
000000000000000000001000000000
000000000000000000000010000000
000000000000000000000000010000
000000000000000000000000001000
000000000000000000000000000100
----------------------------------------
Anchor: 000000000000000000000010000000
Masks:
000000000010000000000000000000
000000000000001000000000000000
000000000000000010000000000000
000000000000000001000000000000
000000000000000000100000000000
000000000000000000000100000000
000000000000000000000001000000
000000000000000000000000001000
000000000000000000000000000100
000000000000000000000000000010
----------------------------------------
Anchor: 000000000000000000000001000000
Masks:
000001000000000000000000000000
000000000001000000000000000000
000000000000000001000000000000
000000000000000000100000000000
000000000000000000010000000000
000000000000000000000010000000
000000000000000000000000100000
000000000000000000000000000100
000000000000000000000000000010
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000000000000000100000
Masks:
100000000000000000000000000000
000000100000000000000000000000
000000000000100000000000000000
000000000000000000100000000000
000000000000000000010000000000
000000000000000000000001000000
000000000000000000000000000010
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000000000000000010000
Masks:
000000000100000000000000000000
000000000000010000000000000000
000000000000000001000000000000
000000000000000000001000000000
000000000000000000000100000000
000000000000000000000000001000
----------------------------------------
Anchor: 000000000000000000000000001000
Masks:
000000000000001000000000000000
000000000000000000100000000000
000000000000000000001000000000
000000000000000000000100000000
000000000000000000000010000000
000000000000000000000000010000
000000000000000000000000000100
----------------------------------------
Anchor: 000000000000000000000000000100
Masks:
000000000000000100000000000000
000000000000000000010000000000
000000000000000000000100000000
000000000000000000000010000000
000000000000000000000001000000
000000000000000000000000001000
000000000000000000000000000010
----------------------------------------
Anchor: 000000000000000000000000000010
Masks:
000000000010000000000000000000
000000000000000010000000000000
000000000000000000000010000000
000000000000000000000001000000
000000000000000000000000100000
000000000000000000000000000100
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000000000000000000001
Masks:
000001000000000000000000000000
000000000001000000000000000000
000000000000000001000000000000
000000000000000000000001000000
000000000000000000000000100000
000000000000000000000000000010
----------------------------------------
In [232]:
king_masks = gen_int_masks(KING_MASKS)
print(king_masks)
print_bits(king_masks)
{536870912: [268435456, 16777216, 8388608], 268435456: [536870912, 134217728, 16777216, 8388608, 4194304], 134217728: [268435456, 67108864, 8388608, 4194304, 2097152], 67108864: [134217728, 33554432, 4194304, 2097152, 1048576], 33554432: [67108864, 2097152, 1048576], 16777216: [536870912, 268435456, 8388608, 524288, 262144], 8388608: [536870912, 268435456, 134217728, 16777216, 4194304, 524288, 262144, 131072], 4194304: [268435456, 134217728, 67108864, 8388608, 2097152, 262144, 131072, 65536], 2097152: [134217728, 67108864, 33554432, 4194304, 1048576, 131072, 65536, 32768], 1048576: [67108864, 33554432, 2097152, 65536, 32768], 524288: [16777216, 8388608, 262144, 16384, 8192], 262144: [16777216, 8388608, 4194304, 524288, 131072, 16384, 8192, 4096], 131072: [8388608, 4194304, 2097152, 262144, 65536, 8192, 4096, 2048], 65536: [4194304, 2097152, 1048576, 131072, 32768, 4096, 2048, 1024], 32768: [2097152, 1048576, 65536, 2048, 1024], 16384: [524288, 262144, 8192, 512, 256], 8192: [524288, 262144, 131072, 16384, 4096, 512, 256, 128], 4096: [262144, 131072, 65536, 8192, 2048, 256, 128, 64], 2048: [131072, 65536, 32768, 4096, 1024, 128, 64, 32], 1024: [65536, 32768, 2048, 64, 32], 512: [16384, 8192, 256, 16, 8], 256: [16384, 8192, 4096, 512, 128, 16, 8, 4], 128: [8192, 4096, 2048, 256, 64, 8, 4, 2], 64: [4096, 2048, 1024, 128, 32, 4, 2, 1], 32: [2048, 1024, 64, 2, 1], 16: [512, 256, 8], 8: [512, 256, 128, 16, 4], 4: [256, 128, 64, 8, 2], 2: [128, 64, 32, 4, 1], 1: [64, 32, 2]}
Anchor: 100000000000000000000000000000
Masks:
010000000000000000000000000000
000001000000000000000000000000
000000100000000000000000000000
----------------------------------------
Anchor: 010000000000000000000000000000
Masks:
100000000000000000000000000000
001000000000000000000000000000
000001000000000000000000000000
000000100000000000000000000000
000000010000000000000000000000
----------------------------------------
Anchor: 001000000000000000000000000000
Masks:
010000000000000000000000000000
000100000000000000000000000000
000000100000000000000000000000
000000010000000000000000000000
000000001000000000000000000000
----------------------------------------
Anchor: 000100000000000000000000000000
Masks:
001000000000000000000000000000
000010000000000000000000000000
000000010000000000000000000000
000000001000000000000000000000
000000000100000000000000000000
----------------------------------------
Anchor: 000010000000000000000000000000
Masks:
000100000000000000000000000000
000000001000000000000000000000
000000000100000000000000000000
----------------------------------------
Anchor: 000001000000000000000000000000
Masks:
100000000000000000000000000000
010000000000000000000000000000
000000100000000000000000000000
000000000010000000000000000000
000000000001000000000000000000
----------------------------------------
Anchor: 000000100000000000000000000000
Masks:
100000000000000000000000000000
010000000000000000000000000000
001000000000000000000000000000
000001000000000000000000000000
000000010000000000000000000000
000000000010000000000000000000
000000000001000000000000000000
000000000000100000000000000000
----------------------------------------
Anchor: 000000010000000000000000000000
Masks:
010000000000000000000000000000
001000000000000000000000000000
000100000000000000000000000000
000000100000000000000000000000
000000001000000000000000000000
000000000001000000000000000000
000000000000100000000000000000
000000000000010000000000000000
----------------------------------------
Anchor: 000000001000000000000000000000
Masks:
001000000000000000000000000000
000100000000000000000000000000
000010000000000000000000000000
000000010000000000000000000000
000000000100000000000000000000
000000000000100000000000000000
000000000000010000000000000000
000000000000001000000000000000
----------------------------------------
Anchor: 000000000100000000000000000000
Masks:
000100000000000000000000000000
000010000000000000000000000000
000000001000000000000000000000
000000000000010000000000000000
000000000000001000000000000000
----------------------------------------
Anchor: 000000000010000000000000000000
Masks:
000001000000000000000000000000
000000100000000000000000000000
000000000001000000000000000000
000000000000000100000000000000
000000000000000010000000000000
----------------------------------------
Anchor: 000000000001000000000000000000
Masks:
000001000000000000000000000000
000000100000000000000000000000
000000010000000000000000000000
000000000010000000000000000000
000000000000100000000000000000
000000000000000100000000000000
000000000000000010000000000000
000000000000000001000000000000
----------------------------------------
Anchor: 000000000000100000000000000000
Masks:
000000100000000000000000000000
000000010000000000000000000000
000000001000000000000000000000
000000000001000000000000000000
000000000000010000000000000000
000000000000000010000000000000
000000000000000001000000000000
000000000000000000100000000000
----------------------------------------
Anchor: 000000000000010000000000000000
Masks:
000000010000000000000000000000
000000001000000000000000000000
000000000100000000000000000000
000000000000100000000000000000
000000000000001000000000000000
000000000000000001000000000000
000000000000000000100000000000
000000000000000000010000000000
----------------------------------------
Anchor: 000000000000001000000000000000
Masks:
000000001000000000000000000000
000000000100000000000000000000
000000000000010000000000000000
000000000000000000100000000000
000000000000000000010000000000
----------------------------------------
Anchor: 000000000000000100000000000000
Masks:
000000000010000000000000000000
000000000001000000000000000000
000000000000000010000000000000
000000000000000000001000000000
000000000000000000000100000000
----------------------------------------
Anchor: 000000000000000010000000000000
Masks:
000000000010000000000000000000
000000000001000000000000000000
000000000000100000000000000000
000000000000000100000000000000
000000000000000001000000000000
000000000000000000001000000000
000000000000000000000100000000
000000000000000000000010000000
----------------------------------------
Anchor: 000000000000000001000000000000
Masks:
000000000001000000000000000000
000000000000100000000000000000
000000000000010000000000000000
000000000000000010000000000000
000000000000000000100000000000
000000000000000000000100000000
000000000000000000000010000000
000000000000000000000001000000
----------------------------------------
Anchor: 000000000000000000100000000000
Masks:
000000000000100000000000000000
000000000000010000000000000000
000000000000001000000000000000
000000000000000001000000000000
000000000000000000010000000000
000000000000000000000010000000
000000000000000000000001000000
000000000000000000000000100000
----------------------------------------
Anchor: 000000000000000000010000000000
Masks:
000000000000010000000000000000
000000000000001000000000000000
000000000000000000100000000000
000000000000000000000001000000
000000000000000000000000100000
----------------------------------------
Anchor: 000000000000000000001000000000
Masks:
000000000000000100000000000000
000000000000000010000000000000
000000000000000000000100000000
000000000000000000000000010000
000000000000000000000000001000
----------------------------------------
Anchor: 000000000000000000000100000000
Masks:
000000000000000100000000000000
000000000000000010000000000000
000000000000000001000000000000
000000000000000000001000000000
000000000000000000000010000000
000000000000000000000000010000
000000000000000000000000001000
000000000000000000000000000100
----------------------------------------
Anchor: 000000000000000000000010000000
Masks:
000000000000000010000000000000
000000000000000001000000000000
000000000000000000100000000000
000000000000000000000100000000
000000000000000000000001000000
000000000000000000000000001000
000000000000000000000000000100
000000000000000000000000000010
----------------------------------------
Anchor: 000000000000000000000001000000
Masks:
000000000000000001000000000000
000000000000000000100000000000
000000000000000000010000000000
000000000000000000000010000000
000000000000000000000000100000
000000000000000000000000000100
000000000000000000000000000010
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000000000000000100000
Masks:
000000000000000000100000000000
000000000000000000010000000000
000000000000000000000001000000
000000000000000000000000000010
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000000000000000010000
Masks:
000000000000000000001000000000
000000000000000000000100000000
000000000000000000000000001000
----------------------------------------
Anchor: 000000000000000000000000001000
Masks:
000000000000000000001000000000
000000000000000000000100000000
000000000000000000000010000000
000000000000000000000000010000
000000000000000000000000000100
----------------------------------------
Anchor: 000000000000000000000000000100
Masks:
000000000000000000000100000000
000000000000000000000010000000
000000000000000000000001000000
000000000000000000000000001000
000000000000000000000000000010
----------------------------------------
Anchor: 000000000000000000000000000010
Masks:
000000000000000000000010000000
000000000000000000000001000000
000000000000000000000000100000
000000000000000000000000000100
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000000000000000000001
Masks:
000000000000000000000001000000
000000000000000000000000100000
000000000000000000000000000010
----------------------------------------
In [233]:
def gen_complete_masks(cpp_var_name, move_masks):
result = 'static std::unordered_map<unsigned int, unsigned int> {} = {{\n'.format(cpp_var_name)
ppromo = (1 << 30)
if 'pawn' in cpp_var_name:
for r, row in enumerate(QUEEN_MASKS):
for c, mask in enumerate(row):
result += ' {{{}, {}}},\n'.format((1 << (29 - (5 * r + c))) | ppromo, eval('0b{}'.format(''.join([str(b) for b in mask.ravel()]))))
for r, row in enumerate(masks):
for c, mask in enumerate(row):
result += ' {{{}, {}}},\n'.format((1 << (29 - (5 * r + c))), eval('0b{}'.format(''.join([str(b) for b in mask.ravel()]))))
result += '};\n\n'
return result
In [234]:
print(gen_complete_masks('white_pawn_masks', W_PAWN_ATTACK_MASKS))
static std::unordered_map<unsigned int, unsigned int> white_pawn_masks = {
{1610612736, 1066027568},
{1342177280, 1069884680},
{1207959552, 1055559812},
{1140850688, 1047873602},
{1107296256, 1043506721},
{1090519040, 838619729},
{1082130432, 972957992},
{1077936128, 502748292},
{1075838976, 267627074},
{1074790400, 133272881},
{1074266112, 697295506},
{1074003968, 365949257},
{1073872896, 720353956},
{1073807360, 343907666},
{1073774592, 171936937},
{1073758208, 625770260},
{1073750016, 313425802},
{1073745920, 156728789},
{1073743872, 614726890},
{1073742848, 307362917},
{1073742336, 589980664},
{1073742080, 278230012},
{1073741952, 139115502},
{1073741888, 86319079},
{1073741856, 580030435},
{1073741840, 555307807},
{1073741832, 277130143},
{1073741828, 138565087},
{1073741826, 69806335},
{1073741825, 51680383},
{536870912, 536870912},
{268435456, 268435456},
{134217728, 134217728},
{67108864, 67108864},
{33554432, 33554432},
{16777216, 553648128},
{8388608, 276824064},
{4194304, 138412032},
{2097152, 69206016},
{1048576, 34603008},
{524288, 17301504},
{262144, 8650752},
{131072, 4325376},
{65536, 2162688},
{32768, 1081344},
{16384, 540672},
{8192, 270336},
{4096, 135168},
{2048, 67584},
{1024, 33792},
{512, 16896},
{256, 8448},
{128, 4224},
{64, 2112},
{32, 1056},
{16, 528},
{8, 264},
{4, 132},
{2, 66},
{1, 33},
};
In [235]:
queen_masks = gen_int_masks(QUEEN_MASKS)
print(queen_masks)
print_bits(queen_masks)
{536870912: [268435456, 134217728, 67108864, 33554432, 16777216, 8388608, 524288, 131072, 16384, 2048, 512, 32, 16], 268435456: [536870912, 134217728, 67108864, 33554432, 16777216, 8388608, 4194304, 262144, 65536, 8192, 1024, 256, 8], 134217728: [536870912, 268435456, 67108864, 33554432, 8388608, 4194304, 2097152, 524288, 131072, 32768, 4096, 128, 4], 67108864: [536870912, 268435456, 134217728, 33554432, 4194304, 2097152, 1048576, 262144, 65536, 16384, 2048, 64, 2], 33554432: [536870912, 268435456, 134217728, 67108864, 2097152, 1048576, 131072, 32768, 8192, 1024, 512, 32, 1], 16777216: [536870912, 268435456, 8388608, 4194304, 2097152, 1048576, 524288, 262144, 16384, 4096, 512, 64, 16, 1], 8388608: [536870912, 268435456, 134217728, 16777216, 4194304, 2097152, 1048576, 524288, 262144, 131072, 8192, 2048, 256, 32, 8], 4194304: [268435456, 134217728, 67108864, 16777216, 8388608, 2097152, 1048576, 262144, 131072, 65536, 16384, 4096, 1024, 128, 4], 2097152: [134217728, 67108864, 33554432, 16777216, 8388608, 4194304, 1048576, 131072, 65536, 32768, 8192, 2048, 512, 64, 2], 1048576: [67108864, 33554432, 16777216, 8388608, 4194304, 2097152, 65536, 32768, 4096, 1024, 256, 32, 16, 1], 524288: [536870912, 134217728, 16777216, 8388608, 262144, 131072, 65536, 32768, 16384, 8192, 512, 128, 16, 2], 262144: [268435456, 67108864, 16777216, 8388608, 4194304, 524288, 131072, 65536, 32768, 16384, 8192, 4096, 256, 64, 8, 1], 131072: [536870912, 134217728, 33554432, 8388608, 4194304, 2097152, 524288, 262144, 65536, 32768, 8192, 4096, 2048, 512, 128, 32, 4], 65536: [268435456, 67108864, 4194304, 2097152, 1048576, 524288, 262144, 131072, 32768, 4096, 2048, 1024, 256, 64, 16, 2], 32768: [134217728, 33554432, 2097152, 1048576, 524288, 262144, 131072, 65536, 2048, 1024, 128, 32, 8, 1], 16384: [536870912, 67108864, 16777216, 4194304, 524288, 262144, 8192, 4096, 2048, 1024, 512, 256, 16, 4], 8192: [268435456, 33554432, 8388608, 2097152, 524288, 262144, 131072, 16384, 4096, 2048, 1024, 512, 256, 128, 8, 2], 4096: [134217728, 16777216, 4194304, 1048576, 262144, 131072, 65536, 16384, 8192, 2048, 1024, 256, 128, 64, 16, 4, 1], 2048: [536870912, 67108864, 8388608, 2097152, 131072, 65536, 32768, 16384, 8192, 4096, 1024, 128, 64, 32, 8, 2], 1024: [268435456, 33554432, 4194304, 1048576, 65536, 32768, 16384, 8192, 4096, 2048, 64, 32, 4, 1], 512: [536870912, 33554432, 16777216, 2097152, 524288, 131072, 16384, 8192, 256, 128, 64, 32, 16, 8], 256: [268435456, 8388608, 1048576, 262144, 65536, 16384, 8192, 4096, 512, 128, 64, 32, 16, 8, 4], 128: [134217728, 4194304, 524288, 131072, 32768, 8192, 4096, 2048, 512, 256, 64, 32, 8, 4, 2], 64: [67108864, 16777216, 2097152, 262144, 65536, 4096, 2048, 1024, 512, 256, 128, 32, 4, 2, 1], 32: [536870912, 33554432, 8388608, 1048576, 131072, 32768, 2048, 1024, 512, 256, 128, 64, 2, 1], 16: [536870912, 16777216, 1048576, 524288, 65536, 16384, 4096, 512, 256, 8, 4, 2, 1], 8: [268435456, 8388608, 262144, 32768, 8192, 2048, 512, 256, 128, 16, 4, 2, 1], 4: [134217728, 4194304, 131072, 16384, 4096, 1024, 256, 128, 64, 16, 8, 2, 1], 2: [67108864, 2097152, 524288, 65536, 8192, 2048, 128, 64, 32, 16, 8, 4, 1], 1: [33554432, 16777216, 1048576, 262144, 32768, 4096, 1024, 64, 32, 16, 8, 4, 2]}
Anchor: 100000000000000000000000000000
Masks:
010000000000000000000000000000
001000000000000000000000000000
000100000000000000000000000000
000010000000000000000000000000
000001000000000000000000000000
000000100000000000000000000000
000000000010000000000000000000
000000000000100000000000000000
000000000000000100000000000000
000000000000000000100000000000
000000000000000000001000000000
000000000000000000000000100000
000000000000000000000000010000
----------------------------------------
Anchor: 010000000000000000000000000000
Masks:
100000000000000000000000000000
001000000000000000000000000000
000100000000000000000000000000
000010000000000000000000000000
000001000000000000000000000000
000000100000000000000000000000
000000010000000000000000000000
000000000001000000000000000000
000000000000010000000000000000
000000000000000010000000000000
000000000000000000010000000000
000000000000000000000100000000
000000000000000000000000001000
----------------------------------------
Anchor: 001000000000000000000000000000
Masks:
100000000000000000000000000000
010000000000000000000000000000
000100000000000000000000000000
000010000000000000000000000000
000000100000000000000000000000
000000010000000000000000000000
000000001000000000000000000000
000000000010000000000000000000
000000000000100000000000000000
000000000000001000000000000000
000000000000000001000000000000
000000000000000000000010000000
000000000000000000000000000100
----------------------------------------
Anchor: 000100000000000000000000000000
Masks:
100000000000000000000000000000
010000000000000000000000000000
001000000000000000000000000000
000010000000000000000000000000
000000010000000000000000000000
000000001000000000000000000000
000000000100000000000000000000
000000000001000000000000000000
000000000000010000000000000000
000000000000000100000000000000
000000000000000000100000000000
000000000000000000000001000000
000000000000000000000000000010
----------------------------------------
Anchor: 000010000000000000000000000000
Masks:
100000000000000000000000000000
010000000000000000000000000000
001000000000000000000000000000
000100000000000000000000000000
000000001000000000000000000000
000000000100000000000000000000
000000000000100000000000000000
000000000000001000000000000000
000000000000000010000000000000
000000000000000000010000000000
000000000000000000001000000000
000000000000000000000000100000
000000000000000000000000000001
----------------------------------------
Anchor: 000001000000000000000000000000
Masks:
100000000000000000000000000000
010000000000000000000000000000
000000100000000000000000000000
000000010000000000000000000000
000000001000000000000000000000
000000000100000000000000000000
000000000010000000000000000000
000000000001000000000000000000
000000000000000100000000000000
000000000000000001000000000000
000000000000000000001000000000
000000000000000000000001000000
000000000000000000000000010000
000000000000000000000000000001
----------------------------------------
Anchor: 000000100000000000000000000000
Masks:
100000000000000000000000000000
010000000000000000000000000000
001000000000000000000000000000
000001000000000000000000000000
000000010000000000000000000000
000000001000000000000000000000
000000000100000000000000000000
000000000010000000000000000000
000000000001000000000000000000
000000000000100000000000000000
000000000000000010000000000000
000000000000000000100000000000
000000000000000000000100000000
000000000000000000000000100000
000000000000000000000000001000
----------------------------------------
Anchor: 000000010000000000000000000000
Masks:
010000000000000000000000000000
001000000000000000000000000000
000100000000000000000000000000
000001000000000000000000000000
000000100000000000000000000000
000000001000000000000000000000
000000000100000000000000000000
000000000001000000000000000000
000000000000100000000000000000
000000000000010000000000000000
000000000000000100000000000000
000000000000000001000000000000
000000000000000000010000000000
000000000000000000000010000000
000000000000000000000000000100
----------------------------------------
Anchor: 000000001000000000000000000000
Masks:
001000000000000000000000000000
000100000000000000000000000000
000010000000000000000000000000
000001000000000000000000000000
000000100000000000000000000000
000000010000000000000000000000
000000000100000000000000000000
000000000000100000000000000000
000000000000010000000000000000
000000000000001000000000000000
000000000000000010000000000000
000000000000000000100000000000
000000000000000000001000000000
000000000000000000000001000000
000000000000000000000000000010
----------------------------------------
Anchor: 000000000100000000000000000000
Masks:
000100000000000000000000000000
000010000000000000000000000000
000001000000000000000000000000
000000100000000000000000000000
000000010000000000000000000000
000000001000000000000000000000
000000000000010000000000000000
000000000000001000000000000000
000000000000000001000000000000
000000000000000000010000000000
000000000000000000000100000000
000000000000000000000000100000
000000000000000000000000010000
000000000000000000000000000001
----------------------------------------
Anchor: 000000000010000000000000000000
Masks:
100000000000000000000000000000
001000000000000000000000000000
000001000000000000000000000000
000000100000000000000000000000
000000000001000000000000000000
000000000000100000000000000000
000000000000010000000000000000
000000000000001000000000000000
000000000000000100000000000000
000000000000000010000000000000
000000000000000000001000000000
000000000000000000000010000000
000000000000000000000000010000
000000000000000000000000000010
----------------------------------------
Anchor: 000000000001000000000000000000
Masks:
010000000000000000000000000000
000100000000000000000000000000
000001000000000000000000000000
000000100000000000000000000000
000000010000000000000000000000
000000000010000000000000000000
000000000000100000000000000000
000000000000010000000000000000
000000000000001000000000000000
000000000000000100000000000000
000000000000000010000000000000
000000000000000001000000000000
000000000000000000000100000000
000000000000000000000001000000
000000000000000000000000001000
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000100000000000000000
Masks:
100000000000000000000000000000
001000000000000000000000000000
000010000000000000000000000000
000000100000000000000000000000
000000010000000000000000000000
000000001000000000000000000000
000000000010000000000000000000
000000000001000000000000000000
000000000000010000000000000000
000000000000001000000000000000
000000000000000010000000000000
000000000000000001000000000000
000000000000000000100000000000
000000000000000000001000000000
000000000000000000000010000000
000000000000000000000000100000
000000000000000000000000000100
----------------------------------------
Anchor: 000000000000010000000000000000
Masks:
010000000000000000000000000000
000100000000000000000000000000
000000010000000000000000000000
000000001000000000000000000000
000000000100000000000000000000
000000000010000000000000000000
000000000001000000000000000000
000000000000100000000000000000
000000000000001000000000000000
000000000000000001000000000000
000000000000000000100000000000
000000000000000000010000000000
000000000000000000000100000000
000000000000000000000001000000
000000000000000000000000010000
000000000000000000000000000010
----------------------------------------
Anchor: 000000000000001000000000000000
Masks:
001000000000000000000000000000
000010000000000000000000000000
000000001000000000000000000000
000000000100000000000000000000
000000000010000000000000000000
000000000001000000000000000000
000000000000100000000000000000
000000000000010000000000000000
000000000000000000100000000000
000000000000000000010000000000
000000000000000000000010000000
000000000000000000000000100000
000000000000000000000000001000
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000000100000000000000
Masks:
100000000000000000000000000000
000100000000000000000000000000
000001000000000000000000000000
000000010000000000000000000000
000000000010000000000000000000
000000000001000000000000000000
000000000000000010000000000000
000000000000000001000000000000
000000000000000000100000000000
000000000000000000010000000000
000000000000000000001000000000
000000000000000000000100000000
000000000000000000000000010000
000000000000000000000000000100
----------------------------------------
Anchor: 000000000000000010000000000000
Masks:
010000000000000000000000000000
000010000000000000000000000000
000000100000000000000000000000
000000001000000000000000000000
000000000010000000000000000000
000000000001000000000000000000
000000000000100000000000000000
000000000000000100000000000000
000000000000000001000000000000
000000000000000000100000000000
000000000000000000010000000000
000000000000000000001000000000
000000000000000000000100000000
000000000000000000000010000000
000000000000000000000000001000
000000000000000000000000000010
----------------------------------------
Anchor: 000000000000000001000000000000
Masks:
001000000000000000000000000000
000001000000000000000000000000
000000010000000000000000000000
000000000100000000000000000000
000000000001000000000000000000
000000000000100000000000000000
000000000000010000000000000000
000000000000000100000000000000
000000000000000010000000000000
000000000000000000100000000000
000000000000000000010000000000
000000000000000000000100000000
000000000000000000000010000000
000000000000000000000001000000
000000000000000000000000010000
000000000000000000000000000100
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000000000100000000000
Masks:
100000000000000000000000000000
000100000000000000000000000000
000000100000000000000000000000
000000001000000000000000000000
000000000000100000000000000000
000000000000010000000000000000
000000000000001000000000000000
000000000000000100000000000000
000000000000000010000000000000
000000000000000001000000000000
000000000000000000010000000000
000000000000000000000010000000
000000000000000000000001000000
000000000000000000000000100000
000000000000000000000000001000
000000000000000000000000000010
----------------------------------------
Anchor: 000000000000000000010000000000
Masks:
010000000000000000000000000000
000010000000000000000000000000
000000010000000000000000000000
000000000100000000000000000000
000000000000010000000000000000
000000000000001000000000000000
000000000000000100000000000000
000000000000000010000000000000
000000000000000001000000000000
000000000000000000100000000000
000000000000000000000001000000
000000000000000000000000100000
000000000000000000000000000100
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000000000001000000000
Masks:
100000000000000000000000000000
000010000000000000000000000000
000001000000000000000000000000
000000001000000000000000000000
000000000010000000000000000000
000000000000100000000000000000
000000000000000100000000000000
000000000000000010000000000000
000000000000000000000100000000
000000000000000000000010000000
000000000000000000000001000000
000000000000000000000000100000
000000000000000000000000010000
000000000000000000000000001000
----------------------------------------
Anchor: 000000000000000000000100000000
Masks:
010000000000000000000000000000
000000100000000000000000000000
000000000100000000000000000000
000000000001000000000000000000
000000000000010000000000000000
000000000000000100000000000000
000000000000000010000000000000
000000000000000001000000000000
000000000000000000001000000000
000000000000000000000010000000
000000000000000000000001000000
000000000000000000000000100000
000000000000000000000000010000
000000000000000000000000001000
000000000000000000000000000100
----------------------------------------
Anchor: 000000000000000000000010000000
Masks:
001000000000000000000000000000
000000010000000000000000000000
000000000010000000000000000000
000000000000100000000000000000
000000000000001000000000000000
000000000000000010000000000000
000000000000000001000000000000
000000000000000000100000000000
000000000000000000001000000000
000000000000000000000100000000
000000000000000000000001000000
000000000000000000000000100000
000000000000000000000000001000
000000000000000000000000000100
000000000000000000000000000010
----------------------------------------
Anchor: 000000000000000000000001000000
Masks:
000100000000000000000000000000
000001000000000000000000000000
000000001000000000000000000000
000000000001000000000000000000
000000000000010000000000000000
000000000000000001000000000000
000000000000000000100000000000
000000000000000000010000000000
000000000000000000001000000000
000000000000000000000100000000
000000000000000000000010000000
000000000000000000000000100000
000000000000000000000000000100
000000000000000000000000000010
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000000000000000100000
Masks:
100000000000000000000000000000
000010000000000000000000000000
000000100000000000000000000000
000000000100000000000000000000
000000000000100000000000000000
000000000000001000000000000000
000000000000000000100000000000
000000000000000000010000000000
000000000000000000001000000000
000000000000000000000100000000
000000000000000000000010000000
000000000000000000000001000000
000000000000000000000000000010
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000000000000000010000
Masks:
100000000000000000000000000000
000001000000000000000000000000
000000000100000000000000000000
000000000010000000000000000000
000000000000010000000000000000
000000000000000100000000000000
000000000000000001000000000000
000000000000000000001000000000
000000000000000000000100000000
000000000000000000000000001000
000000000000000000000000000100
000000000000000000000000000010
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000000000000000001000
Masks:
010000000000000000000000000000
000000100000000000000000000000
000000000001000000000000000000
000000000000001000000000000000
000000000000000010000000000000
000000000000000000100000000000
000000000000000000001000000000
000000000000000000000100000000
000000000000000000000010000000
000000000000000000000000010000
000000000000000000000000000100
000000000000000000000000000010
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000000000000000000100
Masks:
001000000000000000000000000000
000000010000000000000000000000
000000000000100000000000000000
000000000000000100000000000000
000000000000000001000000000000
000000000000000000010000000000
000000000000000000000100000000
000000000000000000000010000000
000000000000000000000001000000
000000000000000000000000010000
000000000000000000000000001000
000000000000000000000000000010
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000000000000000000010
Masks:
000100000000000000000000000000
000000001000000000000000000000
000000000010000000000000000000
000000000000010000000000000000
000000000000000010000000000000
000000000000000000100000000000
000000000000000000000010000000
000000000000000000000001000000
000000000000000000000000100000
000000000000000000000000010000
000000000000000000000000001000
000000000000000000000000000100
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000000000000000000001
Masks:
000010000000000000000000000000
000001000000000000000000000000
000000000100000000000000000000
000000000001000000000000000000
000000000000001000000000000000
000000000000000001000000000000
000000000000000000010000000000
000000000000000000000001000000
000000000000000000000000100000
000000000000000000000000010000
000000000000000000000000001000
000000000000000000000000000100
000000000000000000000000000010
----------------------------------------
In [236]:
pawn_promotion_masks = {k | (1 << 30): v for k, v in queen_masks.items()}
pawn_promotion_masks
Out[236]:
{1073741825: [33554432,
16777216,
1048576,
262144,
32768,
4096,
1024,
64,
32,
16,
8,
4,
2],
1073741826: [67108864,
2097152,
524288,
65536,
8192,
2048,
128,
64,
32,
16,
8,
4,
1],
1073741828: [134217728,
4194304,
131072,
16384,
4096,
1024,
256,
128,
64,
16,
8,
2,
1],
1073741832: [268435456,
8388608,
262144,
32768,
8192,
2048,
512,
256,
128,
16,
4,
2,
1],
1073741840: [536870912,
16777216,
1048576,
524288,
65536,
16384,
4096,
512,
256,
8,
4,
2,
1],
1073741856: [536870912,
33554432,
8388608,
1048576,
131072,
32768,
2048,
1024,
512,
256,
128,
64,
2,
1],
1073741888: [67108864,
16777216,
2097152,
262144,
65536,
4096,
2048,
1024,
512,
256,
128,
32,
4,
2,
1],
1073741952: [134217728,
4194304,
524288,
131072,
32768,
8192,
4096,
2048,
512,
256,
64,
32,
8,
4,
2],
1073742080: [268435456,
8388608,
1048576,
262144,
65536,
16384,
8192,
4096,
512,
128,
64,
32,
16,
8,
4],
1073742336: [536870912,
33554432,
16777216,
2097152,
524288,
131072,
16384,
8192,
256,
128,
64,
32,
16,
8],
1073742848: [268435456,
33554432,
4194304,
1048576,
65536,
32768,
16384,
8192,
4096,
2048,
64,
32,
4,
1],
1073743872: [536870912,
67108864,
8388608,
2097152,
131072,
65536,
32768,
16384,
8192,
4096,
1024,
128,
64,
32,
8,
2],
1073745920: [134217728,
16777216,
4194304,
1048576,
262144,
131072,
65536,
16384,
8192,
2048,
1024,
256,
128,
64,
16,
4,
1],
1073750016: [268435456,
33554432,
8388608,
2097152,
524288,
262144,
131072,
16384,
4096,
2048,
1024,
512,
256,
128,
8,
2],
1073758208: [536870912,
67108864,
16777216,
4194304,
524288,
262144,
8192,
4096,
2048,
1024,
512,
256,
16,
4],
1073774592: [134217728,
33554432,
2097152,
1048576,
524288,
262144,
131072,
65536,
2048,
1024,
128,
32,
8,
1],
1073807360: [268435456,
67108864,
4194304,
2097152,
1048576,
524288,
262144,
131072,
32768,
4096,
2048,
1024,
256,
64,
16,
2],
1073872896: [536870912,
134217728,
33554432,
8388608,
4194304,
2097152,
524288,
262144,
65536,
32768,
8192,
4096,
2048,
512,
128,
32,
4],
1074003968: [268435456,
67108864,
16777216,
8388608,
4194304,
524288,
131072,
65536,
32768,
16384,
8192,
4096,
256,
64,
8,
1],
1074266112: [536870912,
134217728,
16777216,
8388608,
262144,
131072,
65536,
32768,
16384,
8192,
512,
128,
16,
2],
1074790400: [67108864,
33554432,
16777216,
8388608,
4194304,
2097152,
65536,
32768,
4096,
1024,
256,
32,
16,
1],
1075838976: [134217728,
67108864,
33554432,
16777216,
8388608,
4194304,
1048576,
131072,
65536,
32768,
8192,
2048,
512,
64,
2],
1077936128: [268435456,
134217728,
67108864,
16777216,
8388608,
2097152,
1048576,
262144,
131072,
65536,
16384,
4096,
1024,
128,
4],
1082130432: [536870912,
268435456,
134217728,
16777216,
4194304,
2097152,
1048576,
524288,
262144,
131072,
8192,
2048,
256,
32,
8],
1090519040: [536870912,
268435456,
8388608,
4194304,
2097152,
1048576,
524288,
262144,
16384,
4096,
512,
64,
16,
1],
1107296256: [536870912,
268435456,
134217728,
67108864,
2097152,
1048576,
131072,
32768,
8192,
1024,
512,
32,
1],
1140850688: [536870912,
268435456,
134217728,
33554432,
4194304,
2097152,
1048576,
262144,
65536,
16384,
2048,
64,
2],
1207959552: [536870912,
268435456,
67108864,
33554432,
8388608,
4194304,
2097152,
524288,
131072,
32768,
4096,
128,
4],
1342177280: [536870912,
134217728,
67108864,
33554432,
16777216,
8388608,
4194304,
262144,
65536,
8192,
1024,
256,
8],
1610612736: [268435456,
134217728,
67108864,
33554432,
16777216,
8388608,
524288,
131072,
16384,
2048,
512,
32,
16]}
In [237]:
black_pawn_attack_masks = {**pawn_promotion_masks, **b_pa_masks}
black_pawn_attack_masks
Out[237]:
{1: [],
2: [],
4: [],
8: [],
16: [],
32: [2],
64: [4, 1],
128: [8, 2],
256: [16, 4],
512: [8],
1024: [64],
2048: [128, 32],
4096: [256, 64],
8192: [512, 128],
16384: [256],
32768: [2048],
65536: [4096, 1024],
131072: [8192, 2048],
262144: [16384, 4096],
524288: [8192],
1048576: [65536],
2097152: [131072, 32768],
4194304: [262144, 65536],
8388608: [524288, 131072],
16777216: [262144],
33554432: [2097152],
67108864: [4194304, 1048576],
134217728: [8388608, 2097152],
268435456: [16777216, 4194304],
536870912: [8388608],
1073741825: [33554432,
16777216,
1048576,
262144,
32768,
4096,
1024,
64,
32,
16,
8,
4,
2],
1073741826: [67108864,
2097152,
524288,
65536,
8192,
2048,
128,
64,
32,
16,
8,
4,
1],
1073741828: [134217728,
4194304,
131072,
16384,
4096,
1024,
256,
128,
64,
16,
8,
2,
1],
1073741832: [268435456,
8388608,
262144,
32768,
8192,
2048,
512,
256,
128,
16,
4,
2,
1],
1073741840: [536870912,
16777216,
1048576,
524288,
65536,
16384,
4096,
512,
256,
8,
4,
2,
1],
1073741856: [536870912,
33554432,
8388608,
1048576,
131072,
32768,
2048,
1024,
512,
256,
128,
64,
2,
1],
1073741888: [67108864,
16777216,
2097152,
262144,
65536,
4096,
2048,
1024,
512,
256,
128,
32,
4,
2,
1],
1073741952: [134217728,
4194304,
524288,
131072,
32768,
8192,
4096,
2048,
512,
256,
64,
32,
8,
4,
2],
1073742080: [268435456,
8388608,
1048576,
262144,
65536,
16384,
8192,
4096,
512,
128,
64,
32,
16,
8,
4],
1073742336: [536870912,
33554432,
16777216,
2097152,
524288,
131072,
16384,
8192,
256,
128,
64,
32,
16,
8],
1073742848: [268435456,
33554432,
4194304,
1048576,
65536,
32768,
16384,
8192,
4096,
2048,
64,
32,
4,
1],
1073743872: [536870912,
67108864,
8388608,
2097152,
131072,
65536,
32768,
16384,
8192,
4096,
1024,
128,
64,
32,
8,
2],
1073745920: [134217728,
16777216,
4194304,
1048576,
262144,
131072,
65536,
16384,
8192,
2048,
1024,
256,
128,
64,
16,
4,
1],
1073750016: [268435456,
33554432,
8388608,
2097152,
524288,
262144,
131072,
16384,
4096,
2048,
1024,
512,
256,
128,
8,
2],
1073758208: [536870912,
67108864,
16777216,
4194304,
524288,
262144,
8192,
4096,
2048,
1024,
512,
256,
16,
4],
1073774592: [134217728,
33554432,
2097152,
1048576,
524288,
262144,
131072,
65536,
2048,
1024,
128,
32,
8,
1],
1073807360: [268435456,
67108864,
4194304,
2097152,
1048576,
524288,
262144,
131072,
32768,
4096,
2048,
1024,
256,
64,
16,
2],
1073872896: [536870912,
134217728,
33554432,
8388608,
4194304,
2097152,
524288,
262144,
65536,
32768,
8192,
4096,
2048,
512,
128,
32,
4],
1074003968: [268435456,
67108864,
16777216,
8388608,
4194304,
524288,
131072,
65536,
32768,
16384,
8192,
4096,
256,
64,
8,
1],
1074266112: [536870912,
134217728,
16777216,
8388608,
262144,
131072,
65536,
32768,
16384,
8192,
512,
128,
16,
2],
1074790400: [67108864,
33554432,
16777216,
8388608,
4194304,
2097152,
65536,
32768,
4096,
1024,
256,
32,
16,
1],
1075838976: [134217728,
67108864,
33554432,
16777216,
8388608,
4194304,
1048576,
131072,
65536,
32768,
8192,
2048,
512,
64,
2],
1077936128: [268435456,
134217728,
67108864,
16777216,
8388608,
2097152,
1048576,
262144,
131072,
65536,
16384,
4096,
1024,
128,
4],
1082130432: [536870912,
268435456,
134217728,
16777216,
4194304,
2097152,
1048576,
524288,
262144,
131072,
8192,
2048,
256,
32,
8],
1090519040: [536870912,
268435456,
8388608,
4194304,
2097152,
1048576,
524288,
262144,
16384,
4096,
512,
64,
16,
1],
1107296256: [536870912,
268435456,
134217728,
67108864,
2097152,
1048576,
131072,
32768,
8192,
1024,
512,
32,
1],
1140850688: [536870912,
268435456,
134217728,
33554432,
4194304,
2097152,
1048576,
262144,
65536,
16384,
2048,
64,
2],
1207959552: [536870912,
268435456,
67108864,
33554432,
8388608,
4194304,
2097152,
524288,
131072,
32768,
4096,
128,
4],
1342177280: [536870912,
134217728,
67108864,
33554432,
16777216,
8388608,
4194304,
262144,
65536,
8192,
1024,
256,
8],
1610612736: [268435456,
134217728,
67108864,
33554432,
16777216,
8388608,
524288,
131072,
16384,
2048,
512,
32,
16]}
In [238]:
black_pawn_move_masks = {**pawn_promotion_masks, **b_pm_masks}
black_pawn_move_masks
Out[238]:
{1: [],
2: [],
4: [],
8: [],
16: [],
32: [1],
64: [2],
128: [4],
256: [8],
512: [16],
1024: [32],
2048: [64],
4096: [128],
8192: [256],
16384: [512],
32768: [1024],
65536: [2048],
131072: [4096],
262144: [8192],
524288: [16384],
1048576: [32768],
2097152: [65536],
4194304: [131072],
8388608: [262144],
16777216: [524288],
33554432: [1048576],
67108864: [2097152],
134217728: [4194304],
268435456: [8388608],
536870912: [16777216],
1073741825: [33554432,
16777216,
1048576,
262144,
32768,
4096,
1024,
64,
32,
16,
8,
4,
2],
1073741826: [67108864,
2097152,
524288,
65536,
8192,
2048,
128,
64,
32,
16,
8,
4,
1],
1073741828: [134217728,
4194304,
131072,
16384,
4096,
1024,
256,
128,
64,
16,
8,
2,
1],
1073741832: [268435456,
8388608,
262144,
32768,
8192,
2048,
512,
256,
128,
16,
4,
2,
1],
1073741840: [536870912,
16777216,
1048576,
524288,
65536,
16384,
4096,
512,
256,
8,
4,
2,
1],
1073741856: [536870912,
33554432,
8388608,
1048576,
131072,
32768,
2048,
1024,
512,
256,
128,
64,
2,
1],
1073741888: [67108864,
16777216,
2097152,
262144,
65536,
4096,
2048,
1024,
512,
256,
128,
32,
4,
2,
1],
1073741952: [134217728,
4194304,
524288,
131072,
32768,
8192,
4096,
2048,
512,
256,
64,
32,
8,
4,
2],
1073742080: [268435456,
8388608,
1048576,
262144,
65536,
16384,
8192,
4096,
512,
128,
64,
32,
16,
8,
4],
1073742336: [536870912,
33554432,
16777216,
2097152,
524288,
131072,
16384,
8192,
256,
128,
64,
32,
16,
8],
1073742848: [268435456,
33554432,
4194304,
1048576,
65536,
32768,
16384,
8192,
4096,
2048,
64,
32,
4,
1],
1073743872: [536870912,
67108864,
8388608,
2097152,
131072,
65536,
32768,
16384,
8192,
4096,
1024,
128,
64,
32,
8,
2],
1073745920: [134217728,
16777216,
4194304,
1048576,
262144,
131072,
65536,
16384,
8192,
2048,
1024,
256,
128,
64,
16,
4,
1],
1073750016: [268435456,
33554432,
8388608,
2097152,
524288,
262144,
131072,
16384,
4096,
2048,
1024,
512,
256,
128,
8,
2],
1073758208: [536870912,
67108864,
16777216,
4194304,
524288,
262144,
8192,
4096,
2048,
1024,
512,
256,
16,
4],
1073774592: [134217728,
33554432,
2097152,
1048576,
524288,
262144,
131072,
65536,
2048,
1024,
128,
32,
8,
1],
1073807360: [268435456,
67108864,
4194304,
2097152,
1048576,
524288,
262144,
131072,
32768,
4096,
2048,
1024,
256,
64,
16,
2],
1073872896: [536870912,
134217728,
33554432,
8388608,
4194304,
2097152,
524288,
262144,
65536,
32768,
8192,
4096,
2048,
512,
128,
32,
4],
1074003968: [268435456,
67108864,
16777216,
8388608,
4194304,
524288,
131072,
65536,
32768,
16384,
8192,
4096,
256,
64,
8,
1],
1074266112: [536870912,
134217728,
16777216,
8388608,
262144,
131072,
65536,
32768,
16384,
8192,
512,
128,
16,
2],
1074790400: [67108864,
33554432,
16777216,
8388608,
4194304,
2097152,
65536,
32768,
4096,
1024,
256,
32,
16,
1],
1075838976: [134217728,
67108864,
33554432,
16777216,
8388608,
4194304,
1048576,
131072,
65536,
32768,
8192,
2048,
512,
64,
2],
1077936128: [268435456,
134217728,
67108864,
16777216,
8388608,
2097152,
1048576,
262144,
131072,
65536,
16384,
4096,
1024,
128,
4],
1082130432: [536870912,
268435456,
134217728,
16777216,
4194304,
2097152,
1048576,
524288,
262144,
131072,
8192,
2048,
256,
32,
8],
1090519040: [536870912,
268435456,
8388608,
4194304,
2097152,
1048576,
524288,
262144,
16384,
4096,
512,
64,
16,
1],
1107296256: [536870912,
268435456,
134217728,
67108864,
2097152,
1048576,
131072,
32768,
8192,
1024,
512,
32,
1],
1140850688: [536870912,
268435456,
134217728,
33554432,
4194304,
2097152,
1048576,
262144,
65536,
16384,
2048,
64,
2],
1207959552: [536870912,
268435456,
67108864,
33554432,
8388608,
4194304,
2097152,
524288,
131072,
32768,
4096,
128,
4],
1342177280: [536870912,
134217728,
67108864,
33554432,
16777216,
8388608,
4194304,
262144,
65536,
8192,
1024,
256,
8],
1610612736: [268435456,
134217728,
67108864,
33554432,
16777216,
8388608,
524288,
131072,
16384,
2048,
512,
32,
16]}
In [239]:
white_pawn_attack_masks = {**pawn_promotion_masks, ** w_pa_masks}
white_pawn_attack_masks
Out[239]:
{1: [64],
2: [128, 32],
4: [256, 64],
8: [512, 128],
16: [256],
32: [2048],
64: [4096, 1024],
128: [8192, 2048],
256: [16384, 4096],
512: [8192],
1024: [65536],
2048: [131072, 32768],
4096: [262144, 65536],
8192: [524288, 131072],
16384: [262144],
32768: [2097152],
65536: [4194304, 1048576],
131072: [8388608, 2097152],
262144: [16777216, 4194304],
524288: [8388608],
1048576: [67108864],
2097152: [134217728, 33554432],
4194304: [268435456, 67108864],
8388608: [536870912, 134217728],
16777216: [268435456],
33554432: [],
67108864: [],
134217728: [],
268435456: [],
536870912: [],
1073741825: [33554432,
16777216,
1048576,
262144,
32768,
4096,
1024,
64,
32,
16,
8,
4,
2],
1073741826: [67108864,
2097152,
524288,
65536,
8192,
2048,
128,
64,
32,
16,
8,
4,
1],
1073741828: [134217728,
4194304,
131072,
16384,
4096,
1024,
256,
128,
64,
16,
8,
2,
1],
1073741832: [268435456,
8388608,
262144,
32768,
8192,
2048,
512,
256,
128,
16,
4,
2,
1],
1073741840: [536870912,
16777216,
1048576,
524288,
65536,
16384,
4096,
512,
256,
8,
4,
2,
1],
1073741856: [536870912,
33554432,
8388608,
1048576,
131072,
32768,
2048,
1024,
512,
256,
128,
64,
2,
1],
1073741888: [67108864,
16777216,
2097152,
262144,
65536,
4096,
2048,
1024,
512,
256,
128,
32,
4,
2,
1],
1073741952: [134217728,
4194304,
524288,
131072,
32768,
8192,
4096,
2048,
512,
256,
64,
32,
8,
4,
2],
1073742080: [268435456,
8388608,
1048576,
262144,
65536,
16384,
8192,
4096,
512,
128,
64,
32,
16,
8,
4],
1073742336: [536870912,
33554432,
16777216,
2097152,
524288,
131072,
16384,
8192,
256,
128,
64,
32,
16,
8],
1073742848: [268435456,
33554432,
4194304,
1048576,
65536,
32768,
16384,
8192,
4096,
2048,
64,
32,
4,
1],
1073743872: [536870912,
67108864,
8388608,
2097152,
131072,
65536,
32768,
16384,
8192,
4096,
1024,
128,
64,
32,
8,
2],
1073745920: [134217728,
16777216,
4194304,
1048576,
262144,
131072,
65536,
16384,
8192,
2048,
1024,
256,
128,
64,
16,
4,
1],
1073750016: [268435456,
33554432,
8388608,
2097152,
524288,
262144,
131072,
16384,
4096,
2048,
1024,
512,
256,
128,
8,
2],
1073758208: [536870912,
67108864,
16777216,
4194304,
524288,
262144,
8192,
4096,
2048,
1024,
512,
256,
16,
4],
1073774592: [134217728,
33554432,
2097152,
1048576,
524288,
262144,
131072,
65536,
2048,
1024,
128,
32,
8,
1],
1073807360: [268435456,
67108864,
4194304,
2097152,
1048576,
524288,
262144,
131072,
32768,
4096,
2048,
1024,
256,
64,
16,
2],
1073872896: [536870912,
134217728,
33554432,
8388608,
4194304,
2097152,
524288,
262144,
65536,
32768,
8192,
4096,
2048,
512,
128,
32,
4],
1074003968: [268435456,
67108864,
16777216,
8388608,
4194304,
524288,
131072,
65536,
32768,
16384,
8192,
4096,
256,
64,
8,
1],
1074266112: [536870912,
134217728,
16777216,
8388608,
262144,
131072,
65536,
32768,
16384,
8192,
512,
128,
16,
2],
1074790400: [67108864,
33554432,
16777216,
8388608,
4194304,
2097152,
65536,
32768,
4096,
1024,
256,
32,
16,
1],
1075838976: [134217728,
67108864,
33554432,
16777216,
8388608,
4194304,
1048576,
131072,
65536,
32768,
8192,
2048,
512,
64,
2],
1077936128: [268435456,
134217728,
67108864,
16777216,
8388608,
2097152,
1048576,
262144,
131072,
65536,
16384,
4096,
1024,
128,
4],
1082130432: [536870912,
268435456,
134217728,
16777216,
4194304,
2097152,
1048576,
524288,
262144,
131072,
8192,
2048,
256,
32,
8],
1090519040: [536870912,
268435456,
8388608,
4194304,
2097152,
1048576,
524288,
262144,
16384,
4096,
512,
64,
16,
1],
1107296256: [536870912,
268435456,
134217728,
67108864,
2097152,
1048576,
131072,
32768,
8192,
1024,
512,
32,
1],
1140850688: [536870912,
268435456,
134217728,
33554432,
4194304,
2097152,
1048576,
262144,
65536,
16384,
2048,
64,
2],
1207959552: [536870912,
268435456,
67108864,
33554432,
8388608,
4194304,
2097152,
524288,
131072,
32768,
4096,
128,
4],
1342177280: [536870912,
134217728,
67108864,
33554432,
16777216,
8388608,
4194304,
262144,
65536,
8192,
1024,
256,
8],
1610612736: [268435456,
134217728,
67108864,
33554432,
16777216,
8388608,
524288,
131072,
16384,
2048,
512,
32,
16]}
In [240]:
white_pawn_move_masks = {**pawn_promotion_masks, **w_pm_masks}
white_pawn_move_masks
Out[240]:
{1: [32],
2: [64],
4: [128],
8: [256],
16: [512],
32: [1024],
64: [2048],
128: [4096],
256: [8192],
512: [16384],
1024: [32768],
2048: [65536],
4096: [131072],
8192: [262144],
16384: [524288],
32768: [1048576],
65536: [2097152],
131072: [4194304],
262144: [8388608],
524288: [16777216],
1048576: [33554432],
2097152: [67108864],
4194304: [134217728],
8388608: [268435456],
16777216: [536870912],
33554432: [],
67108864: [],
134217728: [],
268435456: [],
536870912: [],
1073741825: [33554432,
16777216,
1048576,
262144,
32768,
4096,
1024,
64,
32,
16,
8,
4,
2],
1073741826: [67108864,
2097152,
524288,
65536,
8192,
2048,
128,
64,
32,
16,
8,
4,
1],
1073741828: [134217728,
4194304,
131072,
16384,
4096,
1024,
256,
128,
64,
16,
8,
2,
1],
1073741832: [268435456,
8388608,
262144,
32768,
8192,
2048,
512,
256,
128,
16,
4,
2,
1],
1073741840: [536870912,
16777216,
1048576,
524288,
65536,
16384,
4096,
512,
256,
8,
4,
2,
1],
1073741856: [536870912,
33554432,
8388608,
1048576,
131072,
32768,
2048,
1024,
512,
256,
128,
64,
2,
1],
1073741888: [67108864,
16777216,
2097152,
262144,
65536,
4096,
2048,
1024,
512,
256,
128,
32,
4,
2,
1],
1073741952: [134217728,
4194304,
524288,
131072,
32768,
8192,
4096,
2048,
512,
256,
64,
32,
8,
4,
2],
1073742080: [268435456,
8388608,
1048576,
262144,
65536,
16384,
8192,
4096,
512,
128,
64,
32,
16,
8,
4],
1073742336: [536870912,
33554432,
16777216,
2097152,
524288,
131072,
16384,
8192,
256,
128,
64,
32,
16,
8],
1073742848: [268435456,
33554432,
4194304,
1048576,
65536,
32768,
16384,
8192,
4096,
2048,
64,
32,
4,
1],
1073743872: [536870912,
67108864,
8388608,
2097152,
131072,
65536,
32768,
16384,
8192,
4096,
1024,
128,
64,
32,
8,
2],
1073745920: [134217728,
16777216,
4194304,
1048576,
262144,
131072,
65536,
16384,
8192,
2048,
1024,
256,
128,
64,
16,
4,
1],
1073750016: [268435456,
33554432,
8388608,
2097152,
524288,
262144,
131072,
16384,
4096,
2048,
1024,
512,
256,
128,
8,
2],
1073758208: [536870912,
67108864,
16777216,
4194304,
524288,
262144,
8192,
4096,
2048,
1024,
512,
256,
16,
4],
1073774592: [134217728,
33554432,
2097152,
1048576,
524288,
262144,
131072,
65536,
2048,
1024,
128,
32,
8,
1],
1073807360: [268435456,
67108864,
4194304,
2097152,
1048576,
524288,
262144,
131072,
32768,
4096,
2048,
1024,
256,
64,
16,
2],
1073872896: [536870912,
134217728,
33554432,
8388608,
4194304,
2097152,
524288,
262144,
65536,
32768,
8192,
4096,
2048,
512,
128,
32,
4],
1074003968: [268435456,
67108864,
16777216,
8388608,
4194304,
524288,
131072,
65536,
32768,
16384,
8192,
4096,
256,
64,
8,
1],
1074266112: [536870912,
134217728,
16777216,
8388608,
262144,
131072,
65536,
32768,
16384,
8192,
512,
128,
16,
2],
1074790400: [67108864,
33554432,
16777216,
8388608,
4194304,
2097152,
65536,
32768,
4096,
1024,
256,
32,
16,
1],
1075838976: [134217728,
67108864,
33554432,
16777216,
8388608,
4194304,
1048576,
131072,
65536,
32768,
8192,
2048,
512,
64,
2],
1077936128: [268435456,
134217728,
67108864,
16777216,
8388608,
2097152,
1048576,
262144,
131072,
65536,
16384,
4096,
1024,
128,
4],
1082130432: [536870912,
268435456,
134217728,
16777216,
4194304,
2097152,
1048576,
524288,
262144,
131072,
8192,
2048,
256,
32,
8],
1090519040: [536870912,
268435456,
8388608,
4194304,
2097152,
1048576,
524288,
262144,
16384,
4096,
512,
64,
16,
1],
1107296256: [536870912,
268435456,
134217728,
67108864,
2097152,
1048576,
131072,
32768,
8192,
1024,
512,
32,
1],
1140850688: [536870912,
268435456,
134217728,
33554432,
4194304,
2097152,
1048576,
262144,
65536,
16384,
2048,
64,
2],
1207959552: [536870912,
268435456,
67108864,
33554432,
8388608,
4194304,
2097152,
524288,
131072,
32768,
4096,
128,
4],
1342177280: [536870912,
134217728,
67108864,
33554432,
16777216,
8388608,
4194304,
262144,
65536,
8192,
1024,
256,
8],
1610612736: [268435456,
134217728,
67108864,
33554432,
16777216,
8388608,
524288,
131072,
16384,
2048,
512,
32,
16]}
In [241]:
rook_masks = gen_int_masks(ROOK_MASKS)
print(rook_masks)
print_bits(rook_masks)
{536870912: [268435456, 134217728, 67108864, 33554432, 16777216, 524288, 16384, 512, 16], 268435456: [536870912, 134217728, 67108864, 33554432, 8388608, 262144, 8192, 256, 8], 134217728: [536870912, 268435456, 67108864, 33554432, 4194304, 131072, 4096, 128, 4], 67108864: [536870912, 268435456, 134217728, 33554432, 2097152, 65536, 2048, 64, 2], 33554432: [536870912, 268435456, 134217728, 67108864, 1048576, 32768, 1024, 32, 1], 16777216: [536870912, 8388608, 4194304, 2097152, 1048576, 524288, 16384, 512, 16], 8388608: [268435456, 16777216, 4194304, 2097152, 1048576, 262144, 8192, 256, 8], 4194304: [134217728, 16777216, 8388608, 2097152, 1048576, 131072, 4096, 128, 4], 2097152: [67108864, 16777216, 8388608, 4194304, 1048576, 65536, 2048, 64, 2], 1048576: [33554432, 16777216, 8388608, 4194304, 2097152, 32768, 1024, 32, 1], 524288: [536870912, 16777216, 262144, 131072, 65536, 32768, 16384, 512, 16], 262144: [268435456, 8388608, 524288, 131072, 65536, 32768, 8192, 256, 8], 131072: [134217728, 4194304, 524288, 262144, 65536, 32768, 4096, 128, 4], 65536: [67108864, 2097152, 524288, 262144, 131072, 32768, 2048, 64, 2], 32768: [33554432, 1048576, 524288, 262144, 131072, 65536, 1024, 32, 1], 16384: [536870912, 16777216, 524288, 8192, 4096, 2048, 1024, 512, 16], 8192: [268435456, 8388608, 262144, 16384, 4096, 2048, 1024, 256, 8], 4096: [134217728, 4194304, 131072, 16384, 8192, 2048, 1024, 128, 4], 2048: [67108864, 2097152, 65536, 16384, 8192, 4096, 1024, 64, 2], 1024: [33554432, 1048576, 32768, 16384, 8192, 4096, 2048, 32, 1], 512: [536870912, 16777216, 524288, 16384, 256, 128, 64, 32, 16], 256: [268435456, 8388608, 262144, 8192, 512, 128, 64, 32, 8], 128: [134217728, 4194304, 131072, 4096, 512, 256, 64, 32, 4], 64: [67108864, 2097152, 65536, 2048, 512, 256, 128, 32, 2], 32: [33554432, 1048576, 32768, 1024, 512, 256, 128, 64, 1], 16: [536870912, 16777216, 524288, 16384, 512, 8, 4, 2, 1], 8: [268435456, 8388608, 262144, 8192, 256, 16, 4, 2, 1], 4: [134217728, 4194304, 131072, 4096, 128, 16, 8, 2, 1], 2: [67108864, 2097152, 65536, 2048, 64, 16, 8, 4, 1], 1: [33554432, 1048576, 32768, 1024, 32, 16, 8, 4, 2]}
Anchor: 100000000000000000000000000000
Masks:
010000000000000000000000000000
001000000000000000000000000000
000100000000000000000000000000
000010000000000000000000000000
000001000000000000000000000000
000000000010000000000000000000
000000000000000100000000000000
000000000000000000001000000000
000000000000000000000000010000
----------------------------------------
Anchor: 010000000000000000000000000000
Masks:
100000000000000000000000000000
001000000000000000000000000000
000100000000000000000000000000
000010000000000000000000000000
000000100000000000000000000000
000000000001000000000000000000
000000000000000010000000000000
000000000000000000000100000000
000000000000000000000000001000
----------------------------------------
Anchor: 001000000000000000000000000000
Masks:
100000000000000000000000000000
010000000000000000000000000000
000100000000000000000000000000
000010000000000000000000000000
000000010000000000000000000000
000000000000100000000000000000
000000000000000001000000000000
000000000000000000000010000000
000000000000000000000000000100
----------------------------------------
Anchor: 000100000000000000000000000000
Masks:
100000000000000000000000000000
010000000000000000000000000000
001000000000000000000000000000
000010000000000000000000000000
000000001000000000000000000000
000000000000010000000000000000
000000000000000000100000000000
000000000000000000000001000000
000000000000000000000000000010
----------------------------------------
Anchor: 000010000000000000000000000000
Masks:
100000000000000000000000000000
010000000000000000000000000000
001000000000000000000000000000
000100000000000000000000000000
000000000100000000000000000000
000000000000001000000000000000
000000000000000000010000000000
000000000000000000000000100000
000000000000000000000000000001
----------------------------------------
Anchor: 000001000000000000000000000000
Masks:
100000000000000000000000000000
000000100000000000000000000000
000000010000000000000000000000
000000001000000000000000000000
000000000100000000000000000000
000000000010000000000000000000
000000000000000100000000000000
000000000000000000001000000000
000000000000000000000000010000
----------------------------------------
Anchor: 000000100000000000000000000000
Masks:
010000000000000000000000000000
000001000000000000000000000000
000000010000000000000000000000
000000001000000000000000000000
000000000100000000000000000000
000000000001000000000000000000
000000000000000010000000000000
000000000000000000000100000000
000000000000000000000000001000
----------------------------------------
Anchor: 000000010000000000000000000000
Masks:
001000000000000000000000000000
000001000000000000000000000000
000000100000000000000000000000
000000001000000000000000000000
000000000100000000000000000000
000000000000100000000000000000
000000000000000001000000000000
000000000000000000000010000000
000000000000000000000000000100
----------------------------------------
Anchor: 000000001000000000000000000000
Masks:
000100000000000000000000000000
000001000000000000000000000000
000000100000000000000000000000
000000010000000000000000000000
000000000100000000000000000000
000000000000010000000000000000
000000000000000000100000000000
000000000000000000000001000000
000000000000000000000000000010
----------------------------------------
Anchor: 000000000100000000000000000000
Masks:
000010000000000000000000000000
000001000000000000000000000000
000000100000000000000000000000
000000010000000000000000000000
000000001000000000000000000000
000000000000001000000000000000
000000000000000000010000000000
000000000000000000000000100000
000000000000000000000000000001
----------------------------------------
Anchor: 000000000010000000000000000000
Masks:
100000000000000000000000000000
000001000000000000000000000000
000000000001000000000000000000
000000000000100000000000000000
000000000000010000000000000000
000000000000001000000000000000
000000000000000100000000000000
000000000000000000001000000000
000000000000000000000000010000
----------------------------------------
Anchor: 000000000001000000000000000000
Masks:
010000000000000000000000000000
000000100000000000000000000000
000000000010000000000000000000
000000000000100000000000000000
000000000000010000000000000000
000000000000001000000000000000
000000000000000010000000000000
000000000000000000000100000000
000000000000000000000000001000
----------------------------------------
Anchor: 000000000000100000000000000000
Masks:
001000000000000000000000000000
000000010000000000000000000000
000000000010000000000000000000
000000000001000000000000000000
000000000000010000000000000000
000000000000001000000000000000
000000000000000001000000000000
000000000000000000000010000000
000000000000000000000000000100
----------------------------------------
Anchor: 000000000000010000000000000000
Masks:
000100000000000000000000000000
000000001000000000000000000000
000000000010000000000000000000
000000000001000000000000000000
000000000000100000000000000000
000000000000001000000000000000
000000000000000000100000000000
000000000000000000000001000000
000000000000000000000000000010
----------------------------------------
Anchor: 000000000000001000000000000000
Masks:
000010000000000000000000000000
000000000100000000000000000000
000000000010000000000000000000
000000000001000000000000000000
000000000000100000000000000000
000000000000010000000000000000
000000000000000000010000000000
000000000000000000000000100000
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000000100000000000000
Masks:
100000000000000000000000000000
000001000000000000000000000000
000000000010000000000000000000
000000000000000010000000000000
000000000000000001000000000000
000000000000000000100000000000
000000000000000000010000000000
000000000000000000001000000000
000000000000000000000000010000
----------------------------------------
Anchor: 000000000000000010000000000000
Masks:
010000000000000000000000000000
000000100000000000000000000000
000000000001000000000000000000
000000000000000100000000000000
000000000000000001000000000000
000000000000000000100000000000
000000000000000000010000000000
000000000000000000000100000000
000000000000000000000000001000
----------------------------------------
Anchor: 000000000000000001000000000000
Masks:
001000000000000000000000000000
000000010000000000000000000000
000000000000100000000000000000
000000000000000100000000000000
000000000000000010000000000000
000000000000000000100000000000
000000000000000000010000000000
000000000000000000000010000000
000000000000000000000000000100
----------------------------------------
Anchor: 000000000000000000100000000000
Masks:
000100000000000000000000000000
000000001000000000000000000000
000000000000010000000000000000
000000000000000100000000000000
000000000000000010000000000000
000000000000000001000000000000
000000000000000000010000000000
000000000000000000000001000000
000000000000000000000000000010
----------------------------------------
Anchor: 000000000000000000010000000000
Masks:
000010000000000000000000000000
000000000100000000000000000000
000000000000001000000000000000
000000000000000100000000000000
000000000000000010000000000000
000000000000000001000000000000
000000000000000000100000000000
000000000000000000000000100000
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000000000001000000000
Masks:
100000000000000000000000000000
000001000000000000000000000000
000000000010000000000000000000
000000000000000100000000000000
000000000000000000000100000000
000000000000000000000010000000
000000000000000000000001000000
000000000000000000000000100000
000000000000000000000000010000
----------------------------------------
Anchor: 000000000000000000000100000000
Masks:
010000000000000000000000000000
000000100000000000000000000000
000000000001000000000000000000
000000000000000010000000000000
000000000000000000001000000000
000000000000000000000010000000
000000000000000000000001000000
000000000000000000000000100000
000000000000000000000000001000
----------------------------------------
Anchor: 000000000000000000000010000000
Masks:
001000000000000000000000000000
000000010000000000000000000000
000000000000100000000000000000
000000000000000001000000000000
000000000000000000001000000000
000000000000000000000100000000
000000000000000000000001000000
000000000000000000000000100000
000000000000000000000000000100
----------------------------------------
Anchor: 000000000000000000000001000000
Masks:
000100000000000000000000000000
000000001000000000000000000000
000000000000010000000000000000
000000000000000000100000000000
000000000000000000001000000000
000000000000000000000100000000
000000000000000000000010000000
000000000000000000000000100000
000000000000000000000000000010
----------------------------------------
Anchor: 000000000000000000000000100000
Masks:
000010000000000000000000000000
000000000100000000000000000000
000000000000001000000000000000
000000000000000000010000000000
000000000000000000001000000000
000000000000000000000100000000
000000000000000000000010000000
000000000000000000000001000000
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000000000000000010000
Masks:
100000000000000000000000000000
000001000000000000000000000000
000000000010000000000000000000
000000000000000100000000000000
000000000000000000001000000000
000000000000000000000000001000
000000000000000000000000000100
000000000000000000000000000010
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000000000000000001000
Masks:
010000000000000000000000000000
000000100000000000000000000000
000000000001000000000000000000
000000000000000010000000000000
000000000000000000000100000000
000000000000000000000000010000
000000000000000000000000000100
000000000000000000000000000010
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000000000000000000100
Masks:
001000000000000000000000000000
000000010000000000000000000000
000000000000100000000000000000
000000000000000001000000000000
000000000000000000000010000000
000000000000000000000000010000
000000000000000000000000001000
000000000000000000000000000010
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000000000000000000010
Masks:
000100000000000000000000000000
000000001000000000000000000000
000000000000010000000000000000
000000000000000000100000000000
000000000000000000000001000000
000000000000000000000000010000
000000000000000000000000001000
000000000000000000000000000100
000000000000000000000000000001
----------------------------------------
Anchor: 000000000000000000000000000001
Masks:
000010000000000000000000000000
000000000100000000000000000000
000000000000001000000000000000
000000000000000000010000000000
000000000000000000000000100000
000000000000000000000000010000
000000000000000000000000001000
000000000000000000000000000100
000000000000000000000000000010
----------------------------------------
In [242]:
shadow_seeds = [
np.array([
[1,1,1,1,0,1,1,1,1],
[1,1,1,1,0,1,1,1,1],
[1,1,1,1,0,1,1,1,1],
[1,1,1,1,0,1,1,1,1],
[1,1,1,1,0,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1]
]),
np.array([
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,0],
[1,1,1,1,1,1,1,0,1],
[1,1,1,1,1,1,0,1,1],
[1,1,1,1,1,0,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1]
]),
np.array([
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,0,0,0,0],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1]
]),
np.array([
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,0,1,1,1],
[1,1,1,1,1,1,0,1,1],
[1,1,1,1,1,1,1,0,1],
[1,1,1,1,1,1,1,1,0],
[1,1,1,1,1,1,1,1,1]
]),
np.array([
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,0,1,1,1,1],
[1,1,1,1,0,1,1,1,1],
[1,1,1,1,0,1,1,1,1],
[1,1,1,1,0,1,1,1,1],
[1,1,1,1,0,1,1,1,1]
]),
np.array([
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,0,1,1,1,1,1],
[1,1,0,1,1,1,1,1,1],
[1,0,1,1,1,1,1,1,1],
[0,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1]
]),
np.array([
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[0,0,0,0,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1]
]),
np.array([
[1,1,1,1,1,1,1,1,1],
[0,1,1,1,1,1,1,1,1],
[1,0,1,1,1,1,1,1,1],
[1,1,0,1,1,1,1,1,1],
[1,1,1,0,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1]
])
]
direction_seeds = [np.logical_not(arr).astype(np.int) for arr in shadow_seeds]
for seed in direction_seeds:
seed[5,4] = 0
In [243]:
shadow_masks = [
np.rot90(
stride_tricks.as_strided(
seed,
shape=(6, 5, 6, 5),
strides=seed.strides + seed.strides),
k=2) for seed in shadow_seeds]
shadow_masks
Out[243]:
[array([[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]],
[[[0, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 0, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 0, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 0, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]],
[[[0, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 0, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 0, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 0, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 0],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]],
[[[0, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 0, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 0, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 0, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 0],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]],
[[[0, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 0, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 0, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 0, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 0],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]],
[[[0, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 0, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 0, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 0, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 0],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1]]]]), array([[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]],
[[[1, 0, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 0, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 0, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]],
[[[1, 1, 0, 1, 1],
[1, 0, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 0, 1],
[1, 1, 0, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 0],
[1, 1, 1, 0, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]],
[[[1, 1, 1, 0, 1],
[1, 1, 0, 1, 1],
[1, 0, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 0],
[1, 1, 1, 0, 1],
[1, 1, 0, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 0],
[1, 1, 1, 0, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]],
[[[1, 1, 1, 1, 0],
[1, 1, 1, 0, 1],
[1, 1, 0, 1, 1],
[1, 0, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 0],
[1, 1, 1, 0, 1],
[1, 1, 0, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 0],
[1, 1, 1, 0, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]],
[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 0],
[1, 1, 1, 0, 1],
[1, 1, 0, 1, 1],
[1, 0, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 0],
[1, 1, 1, 0, 1],
[1, 1, 0, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 0],
[1, 1, 1, 0, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]]]), array([[[[1, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 0, 0, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 0, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]],
[[[1, 1, 1, 1, 1],
[1, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 0, 0, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 0, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]],
[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 0, 0, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 0, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]],
[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 0, 0, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 0, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]],
[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 0, 0, 0, 0],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 0, 0, 0],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 0, 0],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]],
[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 0, 0, 0, 0]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 0, 0, 0]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 0, 0]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 0]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]]]), array([[[[1, 1, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]],
[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 1, 0]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]],
[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 1, 0, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 1, 0]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]],
[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 1, 0, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 1, 0, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 1, 0]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]],
[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 0, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 0, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 0, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 0]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]],
[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]]]), array([[[[1, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[0, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 0, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 0, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 0, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 0]]],
[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[0, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 0, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 0, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 0, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 0]]],
[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[0, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 0, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 0, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 0, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 0]]],
[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[0, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 0, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 0, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 0, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 0]]],
[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 0, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 0, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 0, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 0]]],
[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]]]), array([[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 0, 1, 1, 1],
[0, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 0, 1, 1],
[1, 0, 1, 1, 1],
[0, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 0, 1],
[1, 1, 0, 1, 1],
[1, 0, 1, 1, 1],
[0, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]],
[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 0, 1, 1, 1],
[0, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 0, 1, 1],
[1, 0, 1, 1, 1],
[0, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 0, 1],
[1, 1, 0, 1, 1],
[1, 0, 1, 1, 1],
[0, 1, 1, 1, 1]]],
[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 0, 1, 1, 1],
[0, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 0, 1, 1],
[1, 0, 1, 1, 1],
[0, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 0, 1],
[1, 1, 0, 1, 1],
[1, 0, 1, 1, 1]]],
[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 0, 1, 1, 1],
[0, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 0, 1, 1],
[1, 0, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 0, 1],
[1, 1, 0, 1, 1]]],
[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 0, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 0, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 0, 1]]],
[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]]]), array([[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[0, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[0, 0, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[0, 0, 0, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[0, 0, 0, 0, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]],
[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[0, 0, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[0, 0, 0, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[0, 0, 0, 0, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]],
[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 0, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 0, 0, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]],
[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 0, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 0, 0, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]],
[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 0, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 0, 0, 1],
[1, 1, 1, 1, 1]]],
[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 0, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 0, 0, 1]]]]), array([[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]],
[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[0, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 0, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 0, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 0, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]],
[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[0, 1, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 0, 1, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 0, 1, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]],
[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[0, 1, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 0, 1, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]],
[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[0, 1, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]],
[[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[0, 1, 1, 1, 1],
[1, 0, 1, 1, 1],
[1, 1, 0, 1, 1],
[1, 1, 1, 0, 1],
[1, 1, 1, 1, 1]]]])]
In [244]:
direction_masks = [
np.rot90(
stride_tricks.as_strided(
seed,
shape=(6, 5, 6, 5),
strides=seed.strides + seed.strides),
k=2) for seed in direction_seeds]
direction_masks
Out[244]:
[array([[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0]]]]), array([[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]]]), array([[[[0, 1, 1, 1, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 1, 1, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 1, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 1, 1, 1, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 1, 1, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 1, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 1, 1, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 1, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 1, 1, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 1, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 1, 1, 1],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 1, 1],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 1],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 1, 1, 1]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 1, 1]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 1]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]]]), array([[[[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]]]), array([[[[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]]]), array([[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 1, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]]]), array([[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[1, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[1, 1, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[1, 1, 1, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[1, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[1, 1, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[1, 1, 1, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 1, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 1, 1, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 1, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 1, 1, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 1, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 1, 1, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 1, 1, 1, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 1, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 1, 1, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 1, 1, 1, 0]]]]), array([[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]],
[[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0]]]])]
In [245]:
from collections import defaultdict
shadows = defaultdict(dict)
for d, masks in enumerate(direction_masks):
print('direction: {}'.format(d))
print('-'*100)
for r, row in enumerate(masks):
for c, d_mask in enumerate(row):
print('A: {:030b}'.format(1 << 29-(5*r+c)))
piece_to_move = 1 << 29-(5*r+c)
ppawn = (1 << 30) | piece_to_move
m = mask_to_int(d_mask)
if d == 0:
for i in range(5, 21, 5):
sh_m = m & (m << i) & ((1 << 30) - 1)
if sh_m:
blocking_piece = piece_to_move << i
pp_blocking_piece = (1 << 30) | blocking_piece
print('B: {:030b}'.format(blocking_piece))
print('S: {:030b}'.format(sh_m))
shadows[piece_to_move][blocking_piece] = sh_m
shadows[piece_to_move][pp_blocking_piece] = sh_m
shadows[ppawn][blocking_piece] = sh_m
shadows[ppawn][pp_blocking_piece] = sh_m
else:
continue
elif d == 1:
for i in range(4, 17, 4):
sh_m = m & (m << i) & ((1 << 30) - 1)
if sh_m:
blocking_piece = piece_to_move << i
pp_blocking_piece = (1 << 30) | blocking_piece
print('B: {:030b}'.format(blocking_piece))
print('S: {:030b}'.format(sh_m))
shadows[piece_to_move][blocking_piece] = sh_m
shadows[piece_to_move][pp_blocking_piece] = sh_m
shadows[ppawn][blocking_piece] = sh_m
shadows[ppawn][pp_blocking_piece] = sh_m
else:
continue
elif d == 2:
for i in range(1,5):
sh_m = m & (m >> i) & ((1 << 30) - 1)
if sh_m:
blocking_piece = piece_to_move >> i
pp_blocking_piece = (1 << 30) | blocking_piece
print('B: {:030b}'.format(blocking_piece))
print('S: {:030b}'.format(sh_m))
shadows[piece_to_move][blocking_piece] = sh_m
shadows[piece_to_move][pp_blocking_piece] = sh_m
shadows[ppawn][blocking_piece] = sh_m
shadows[ppawn][pp_blocking_piece] = sh_m
else:
continue
elif d == 3:
for i in range(6, 25, 6):
sh_m = m & (m >> i) & ((1 << 30) - 1)
if sh_m:
blocking_piece = piece_to_move >> i
pp_blocking_piece = (1 << 30) | blocking_piece
print('B: {:030b}'.format(blocking_piece))
print('S: {:030b}'.format(sh_m))
shadows[piece_to_move][blocking_piece] = sh_m
shadows[piece_to_move][pp_blocking_piece] = sh_m
shadows[ppawn][blocking_piece] = sh_m
shadows[ppawn][pp_blocking_piece] = sh_m
else:
continue
elif d == 4:
for i in range(5, 21, 5):
sh_m = m & (m >> i) & ((1 << 30) - 1)
if sh_m:
blocking_piece = piece_to_move >> i
pp_blocking_piece = (1 << 30) | blocking_piece
print('B: {:030b}'.format(blocking_piece))
print('S: {:030b}'.format(sh_m))
shadows[piece_to_move][blocking_piece] = sh_m
shadows[piece_to_move][pp_blocking_piece] = sh_m
shadows[ppawn][blocking_piece] = sh_m
shadows[ppawn][pp_blocking_piece] = sh_m
else:
continue
elif d == 5:
for i in range(4, 17, 4):
sh_m = m & (m >> i) & ((1 << 30) - 1)
if sh_m:
blocking_piece = piece_to_move >> i
pp_blocking_piece = (1 << 30) | blocking_piece
print('B: {:030b}'.format(blocking_piece))
print('S: {:030b}'.format(sh_m))
shadows[piece_to_move][blocking_piece] = sh_m
shadows[piece_to_move][pp_blocking_piece] = sh_m
shadows[ppawn][blocking_piece] = sh_m
shadows[ppawn][pp_blocking_piece] = sh_m
else:
continue
elif d == 6:
for i in range(1,5):
sh_m = m & (m << i) & ((1 << 30) - 1)
if sh_m:
blocking_piece = piece_to_move << i
pp_blocking_piece = (1 << 30) | blocking_piece
print('B: {:030b}'.format(blocking_piece))
print('S: {:030b}'.format(sh_m))
shadows[piece_to_move][blocking_piece] = sh_m
shadows[piece_to_move][pp_blocking_piece] = sh_m
shadows[ppawn][blocking_piece] = sh_m
shadows[ppawn][pp_blocking_piece] = sh_m
else:
continue
else:
for i in range(6, 25, 6):
sh_m = m & (m << i) & ((1 << 30) - 1)
if sh_m:
blocking_piece = piece_to_move << i
pp_blocking_piece = (1 << 30) | blocking_piece
print('B: {:030b}'.format(blocking_piece))
print('S: {:030b}'.format(sh_m))
shadows[piece_to_move][blocking_piece] = sh_m
shadows[piece_to_move][pp_blocking_piece] = sh_m
shadows[ppawn][blocking_piece] = sh_m
shadows[ppawn][pp_blocking_piece] = sh_m
else:
continue
direction: 0
----------------------------------------------------------------------------------------------------
A: 100000000000000000000000000000
A: 010000000000000000000000000000
A: 001000000000000000000000000000
A: 000100000000000000000000000000
A: 000010000000000000000000000000
A: 000001000000000000000000000000
A: 000000100000000000000000000000
A: 000000010000000000000000000000
A: 000000001000000000000000000000
A: 000000000100000000000000000000
A: 000000000010000000000000000000
B: 000001000000000000000000000000
S: 100000000000000000000000000000
A: 000000000001000000000000000000
B: 000000100000000000000000000000
S: 010000000000000000000000000000
A: 000000000000100000000000000000
B: 000000010000000000000000000000
S: 001000000000000000000000000000
A: 000000000000010000000000000000
B: 000000001000000000000000000000
S: 000100000000000000000000000000
A: 000000000000001000000000000000
B: 000000000100000000000000000000
S: 000010000000000000000000000000
A: 000000000000000100000000000000
B: 000000000010000000000000000000
S: 100001000000000000000000000000
B: 000001000000000000000000000000
S: 100000000000000000000000000000
A: 000000000000000010000000000000
B: 000000000001000000000000000000
S: 010000100000000000000000000000
B: 000000100000000000000000000000
S: 010000000000000000000000000000
A: 000000000000000001000000000000
B: 000000000000100000000000000000
S: 001000010000000000000000000000
B: 000000010000000000000000000000
S: 001000000000000000000000000000
A: 000000000000000000100000000000
B: 000000000000010000000000000000
S: 000100001000000000000000000000
B: 000000001000000000000000000000
S: 000100000000000000000000000000
A: 000000000000000000010000000000
B: 000000000000001000000000000000
S: 000010000100000000000000000000
B: 000000000100000000000000000000
S: 000010000000000000000000000000
A: 000000000000000000001000000000
B: 000000000000000100000000000000
S: 100001000010000000000000000000
B: 000000000010000000000000000000
S: 100001000000000000000000000000
B: 000001000000000000000000000000
S: 100000000000000000000000000000
A: 000000000000000000000100000000
B: 000000000000000010000000000000
S: 010000100001000000000000000000
B: 000000000001000000000000000000
S: 010000100000000000000000000000
B: 000000100000000000000000000000
S: 010000000000000000000000000000
A: 000000000000000000000010000000
B: 000000000000000001000000000000
S: 001000010000100000000000000000
B: 000000000000100000000000000000
S: 001000010000000000000000000000
B: 000000010000000000000000000000
S: 001000000000000000000000000000
A: 000000000000000000000001000000
B: 000000000000000000100000000000
S: 000100001000010000000000000000
B: 000000000000010000000000000000
S: 000100001000000000000000000000
B: 000000001000000000000000000000
S: 000100000000000000000000000000
A: 000000000000000000000000100000
B: 000000000000000000010000000000
S: 000010000100001000000000000000
B: 000000000000001000000000000000
S: 000010000100000000000000000000
B: 000000000100000000000000000000
S: 000010000000000000000000000000
A: 000000000000000000000000010000
B: 000000000000000000001000000000
S: 100001000010000100000000000000
B: 000000000000000100000000000000
S: 100001000010000000000000000000
B: 000000000010000000000000000000
S: 100001000000000000000000000000
B: 000001000000000000000000000000
S: 100000000000000000000000000000
A: 000000000000000000000000001000
B: 000000000000000000000100000000
S: 010000100001000010000000000000
B: 000000000000000010000000000000
S: 010000100001000000000000000000
B: 000000000001000000000000000000
S: 010000100000000000000000000000
B: 000000100000000000000000000000
S: 010000000000000000000000000000
A: 000000000000000000000000000100
B: 000000000000000000000010000000
S: 001000010000100001000000000000
B: 000000000000000001000000000000
S: 001000010000100000000000000000
B: 000000000000100000000000000000
S: 001000010000000000000000000000
B: 000000010000000000000000000000
S: 001000000000000000000000000000
A: 000000000000000000000000000010
B: 000000000000000000000001000000
S: 000100001000010000100000000000
B: 000000000000000000100000000000
S: 000100001000010000000000000000
B: 000000000000010000000000000000
S: 000100001000000000000000000000
B: 000000001000000000000000000000
S: 000100000000000000000000000000
A: 000000000000000000000000000001
B: 000000000000000000000000100000
S: 000010000100001000010000000000
B: 000000000000000000010000000000
S: 000010000100001000000000000000
B: 000000000000001000000000000000
S: 000010000100000000000000000000
B: 000000000100000000000000000000
S: 000010000000000000000000000000
direction: 1
----------------------------------------------------------------------------------------------------
A: 100000000000000000000000000000
A: 010000000000000000000000000000
A: 001000000000000000000000000000
A: 000100000000000000000000000000
A: 000010000000000000000000000000
A: 000001000000000000000000000000
A: 000000100000000000000000000000
A: 000000010000000000000000000000
A: 000000001000000000000000000000
A: 000000000100000000000000000000
A: 000000000010000000000000000000
B: 000000100000000000000000000000
S: 001000000000000000000000000000
A: 000000000001000000000000000000
B: 000000010000000000000000000000
S: 000100000000000000000000000000
A: 000000000000100000000000000000
B: 000000001000000000000000000000
S: 000010000000000000000000000000
A: 000000000000010000000000000000
A: 000000000000001000000000000000
A: 000000000000000100000000000000
B: 000000000001000000000000000000
S: 000100010000000000000000000000
B: 000000010000000000000000000000
S: 000100000000000000000000000000
A: 000000000000000010000000000000
B: 000000000000100000000000000000
S: 000010001000000000000000000000
B: 000000001000000000000000000000
S: 000010000000000000000000000000
A: 000000000000000001000000000000
B: 000000000000010000000000000000
S: 000000000100000000000000000000
A: 000000000000000000100000000000
A: 000000000000000000010000000000
A: 000000000000000000001000000000
B: 000000000000000010000000000000
S: 000010001000100000000000000000
B: 000000000000100000000000000000
S: 000010001000000000000000000000
B: 000000001000000000000000000000
S: 000010000000000000000000000000
A: 000000000000000000000100000000
B: 000000000000000001000000000000
S: 000000000100010000000000000000
B: 000000000000010000000000000000
S: 000000000100000000000000000000
A: 000000000000000000000010000000
B: 000000000000000000100000000000
S: 000000000000001000000000000000
A: 000000000000000000000001000000
A: 000000000000000000000000100000
A: 000000000000000000000000010000
B: 000000000000000000000100000000
S: 000000000100010001000000000000
B: 000000000000000001000000000000
S: 000000000100010000000000000000
B: 000000000000010000000000000000
S: 000000000100000000000000000000
A: 000000000000000000000000001000
B: 000000000000000000000010000000
S: 000000000000001000100000000000
B: 000000000000000000100000000000
S: 000000000000001000000000000000
A: 000000000000000000000000000100
B: 000000000000000000000001000000
S: 000000000000000000010000000000
A: 000000000000000000000000000010
A: 000000000000000000000000000001
direction: 2
----------------------------------------------------------------------------------------------------
A: 100000000000000000000000000000
B: 010000000000000000000000000000
S: 001110000000000000000000000000
B: 001000000000000000000000000000
S: 000110000000000000000000000000
B: 000100000000000000000000000000
S: 000010000000000000000000000000
A: 010000000000000000000000000000
B: 001000000000000000000000000000
S: 000110000000000000000000000000
B: 000100000000000000000000000000
S: 000010000000000000000000000000
A: 001000000000000000000000000000
B: 000100000000000000000000000000
S: 000010000000000000000000000000
A: 000100000000000000000000000000
A: 000010000000000000000000000000
A: 000001000000000000000000000000
B: 000000100000000000000000000000
S: 000000011100000000000000000000
B: 000000010000000000000000000000
S: 000000001100000000000000000000
B: 000000001000000000000000000000
S: 000000000100000000000000000000
A: 000000100000000000000000000000
B: 000000010000000000000000000000
S: 000000001100000000000000000000
B: 000000001000000000000000000000
S: 000000000100000000000000000000
A: 000000010000000000000000000000
B: 000000001000000000000000000000
S: 000000000100000000000000000000
A: 000000001000000000000000000000
A: 000000000100000000000000000000
A: 000000000010000000000000000000
B: 000000000001000000000000000000
S: 000000000000111000000000000000
B: 000000000000100000000000000000
S: 000000000000011000000000000000
B: 000000000000010000000000000000
S: 000000000000001000000000000000
A: 000000000001000000000000000000
B: 000000000000100000000000000000
S: 000000000000011000000000000000
B: 000000000000010000000000000000
S: 000000000000001000000000000000
A: 000000000000100000000000000000
B: 000000000000010000000000000000
S: 000000000000001000000000000000
A: 000000000000010000000000000000
A: 000000000000001000000000000000
A: 000000000000000100000000000000
B: 000000000000000010000000000000
S: 000000000000000001110000000000
B: 000000000000000001000000000000
S: 000000000000000000110000000000
B: 000000000000000000100000000000
S: 000000000000000000010000000000
A: 000000000000000010000000000000
B: 000000000000000001000000000000
S: 000000000000000000110000000000
B: 000000000000000000100000000000
S: 000000000000000000010000000000
A: 000000000000000001000000000000
B: 000000000000000000100000000000
S: 000000000000000000010000000000
A: 000000000000000000100000000000
A: 000000000000000000010000000000
A: 000000000000000000001000000000
B: 000000000000000000000100000000
S: 000000000000000000000011100000
B: 000000000000000000000010000000
S: 000000000000000000000001100000
B: 000000000000000000000001000000
S: 000000000000000000000000100000
A: 000000000000000000000100000000
B: 000000000000000000000010000000
S: 000000000000000000000001100000
B: 000000000000000000000001000000
S: 000000000000000000000000100000
A: 000000000000000000000010000000
B: 000000000000000000000001000000
S: 000000000000000000000000100000
A: 000000000000000000000001000000
A: 000000000000000000000000100000
A: 000000000000000000000000010000
B: 000000000000000000000000001000
S: 000000000000000000000000000111
B: 000000000000000000000000000100
S: 000000000000000000000000000011
B: 000000000000000000000000000010
S: 000000000000000000000000000001
A: 000000000000000000000000001000
B: 000000000000000000000000000100
S: 000000000000000000000000000011
B: 000000000000000000000000000010
S: 000000000000000000000000000001
A: 000000000000000000000000000100
B: 000000000000000000000000000010
S: 000000000000000000000000000001
A: 000000000000000000000000000010
A: 000000000000000000000000000001
direction: 3
----------------------------------------------------------------------------------------------------
A: 100000000000000000000000000000
B: 000000100000000000000000000000
S: 000000000000100000100000100000
B: 000000000000100000000000000000
S: 000000000000000000100000100000
B: 000000000000000000100000000000
S: 000000000000000000000000100000
A: 010000000000000000000000000000
B: 000000010000000000000000000000
S: 000000000000010000010000000000
B: 000000000000010000000000000000
S: 000000000000000000010000000000
A: 001000000000000000000000000000
B: 000000001000000000000000000000
S: 000000000000001000000000000000
A: 000100000000000000000000000000
A: 000010000000000000000000000000
A: 000001000000000000000000000000
B: 000000000001000000000000000000
S: 000000000000000001000001000001
B: 000000000000000001000000000000
S: 000000000000000000000001000001
B: 000000000000000000000001000000
S: 000000000000000000000000000001
A: 000000100000000000000000000000
B: 000000000000100000000000000000
S: 000000000000000000100000100000
B: 000000000000000000100000000000
S: 000000000000000000000000100000
A: 000000010000000000000000000000
B: 000000000000010000000000000000
S: 000000000000000000010000000000
A: 000000001000000000000000000000
A: 000000000100000000000000000000
A: 000000000010000000000000000000
B: 000000000000000010000000000000
S: 000000000000000000000010000010
B: 000000000000000000000010000000
S: 000000000000000000000000000010
A: 000000000001000000000000000000
B: 000000000000000001000000000000
S: 000000000000000000000001000001
B: 000000000000000000000001000000
S: 000000000000000000000000000001
A: 000000000000100000000000000000
B: 000000000000000000100000000000
S: 000000000000000000000000100000
A: 000000000000010000000000000000
A: 000000000000001000000000000000
A: 000000000000000100000000000000
B: 000000000000000000000100000000
S: 000000000000000000000000000100
A: 000000000000000010000000000000
B: 000000000000000000000010000000
S: 000000000000000000000000000010
A: 000000000000000001000000000000
B: 000000000000000000000001000000
S: 000000000000000000000000000001
A: 000000000000000000100000000000
A: 000000000000000000010000000000
A: 000000000000000000001000000000
A: 000000000000000000000100000000
A: 000000000000000000000010000000
A: 000000000000000000000001000000
A: 000000000000000000000000100000
A: 000000000000000000000000010000
A: 000000000000000000000000001000
A: 000000000000000000000000000100
A: 000000000000000000000000000010
A: 000000000000000000000000000001
direction: 4
----------------------------------------------------------------------------------------------------
A: 100000000000000000000000000000
B: 000001000000000000000000000000
S: 000000000010000100001000010000
B: 000000000010000000000000000000
S: 000000000000000100001000010000
B: 000000000000000100000000000000
S: 000000000000000000001000010000
B: 000000000000000000001000000000
S: 000000000000000000000000010000
A: 010000000000000000000000000000
B: 000000100000000000000000000000
S: 000000000001000010000100001000
B: 000000000001000000000000000000
S: 000000000000000010000100001000
B: 000000000000000010000000000000
S: 000000000000000000000100001000
B: 000000000000000000000100000000
S: 000000000000000000000000001000
A: 001000000000000000000000000000
B: 000000010000000000000000000000
S: 000000000000100001000010000100
B: 000000000000100000000000000000
S: 000000000000000001000010000100
B: 000000000000000001000000000000
S: 000000000000000000000010000100
B: 000000000000000000000010000000
S: 000000000000000000000000000100
A: 000100000000000000000000000000
B: 000000001000000000000000000000
S: 000000000000010000100001000010
B: 000000000000010000000000000000
S: 000000000000000000100001000010
B: 000000000000000000100000000000
S: 000000000000000000000001000010
B: 000000000000000000000001000000
S: 000000000000000000000000000010
A: 000010000000000000000000000000
B: 000000000100000000000000000000
S: 000000000000001000010000100001
B: 000000000000001000000000000000
S: 000000000000000000010000100001
B: 000000000000000000010000000000
S: 000000000000000000000000100001
B: 000000000000000000000000100000
S: 000000000000000000000000000001
A: 000001000000000000000000000000
B: 000000000010000000000000000000
S: 000000000000000100001000010000
B: 000000000000000100000000000000
S: 000000000000000000001000010000
B: 000000000000000000001000000000
S: 000000000000000000000000010000
A: 000000100000000000000000000000
B: 000000000001000000000000000000
S: 000000000000000010000100001000
B: 000000000000000010000000000000
S: 000000000000000000000100001000
B: 000000000000000000000100000000
S: 000000000000000000000000001000
A: 000000010000000000000000000000
B: 000000000000100000000000000000
S: 000000000000000001000010000100
B: 000000000000000001000000000000
S: 000000000000000000000010000100
B: 000000000000000000000010000000
S: 000000000000000000000000000100
A: 000000001000000000000000000000
B: 000000000000010000000000000000
S: 000000000000000000100001000010
B: 000000000000000000100000000000
S: 000000000000000000000001000010
B: 000000000000000000000001000000
S: 000000000000000000000000000010
A: 000000000100000000000000000000
B: 000000000000001000000000000000
S: 000000000000000000010000100001
B: 000000000000000000010000000000
S: 000000000000000000000000100001
B: 000000000000000000000000100000
S: 000000000000000000000000000001
A: 000000000010000000000000000000
B: 000000000000000100000000000000
S: 000000000000000000001000010000
B: 000000000000000000001000000000
S: 000000000000000000000000010000
A: 000000000001000000000000000000
B: 000000000000000010000000000000
S: 000000000000000000000100001000
B: 000000000000000000000100000000
S: 000000000000000000000000001000
A: 000000000000100000000000000000
B: 000000000000000001000000000000
S: 000000000000000000000010000100
B: 000000000000000000000010000000
S: 000000000000000000000000000100
A: 000000000000010000000000000000
B: 000000000000000000100000000000
S: 000000000000000000000001000010
B: 000000000000000000000001000000
S: 000000000000000000000000000010
A: 000000000000001000000000000000
B: 000000000000000000010000000000
S: 000000000000000000000000100001
B: 000000000000000000000000100000
S: 000000000000000000000000000001
A: 000000000000000100000000000000
B: 000000000000000000001000000000
S: 000000000000000000000000010000
A: 000000000000000010000000000000
B: 000000000000000000000100000000
S: 000000000000000000000000001000
A: 000000000000000001000000000000
B: 000000000000000000000010000000
S: 000000000000000000000000000100
A: 000000000000000000100000000000
B: 000000000000000000000001000000
S: 000000000000000000000000000010
A: 000000000000000000010000000000
B: 000000000000000000000000100000
S: 000000000000000000000000000001
A: 000000000000000000001000000000
A: 000000000000000000000100000000
A: 000000000000000000000010000000
A: 000000000000000000000001000000
A: 000000000000000000000000100000
A: 000000000000000000000000010000
A: 000000000000000000000000001000
A: 000000000000000000000000000100
A: 000000000000000000000000000010
A: 000000000000000000000000000001
direction: 5
----------------------------------------------------------------------------------------------------
A: 100000000000000000000000000000
A: 010000000000000000000000000000
A: 001000000000000000000000000000
B: 000000100000000000000000000000
S: 000000000010000000000000000000
A: 000100000000000000000000000000
B: 000000010000000000000000000000
S: 000000000001000100000000000000
B: 000000000001000000000000000000
S: 000000000000000100000000000000
A: 000010000000000000000000000000
B: 000000001000000000000000000000
S: 000000000000100010001000000000
B: 000000000000100000000000000000
S: 000000000000000010001000000000
B: 000000000000000010000000000000
S: 000000000000000000001000000000
A: 000001000000000000000000000000
A: 000000100000000000000000000000
A: 000000010000000000000000000000
B: 000000000001000000000000000000
S: 000000000000000100000000000000
A: 000000001000000000000000000000
B: 000000000000100000000000000000
S: 000000000000000010001000000000
B: 000000000000000010000000000000
S: 000000000000000000001000000000
A: 000000000100000000000000000000
B: 000000000000010000000000000000
S: 000000000000000001000100010000
B: 000000000000000001000000000000
S: 000000000000000000000100010000
B: 000000000000000000000100000000
S: 000000000000000000000000010000
A: 000000000010000000000000000000
A: 000000000001000000000000000000
A: 000000000000100000000000000000
B: 000000000000000010000000000000
S: 000000000000000000001000000000
A: 000000000000010000000000000000
B: 000000000000000001000000000000
S: 000000000000000000000100010000
B: 000000000000000000000100000000
S: 000000000000000000000000010000
A: 000000000000001000000000000000
B: 000000000000000000100000000000
S: 000000000000000000000010001000
B: 000000000000000000000010000000
S: 000000000000000000000000001000
A: 000000000000000100000000000000
A: 000000000000000010000000000000
A: 000000000000000001000000000000
B: 000000000000000000000100000000
S: 000000000000000000000000010000
A: 000000000000000000100000000000
B: 000000000000000000000010000000
S: 000000000000000000000000001000
A: 000000000000000000010000000000
B: 000000000000000000000001000000
S: 000000000000000000000000000100
A: 000000000000000000001000000000
A: 000000000000000000000100000000
A: 000000000000000000000010000000
A: 000000000000000000000001000000
A: 000000000000000000000000100000
A: 000000000000000000000000010000
A: 000000000000000000000000001000
A: 000000000000000000000000000100
A: 000000000000000000000000000010
A: 000000000000000000000000000001
direction: 6
----------------------------------------------------------------------------------------------------
A: 100000000000000000000000000000
A: 010000000000000000000000000000
A: 001000000000000000000000000000
B: 010000000000000000000000000000
S: 100000000000000000000000000000
A: 000100000000000000000000000000
B: 001000000000000000000000000000
S: 110000000000000000000000000000
B: 010000000000000000000000000000
S: 100000000000000000000000000000
A: 000010000000000000000000000000
B: 000100000000000000000000000000
S: 111000000000000000000000000000
B: 001000000000000000000000000000
S: 110000000000000000000000000000
B: 010000000000000000000000000000
S: 100000000000000000000000000000
A: 000001000000000000000000000000
A: 000000100000000000000000000000
A: 000000010000000000000000000000
B: 000000100000000000000000000000
S: 000001000000000000000000000000
A: 000000001000000000000000000000
B: 000000010000000000000000000000
S: 000001100000000000000000000000
B: 000000100000000000000000000000
S: 000001000000000000000000000000
A: 000000000100000000000000000000
B: 000000001000000000000000000000
S: 000001110000000000000000000000
B: 000000010000000000000000000000
S: 000001100000000000000000000000
B: 000000100000000000000000000000
S: 000001000000000000000000000000
A: 000000000010000000000000000000
A: 000000000001000000000000000000
A: 000000000000100000000000000000
B: 000000000001000000000000000000
S: 000000000010000000000000000000
A: 000000000000010000000000000000
B: 000000000000100000000000000000
S: 000000000011000000000000000000
B: 000000000001000000000000000000
S: 000000000010000000000000000000
A: 000000000000001000000000000000
B: 000000000000010000000000000000
S: 000000000011100000000000000000
B: 000000000000100000000000000000
S: 000000000011000000000000000000
B: 000000000001000000000000000000
S: 000000000010000000000000000000
A: 000000000000000100000000000000
A: 000000000000000010000000000000
A: 000000000000000001000000000000
B: 000000000000000010000000000000
S: 000000000000000100000000000000
A: 000000000000000000100000000000
B: 000000000000000001000000000000
S: 000000000000000110000000000000
B: 000000000000000010000000000000
S: 000000000000000100000000000000
A: 000000000000000000010000000000
B: 000000000000000000100000000000
S: 000000000000000111000000000000
B: 000000000000000001000000000000
S: 000000000000000110000000000000
B: 000000000000000010000000000000
S: 000000000000000100000000000000
A: 000000000000000000001000000000
A: 000000000000000000000100000000
A: 000000000000000000000010000000
B: 000000000000000000000100000000
S: 000000000000000000001000000000
A: 000000000000000000000001000000
B: 000000000000000000000010000000
S: 000000000000000000001100000000
B: 000000000000000000000100000000
S: 000000000000000000001000000000
A: 000000000000000000000000100000
B: 000000000000000000000001000000
S: 000000000000000000001110000000
B: 000000000000000000000010000000
S: 000000000000000000001100000000
B: 000000000000000000000100000000
S: 000000000000000000001000000000
A: 000000000000000000000000010000
A: 000000000000000000000000001000
A: 000000000000000000000000000100
B: 000000000000000000000000001000
S: 000000000000000000000000010000
A: 000000000000000000000000000010
B: 000000000000000000000000000100
S: 000000000000000000000000011000
B: 000000000000000000000000001000
S: 000000000000000000000000010000
A: 000000000000000000000000000001
B: 000000000000000000000000000010
S: 000000000000000000000000011100
B: 000000000000000000000000000100
S: 000000000000000000000000011000
B: 000000000000000000000000001000
S: 000000000000000000000000010000
direction: 7
----------------------------------------------------------------------------------------------------
A: 100000000000000000000000000000
A: 010000000000000000000000000000
A: 001000000000000000000000000000
A: 000100000000000000000000000000
A: 000010000000000000000000000000
A: 000001000000000000000000000000
A: 000000100000000000000000000000
A: 000000010000000000000000000000
A: 000000001000000000000000000000
A: 000000000100000000000000000000
A: 000000000010000000000000000000
A: 000000000001000000000000000000
A: 000000000000100000000000000000
B: 000000100000000000000000000000
S: 100000000000000000000000000000
A: 000000000000010000000000000000
B: 000000010000000000000000000000
S: 010000000000000000000000000000
A: 000000000000001000000000000000
B: 000000001000000000000000000000
S: 001000000000000000000000000000
A: 000000000000000100000000000000
A: 000000000000000010000000000000
A: 000000000000000001000000000000
B: 000000000001000000000000000000
S: 000001000000000000000000000000
A: 000000000000000000100000000000
B: 000000000000100000000000000000
S: 100000100000000000000000000000
B: 000000100000000000000000000000
S: 100000000000000000000000000000
A: 000000000000000000010000000000
B: 000000000000010000000000000000
S: 010000010000000000000000000000
B: 000000010000000000000000000000
S: 010000000000000000000000000000
A: 000000000000000000001000000000
A: 000000000000000000000100000000
A: 000000000000000000000010000000
B: 000000000000000010000000000000
S: 000000000010000000000000000000
A: 000000000000000000000001000000
B: 000000000000000001000000000000
S: 000001000001000000000000000000
B: 000000000001000000000000000000
S: 000001000000000000000000000000
A: 000000000000000000000000100000
B: 000000000000000000100000000000
S: 100000100000100000000000000000
B: 000000000000100000000000000000
S: 100000100000000000000000000000
B: 000000100000000000000000000000
S: 100000000000000000000000000000
A: 000000000000000000000000010000
A: 000000000000000000000000001000
A: 000000000000000000000000000100
B: 000000000000000000000100000000
S: 000000000000000100000000000000
A: 000000000000000000000000000010
B: 000000000000000000000010000000
S: 000000000010000010000000000000
B: 000000000000000010000000000000
S: 000000000010000000000000000000
A: 000000000000000000000000000001
B: 000000000000000000000001000000
S: 000001000001000001000000000000
B: 000000000000000001000000000000
S: 000001000001000000000000000000
B: 000000000001000000000000000000
S: 000001000000000000000000000000
In [246]:
attack_masks = [king_masks, queen_masks, b_attack_masks, n_masks, rook_masks, b_pa_masks, w_pa_masks]
attacks = {
'KING_ATTACK_MASKS': king_masks,
'QUEEN_ATTACK_MASKS': queen_masks,
'BISHOP_ATTACK_MASKS': b_attack_masks,
'KNIGHT_ATTACK_MASKS': n_masks,
'ROOK_ATTACK_MASKS': rook_masks,
'BLACK_PAWN_ATTACK_MASKS': black_pawn_attack_masks,
'WHITE_PAWN_ATTACK_MASKS': white_pawn_attack_masks
}
complete_attacks = {
'KING_ATTACK_MASKS_COMBINED': KING_MASKS,
'QUEEN_ATTACK_MASKS_COMBINED': QUEEN_MASKS,
'BISHOP_ATTACK_MASKS_COMBINED': BISHOP_ATTACK_MASKS,
'KNIGHT_ATTACK_MASKS_COMBINED': KNIGHT_MASKS,
'ROOK_ATTACK_MASKS_COMBINED': ROOK_MASKS,
'BLACK_PAWN_ATTACK_MASKS_COMBINED': B_PAWN_ATTACK_MASKS,
'WHITE_PAWN_ATTACK_MASKS_COMBINED': W_PAWN_ATTACK_MASKS
}
moves = {
'KING_MOVE_MASKS': king_masks,
'QUEEN_MOVE_MASKS': queen_masks,
'BISHOP_MOVE_MASKS': b_move_masks,
'KNIGHT_MOVE_MASKS': n_masks,
'ROOK_MOVE_MASKS': rook_masks,
'BLACK_PAWN_MOVE_MASKS': black_pawn_move_masks,
'WHITE_PAWN_MOVE_MASKS': white_pawn_move_masks
}
complete_moves = {
'KING_MOVE_MASKS_COMBINED': KING_MASKS,
'QUEEN_MOVE_MASKS_COMBINED': QUEEN_MASKS,
'BISHOP_MOVE_MASKS_COMBINED': BISHOP_MOVE_MASKS,
'KNIGHT_MOVE_MASKS_COMBINED': KNIGHT_MASKS,
'ROOK_MOVE_MASKS_COMBINED': ROOK_MASKS,
'BLACK_PAWN_MOVE_MASKS_COMBINED': B_PAWN_MOVE_MASKS,
'WHITE_PAWN_MOVE_MASKS_COMBINED': W_PAWN_MOVE_MASKS
}
black_pawn_vals = np.array([0, 0, 0, 0, 0, 10, 25, 35, 15, 10, 5, 20, 30, 10, 5, 0, 10, 20, -5, -10, 0, -5, -10, 0, 0, 0, 0, 0, 0, 0])
white_pawn_vals = np.flip(black_pawn_vals, axis=0)
header_file = '''//
// Created by Michael Lane on 6/2/17.
// This file requires the use of the --std=c++11 flag when compiling.
//
#ifndef BITBOARD_TABLES_H
#define BITBOARD_TABLES_H
#include <vector>
#include <tuple>
#include <unordered_map>
#include <string>
#include <map>
#include <queue>
#define BLACK_KING 0
#define WHITE_KING 19
#define MOVE_NUMBER 20
#define PLAYER_ON_MOVE 21
#define LOCATION_OF_OPPONENTS 22
#define LOCATION_OF_EMPTY 23
#define TIME_LEFT 24
typedef std::unordered_map<unsigned int, std::vector<unsigned int>> Attack_Masks;
typedef std::unordered_map<unsigned int, std::vector<unsigned int>> Move_Masks;
typedef std::unordered_map<unsigned int, std::string> Int_to_Str;
typedef std::unordered_map<unsigned int, int> Int_to_Idx;
typedef std::unordered_map<unsigned int, std::unordered_map<unsigned int, unsigned int>> Shadow_Mask;
typedef std::vector<unsigned int> State_t;
static unsigned int BLACK_IDX = 0;
static unsigned int WHITE_IDX = 10;
enum player : int {
BLACK = 1,
WHITE = 2
};
static Int_to_Idx TO_IDX = {
{1610612736, 29},
{1342177280, 28},
{1207959552, 27},
{1140850688, 26},
{1107296256, 25},
{1090519040, 24},
{1082130432, 23},
{1077936128, 22},
{1075838976, 21},
{1074790400, 20},
{1074266112, 19},
{1074003968, 18},
{1073872896, 17},
{1073807360, 16},
{1073774592, 15},
{1073758208, 14},
{1073750016, 13},
{1073745920, 12},
{1073743872, 11},
{1073742848, 10},
{1073742336, 9},
{1073742080, 8},
{1073741952, 7},
{1073741888, 6},
{1073741856, 5},
{1073741840, 4},
{1073741832, 3},
{1073741828, 2},
{1073741826, 1},
{1073741825, 0},
{536870912, 29},
{268435456, 28},
{134217728, 27},
{67108864, 26},
{33554432, 25},
{16777216, 24},
{8388608, 23},
{4194304, 22},
{2097152, 21},
{1048576, 20},
{524288, 19},
{262144, 18},
{131072, 17},
{65536, 16},
{32768, 15},
{16384, 14},
{8192, 13},
{4096, 12},
{2048, 11},
{1024, 10},
{512, 9},
{256, 8},
{128, 7},
{64, 6},
{32, 5},
{16, 4},
{8, 3},
{4, 2},
{2, 1},
{1, 0},
};
static Int_to_Str TO_STR = {
{1610612736, "a6"},
{1342177280, "b6"},
{1207959552, "c6"},
{1140850688, "d6"},
{1107296256, "e6"},
{1090519040, "a5"},
{1082130432, "b5"},
{1077936128, "c5"},
{1075838976, "d5"},
{1074790400, "e5"},
{1074266112, "a4"},
{1074003968, "b4"},
{1073872896, "c4"},
{1073807360, "d4"},
{1073774592, "e4"},
{1073758208, "a3"},
{1073750016, "b3"},
{1073745920, "c3"},
{1073743872, "d3"},
{1073742848, "e3"},
{1073742336, "a2"},
{1073742080, "b2"},
{1073741952, "c2"},
{1073741888, "d2"},
{1073741856, "e2"},
{1073741840, "a1"},
{1073741832, "b1"},
{1073741828, "c1"},
{1073741826, "d1"},
{1073741825, "e1"},
{536870912, "a6"},
{268435456, "b6"},
{134217728, "c6"},
{67108864, "d6"},
{33554432, "e6"},
{16777216, "a5"},
{8388608, "b5"},
{4194304, "c5"},
{2097152, "d5"},
{1048576, "e5"},
{524288, "a4"},
{262144, "b4"},
{131072, "c4"},
{65536, "d4"},
{32768, "e4"},
{16384, "a3"},
{8192, "b3"},
{4096, "c3"},
{2048, "d3"},
{1024, "e3"},
{512, "a2"},
{256, "b2"},
{128, "c2"},
{64, "d2"},
{32, "e2"},
{16, "a1"},
{8, "b1"},
{4, "c1"},
{2, "d1"},
{1, "e1"},
};
'''
for name, masks in attacks.items():
header_file += 'static Attack_Masks {n} = {{\n'.format(n=name)
for k, v in sorted(masks.items(), reverse=True):
if v:
header_file += ' {{{k}, {{{v}}}}},\n'.format(k=k, v=str(v)[1:-1])
header_file += '};\n\n'
for name, masks in complete_attacks.items():
header_file += gen_complete_masks(name, masks)
for name, masks in moves.items():
header_file += 'static Move_Masks {n} = {{\n'.format(n=name)
for k, v in sorted(masks.items(), reverse=True):
if v:
header_file += ' {{{k}, {{{v}}}}},\n'.format(k=k, v=str(v)[1:-1])
header_file += '};\n\n'
for name, masks in complete_moves.items():
header_file += gen_complete_masks(name, masks)
header_file += 'static Shadow_Mask SHADOW_MASK = {\n'
for k in sorted(shadows.keys(), reverse=True):
header_file += ' {\n'
header_file += ' {}, {{\n'.format(k)
for vk, v in sorted(shadows[k].items(), reverse=True):
header_file += ' {{{}, {}}},\n'.format(vk, v)
header_file += ' }\n'
header_file += ' },\n'
header_file += '};\n\n'
begin_wq_heuristic = '''1000 -500 -500 -500 -500
-500 -500 -500 -500 -500
-500 -500 -500 -500 -500
-500 -500 -500 -500 -500
-500 -500 -500 -500 0
-500 -500 -500 0 -500'''
begin_white_queen_heuristic, begin_black_queen_heuristic = raw_heuristic_to_b_w_cpp('begin_white_queen_heuristic', 'begin_black_queen_heuristic', begin_wq_heuristic)
header_file += begin_white_queen_heuristic
header_file += begin_black_queen_heuristic
mid_wq_heuristic = '''-20 -10 -5 -10 -20
-10 0 0 0 -10
-10 5 5 5 -10
0 5 5 5 0
-10 5 5 5 100
-20 -10 -5 -10 -20'''
white_queen_heuristic, black_queen_heuristic = raw_heuristic_to_b_w_cpp('white_queen_heuristic', 'black_queen_heuristic', mid_wq_heuristic)
header_file += white_queen_heuristic
header_file += black_queen_heuristic
wp_heuristic = ''' 1000 1000 1000 1000 1000
10 25 35 15 10
5 20 30 10 5
0 10 20 -5 0
0 -5 -10 0 -10
0 0 0 0 0'''
white_pawn_heuristic, black_pawn_heuristic = raw_heuristic_to_b_w_cpp('white_pawn_heuristic', 'black_pawn_heuristic', wp_heuristic, wq_heuristic)
header_file += white_pawn_heuristic
header_file += black_pawn_heuristic
begin_white_knight_heuristic = ''' 500 0 0 0 0
0 0 0 0 0
0 0 0 0 0
-500 0 -500 0 0
0 0 0 0 0
0 300 0 0 0'''
begin_white_knight_heuristic, begin_black_knight_heuristic = raw_heuristic_to_b_w_cpp('begin_white_knight_heuristic', 'begin_black_knight_heuristic', begin_white_knight_heuristic)
header_file += begin_white_knight_heuristic
header_file += begin_black_knight_heuristic
wn_heuristic = ''' -50 -40 -30 -40 -50
-40 5 10 5 -40
-30 10 20 10 -30
-30 10 20 10 -30
-40 5 10 5 -40
-50 -40 -30 -40 -50'''
white_knight_heuristic, black_knight_heuristic = raw_heuristic_to_b_w_cpp('middle_white_knight_heuristic', 'middle_black_knight_heuristic', wn_heuristic)
header_file += white_knight_heuristic
header_file += black_knight_heuristic
wb_heuristic = '''-20 -15 -10 -15 -20
-15 5 5 5 -15
-10 5 15 5 -10
-15 10 10 10 -15
-10 0 10 0 -10
-25 -10 -15 -10 -25'''
white_bishop_heuristic, black_bishop_heuristic = raw_heuristic_to_b_w_cpp('white_bishop_heuristic', 'black_bishop_heuristic', wb_heuristic)
header_file += white_bishop_heuristic
header_file += black_bishop_heuristic
wr_heuristic = ''' 0 0 5 0 0
-10 0 0 0 -10
-10 0 0 0 -10
-10 0 0 0 -10
5 10 10 10 5
0 0 0 0 0'''
white_rook_heuristic, black_rook_heuristic = raw_heuristic_to_b_w_cpp('white_rook_heuristic', 'black_rook_heuristic', wr_heuristic)
header_file += white_rook_heuristic
header_file += black_rook_heuristic
wk_b_heuristic = '''-500 -500 -500 -500 -500
-500 -500 -500 -500 -500
-500 -500 -500 -500 -500
-500 -500 -500 -500 -500
-500 -500 -500 -500 -500
-500 -500 -500 -500 0'''
white_king_begin_game_heuristic, black_king_begin_game_heuristic = raw_heuristic_to_b_w_cpp('white_king_begin_game_heuristic', 'black_king_begin_game_heuristic', wk_b_heuristic)
header_file += white_king_begin_game_heuristic
header_file += black_king_begin_game_heuristic
wk_m_heuristic = '''-30 -40 -50 -40 -30
-30 -40 -50 -40 -30
-30 -40 -50 -40 -30
-20 -30 -40 -30 -20
-10 -20 -30 -20 -10
50 40 0 40 50'''
white_king_middle_game_heuristic, black_king_middle_game_heuristic = raw_heuristic_to_b_w_cpp('white_king_middle_game_heuristic', 'black_king_middle_game_heuristic', wk_m_heuristic)
header_file += white_king_middle_game_heuristic
header_file += black_king_middle_game_heuristic
wk_e_heuristic = '''-50 -40 -30 -40 -50
-30 -15 0 -15 -30
-30 15 40 15 -30
-30 15 40 15 -30
-30 0 0 0 -30
-50 -40 -30 -40 -50'''
white_king_end_game_heuristic, black_king_end_game_heuristic = raw_heuristic_to_b_w_cpp('white_king_end_game_heuristic', 'black_king_end_game_heuristic', wk_e_heuristic)
header_file += white_king_end_game_heuristic
header_file += black_king_end_game_heuristic
header_file += '''static Attack_Masks type_to_attack[20] = {
KING_ATTACK_MASKS,
QUEEN_ATTACK_MASKS,
BISHOP_ATTACK_MASKS,
KNIGHT_ATTACK_MASKS,
ROOK_ATTACK_MASKS,
BLACK_PAWN_ATTACK_MASKS,
BLACK_PAWN_ATTACK_MASKS,
BLACK_PAWN_ATTACK_MASKS,
BLACK_PAWN_ATTACK_MASKS,
BLACK_PAWN_ATTACK_MASKS,
WHITE_PAWN_ATTACK_MASKS,
WHITE_PAWN_ATTACK_MASKS,
WHITE_PAWN_ATTACK_MASKS,
WHITE_PAWN_ATTACK_MASKS,
WHITE_PAWN_ATTACK_MASKS,
ROOK_ATTACK_MASKS,
KNIGHT_ATTACK_MASKS,
BISHOP_ATTACK_MASKS,
QUEEN_ATTACK_MASKS,
KING_ATTACK_MASKS
};
static Move_Masks type_to_move[20] = {
KING_MOVE_MASKS,
QUEEN_MOVE_MASKS,
BISHOP_MOVE_MASKS,
KNIGHT_MOVE_MASKS,
ROOK_MOVE_MASKS,
BLACK_PAWN_MOVE_MASKS,
BLACK_PAWN_MOVE_MASKS,
BLACK_PAWN_MOVE_MASKS,
BLACK_PAWN_MOVE_MASKS,
BLACK_PAWN_MOVE_MASKS,
WHITE_PAWN_MOVE_MASKS,
WHITE_PAWN_MOVE_MASKS,
WHITE_PAWN_MOVE_MASKS,
WHITE_PAWN_MOVE_MASKS,
WHITE_PAWN_MOVE_MASKS,
ROOK_MOVE_MASKS,
KNIGHT_MOVE_MASKS,
BISHOP_MOVE_MASKS,
QUEEN_MOVE_MASKS,
KING_MOVE_MASKS
};
static const int black_on_move_values[20]{
10000, // MY KING
900, // MY QUEEN
300, // MY BISHOP
300, // MY KNIGHT
500, // MY ROOK
100, // MY PAWN
100, // MY PAWN
100, // MY PAWN
100, // MY PAWN
100, // MY PAWN
-100, // OPPONENT PAWN
-100, // OPPONENT PAWN
-100, // OPPONENT PAWN
-100, // OPPONENT PAWN
-100, // OPPONENT PAWN
-500, // OPPONENT ROOK
-300, // OPPONENT KNIGHT
-300, // OPPONENT BISHOP
-900, // OPPONENT QUEEN
-10000 // OPPONENT KING
};
static const int white_on_move_values[20]{
-10000, // OPPONENT KING
-900, // OPPONENT QUEEN
-300, // OPPONENT BISHOP
-300, // OPPONENT KNIGHT
-500, // OPPONENT ROOK
-100, // OPPONENT PAWN
-100, // OPPONENT PAWN
-100, // OPPONENT PAWN
-100, // OPPONENT PAWN
-100, // OPPONENT PAWN
100, // MY PAWN
100, // MY PAWN
100, // MY PAWN
100, // MY PAWN
100, // MY PAWN
500, // MY ROOK
300, // MY KNIGHT
300, // MY BISHOP
900, // MY QUEEN
10000 // MY KING
};
static const int piece_type_zobrist_index[20]{
0, // k
1, // q
2, // b
3, // n
4, // r
5, // p
5, // p
5, // p
5, // p
5, // p
6, // P
6, // P
6, // P
6, // P
6, // P
7, // R
8, // N
9, // B
10, // Q
11, // K
};
static std::unordered_map<unsigned int, int> begin_heuristic_dispatch[20] = {
black_king_begin_game_heuristic,
begin_black_queen_heuristic,
black_bishop_heuristic,
begin_black_knight_heuristic,
black_rook_heuristic,
black_pawn_heuristic,
black_pawn_heuristic,
black_pawn_heuristic,
black_pawn_heuristic,
black_pawn_heuristic,
white_pawn_heuristic,
white_pawn_heuristic,
white_pawn_heuristic,
white_pawn_heuristic,
white_pawn_heuristic,
white_rook_heuristic,
begin_white_knight_heuristic,
white_bishop_heuristic,
begin_white_queen_heuristic,
white_king_begin_game_heuristic,
};
static std::unordered_map<unsigned int, int> middle_heuristic_dispatch[20] = {
black_king_middle_game_heuristic,
black_queen_heuristic,
black_bishop_heuristic,
middle_black_knight_heuristic,
black_rook_heuristic,
black_pawn_heuristic,
black_pawn_heuristic,
black_pawn_heuristic,
black_pawn_heuristic,
black_pawn_heuristic,
white_pawn_heuristic,
white_pawn_heuristic,
white_pawn_heuristic,
white_pawn_heuristic,
white_pawn_heuristic,
white_rook_heuristic,
middle_white_knight_heuristic,
white_bishop_heuristic,
white_queen_heuristic,
white_king_middle_game_heuristic,
};
static std::unordered_map<unsigned int, int> end_heuristic_dispatch[20] = {
black_king_end_game_heuristic,
black_queen_heuristic,
black_bishop_heuristic,
middle_black_knight_heuristic,
black_rook_heuristic,
black_pawn_heuristic,
black_pawn_heuristic,
black_pawn_heuristic,
black_pawn_heuristic,
black_pawn_heuristic,
white_pawn_heuristic,
white_pawn_heuristic,
white_pawn_heuristic,
white_pawn_heuristic,
white_pawn_heuristic,
white_rook_heuristic,
middle_white_knight_heuristic,
white_bishop_heuristic,
white_queen_heuristic,
white_king_end_game_heuristic,
};
static std::unordered_map<unsigned int, unsigned int> combined_attack_dispatch[20] = {
KING_ATTACK_MASKS_COMBINED,
QUEEN_ATTACK_MASKS_COMBINED,
BISHOP_ATTACK_MASKS_COMBINED,
KNIGHT_ATTACK_MASKS_COMBINED,
ROOK_ATTACK_MASKS_COMBINED,
BLACK_PAWN_ATTACK_MASKS_COMBINED,
BLACK_PAWN_ATTACK_MASKS_COMBINED,
BLACK_PAWN_ATTACK_MASKS_COMBINED,
BLACK_PAWN_ATTACK_MASKS_COMBINED,
BLACK_PAWN_ATTACK_MASKS_COMBINED,
WHITE_PAWN_ATTACK_MASKS_COMBINED,
WHITE_PAWN_ATTACK_MASKS_COMBINED,
WHITE_PAWN_ATTACK_MASKS_COMBINED,
WHITE_PAWN_ATTACK_MASKS_COMBINED,
WHITE_PAWN_ATTACK_MASKS_COMBINED,
ROOK_ATTACK_MASKS_COMBINED,
KNIGHT_ATTACK_MASKS_COMBINED,
BISHOP_ATTACK_MASKS_COMBINED,
QUEEN_ATTACK_MASKS_COMBINED,
KING_ATTACK_MASKS_COMBINED
};
static std::unordered_map<unsigned int, unsigned int> combined_move_dispatch[20] = {
KING_MOVE_MASKS_COMBINED,
QUEEN_MOVE_MASKS_COMBINED,
BISHOP_MOVE_MASKS_COMBINED,
KNIGHT_MOVE_MASKS_COMBINED,
ROOK_MOVE_MASKS_COMBINED,
BLACK_PAWN_MOVE_MASKS_COMBINED,
BLACK_PAWN_MOVE_MASKS_COMBINED,
BLACK_PAWN_MOVE_MASKS_COMBINED,
BLACK_PAWN_MOVE_MASKS_COMBINED,
BLACK_PAWN_MOVE_MASKS_COMBINED,
WHITE_PAWN_MOVE_MASKS_COMBINED,
WHITE_PAWN_MOVE_MASKS_COMBINED,
WHITE_PAWN_MOVE_MASKS_COMBINED,
WHITE_PAWN_MOVE_MASKS_COMBINED,
WHITE_PAWN_MOVE_MASKS_COMBINED,
ROOK_MOVE_MASKS_COMBINED,
KNIGHT_MOVE_MASKS_COMBINED,
BISHOP_MOVE_MASKS_COMBINED,
QUEEN_MOVE_MASKS_COMBINED,
KING_MOVE_MASKS_COMBINED
};
static std::unordered_map<unsigned int, unsigned int> my_player_index{
{1, 10},
{2, 0}
};
static std::unordered_map<unsigned int, unsigned int> opponent_player_index{
{1, 0},
{2, 10}
};
static std::unordered_map<unsigned int, unsigned int> opponent{
{1, 2},
{2, 1}
};
'''
header_file += '#endif // BITBOARD_TABLES_H'
print(header_file)
//
// Created by Michael Lane on 6/2/17.
// This file requires the use of the --std=c++11 flag when compiling.
//
#ifndef BITBOARD_TABLES_H
#define BITBOARD_TABLES_H
#include <vector>
#include <tuple>
#include <unordered_map>
#include <string>
#include <map>
#include <queue>
#define BLACK_KING 0
#define WHITE_KING 19
#define MOVE_NUMBER 20
#define PLAYER_ON_MOVE 21
#define LOCATION_OF_OPPONENTS 22
#define LOCATION_OF_EMPTY 23
#define TIME_LEFT 24
typedef std::unordered_map<unsigned int, std::vector<unsigned int>> Attack_Masks;
typedef std::unordered_map<unsigned int, std::vector<unsigned int>> Move_Masks;
typedef std::unordered_map<unsigned int, std::string> Int_to_Str;
typedef std::unordered_map<unsigned int, int> Int_to_Idx;
typedef std::unordered_map<unsigned int, std::unordered_map<unsigned int, unsigned int>> Shadow_Mask;
typedef std::vector<unsigned int> State_t;
static unsigned int BLACK_IDX = 0;
static unsigned int WHITE_IDX = 10;
enum player : int {
BLACK = 1,
WHITE = 2
};
static Int_to_Idx TO_IDX = {
{1610612736, 29},
{1342177280, 28},
{1207959552, 27},
{1140850688, 26},
{1107296256, 25},
{1090519040, 24},
{1082130432, 23},
{1077936128, 22},
{1075838976, 21},
{1074790400, 20},
{1074266112, 19},
{1074003968, 18},
{1073872896, 17},
{1073807360, 16},
{1073774592, 15},
{1073758208, 14},
{1073750016, 13},
{1073745920, 12},
{1073743872, 11},
{1073742848, 10},
{1073742336, 9},
{1073742080, 8},
{1073741952, 7},
{1073741888, 6},
{1073741856, 5},
{1073741840, 4},
{1073741832, 3},
{1073741828, 2},
{1073741826, 1},
{1073741825, 0},
{536870912, 29},
{268435456, 28},
{134217728, 27},
{67108864, 26},
{33554432, 25},
{16777216, 24},
{8388608, 23},
{4194304, 22},
{2097152, 21},
{1048576, 20},
{524288, 19},
{262144, 18},
{131072, 17},
{65536, 16},
{32768, 15},
{16384, 14},
{8192, 13},
{4096, 12},
{2048, 11},
{1024, 10},
{512, 9},
{256, 8},
{128, 7},
{64, 6},
{32, 5},
{16, 4},
{8, 3},
{4, 2},
{2, 1},
{1, 0},
};
static Int_to_Str TO_STR = {
{1610612736, "a6"},
{1342177280, "b6"},
{1207959552, "c6"},
{1140850688, "d6"},
{1107296256, "e6"},
{1090519040, "a5"},
{1082130432, "b5"},
{1077936128, "c5"},
{1075838976, "d5"},
{1074790400, "e5"},
{1074266112, "a4"},
{1074003968, "b4"},
{1073872896, "c4"},
{1073807360, "d4"},
{1073774592, "e4"},
{1073758208, "a3"},
{1073750016, "b3"},
{1073745920, "c3"},
{1073743872, "d3"},
{1073742848, "e3"},
{1073742336, "a2"},
{1073742080, "b2"},
{1073741952, "c2"},
{1073741888, "d2"},
{1073741856, "e2"},
{1073741840, "a1"},
{1073741832, "b1"},
{1073741828, "c1"},
{1073741826, "d1"},
{1073741825, "e1"},
{536870912, "a6"},
{268435456, "b6"},
{134217728, "c6"},
{67108864, "d6"},
{33554432, "e6"},
{16777216, "a5"},
{8388608, "b5"},
{4194304, "c5"},
{2097152, "d5"},
{1048576, "e5"},
{524288, "a4"},
{262144, "b4"},
{131072, "c4"},
{65536, "d4"},
{32768, "e4"},
{16384, "a3"},
{8192, "b3"},
{4096, "c3"},
{2048, "d3"},
{1024, "e3"},
{512, "a2"},
{256, "b2"},
{128, "c2"},
{64, "d2"},
{32, "e2"},
{16, "a1"},
{8, "b1"},
{4, "c1"},
{2, "d1"},
{1, "e1"},
};
static Attack_Masks KING_ATTACK_MASKS = {
{536870912, {268435456, 16777216, 8388608}},
{268435456, {536870912, 134217728, 16777216, 8388608, 4194304}},
{134217728, {268435456, 67108864, 8388608, 4194304, 2097152}},
{67108864, {134217728, 33554432, 4194304, 2097152, 1048576}},
{33554432, {67108864, 2097152, 1048576}},
{16777216, {536870912, 268435456, 8388608, 524288, 262144}},
{8388608, {536870912, 268435456, 134217728, 16777216, 4194304, 524288, 262144, 131072}},
{4194304, {268435456, 134217728, 67108864, 8388608, 2097152, 262144, 131072, 65536}},
{2097152, {134217728, 67108864, 33554432, 4194304, 1048576, 131072, 65536, 32768}},
{1048576, {67108864, 33554432, 2097152, 65536, 32768}},
{524288, {16777216, 8388608, 262144, 16384, 8192}},
{262144, {16777216, 8388608, 4194304, 524288, 131072, 16384, 8192, 4096}},
{131072, {8388608, 4194304, 2097152, 262144, 65536, 8192, 4096, 2048}},
{65536, {4194304, 2097152, 1048576, 131072, 32768, 4096, 2048, 1024}},
{32768, {2097152, 1048576, 65536, 2048, 1024}},
{16384, {524288, 262144, 8192, 512, 256}},
{8192, {524288, 262144, 131072, 16384, 4096, 512, 256, 128}},
{4096, {262144, 131072, 65536, 8192, 2048, 256, 128, 64}},
{2048, {131072, 65536, 32768, 4096, 1024, 128, 64, 32}},
{1024, {65536, 32768, 2048, 64, 32}},
{512, {16384, 8192, 256, 16, 8}},
{256, {16384, 8192, 4096, 512, 128, 16, 8, 4}},
{128, {8192, 4096, 2048, 256, 64, 8, 4, 2}},
{64, {4096, 2048, 1024, 128, 32, 4, 2, 1}},
{32, {2048, 1024, 64, 2, 1}},
{16, {512, 256, 8}},
{8, {512, 256, 128, 16, 4}},
{4, {256, 128, 64, 8, 2}},
{2, {128, 64, 32, 4, 1}},
{1, {64, 32, 2}},
};
static Attack_Masks QUEEN_ATTACK_MASKS = {
{536870912, {268435456, 134217728, 67108864, 33554432, 16777216, 8388608, 524288, 131072, 16384, 2048, 512, 32, 16}},
{268435456, {536870912, 134217728, 67108864, 33554432, 16777216, 8388608, 4194304, 262144, 65536, 8192, 1024, 256, 8}},
{134217728, {536870912, 268435456, 67108864, 33554432, 8388608, 4194304, 2097152, 524288, 131072, 32768, 4096, 128, 4}},
{67108864, {536870912, 268435456, 134217728, 33554432, 4194304, 2097152, 1048576, 262144, 65536, 16384, 2048, 64, 2}},
{33554432, {536870912, 268435456, 134217728, 67108864, 2097152, 1048576, 131072, 32768, 8192, 1024, 512, 32, 1}},
{16777216, {536870912, 268435456, 8388608, 4194304, 2097152, 1048576, 524288, 262144, 16384, 4096, 512, 64, 16, 1}},
{8388608, {536870912, 268435456, 134217728, 16777216, 4194304, 2097152, 1048576, 524288, 262144, 131072, 8192, 2048, 256, 32, 8}},
{4194304, {268435456, 134217728, 67108864, 16777216, 8388608, 2097152, 1048576, 262144, 131072, 65536, 16384, 4096, 1024, 128, 4}},
{2097152, {134217728, 67108864, 33554432, 16777216, 8388608, 4194304, 1048576, 131072, 65536, 32768, 8192, 2048, 512, 64, 2}},
{1048576, {67108864, 33554432, 16777216, 8388608, 4194304, 2097152, 65536, 32768, 4096, 1024, 256, 32, 16, 1}},
{524288, {536870912, 134217728, 16777216, 8388608, 262144, 131072, 65536, 32768, 16384, 8192, 512, 128, 16, 2}},
{262144, {268435456, 67108864, 16777216, 8388608, 4194304, 524288, 131072, 65536, 32768, 16384, 8192, 4096, 256, 64, 8, 1}},
{131072, {536870912, 134217728, 33554432, 8388608, 4194304, 2097152, 524288, 262144, 65536, 32768, 8192, 4096, 2048, 512, 128, 32, 4}},
{65536, {268435456, 67108864, 4194304, 2097152, 1048576, 524288, 262144, 131072, 32768, 4096, 2048, 1024, 256, 64, 16, 2}},
{32768, {134217728, 33554432, 2097152, 1048576, 524288, 262144, 131072, 65536, 2048, 1024, 128, 32, 8, 1}},
{16384, {536870912, 67108864, 16777216, 4194304, 524288, 262144, 8192, 4096, 2048, 1024, 512, 256, 16, 4}},
{8192, {268435456, 33554432, 8388608, 2097152, 524288, 262144, 131072, 16384, 4096, 2048, 1024, 512, 256, 128, 8, 2}},
{4096, {134217728, 16777216, 4194304, 1048576, 262144, 131072, 65536, 16384, 8192, 2048, 1024, 256, 128, 64, 16, 4, 1}},
{2048, {536870912, 67108864, 8388608, 2097152, 131072, 65536, 32768, 16384, 8192, 4096, 1024, 128, 64, 32, 8, 2}},
{1024, {268435456, 33554432, 4194304, 1048576, 65536, 32768, 16384, 8192, 4096, 2048, 64, 32, 4, 1}},
{512, {536870912, 33554432, 16777216, 2097152, 524288, 131072, 16384, 8192, 256, 128, 64, 32, 16, 8}},
{256, {268435456, 8388608, 1048576, 262144, 65536, 16384, 8192, 4096, 512, 128, 64, 32, 16, 8, 4}},
{128, {134217728, 4194304, 524288, 131072, 32768, 8192, 4096, 2048, 512, 256, 64, 32, 8, 4, 2}},
{64, {67108864, 16777216, 2097152, 262144, 65536, 4096, 2048, 1024, 512, 256, 128, 32, 4, 2, 1}},
{32, {536870912, 33554432, 8388608, 1048576, 131072, 32768, 2048, 1024, 512, 256, 128, 64, 2, 1}},
{16, {536870912, 16777216, 1048576, 524288, 65536, 16384, 4096, 512, 256, 8, 4, 2, 1}},
{8, {268435456, 8388608, 262144, 32768, 8192, 2048, 512, 256, 128, 16, 4, 2, 1}},
{4, {134217728, 4194304, 131072, 16384, 4096, 1024, 256, 128, 64, 16, 8, 2, 1}},
{2, {67108864, 2097152, 524288, 65536, 8192, 2048, 128, 64, 32, 16, 8, 4, 1}},
{1, {33554432, 16777216, 1048576, 262144, 32768, 4096, 1024, 64, 32, 16, 8, 4, 2}},
};
static Attack_Masks BISHOP_ATTACK_MASKS = {
{536870912, {8388608, 131072, 2048, 32}},
{268435456, {16777216, 4194304, 65536, 1024}},
{134217728, {8388608, 2097152, 524288, 32768}},
{67108864, {4194304, 1048576, 262144, 16384}},
{33554432, {2097152, 131072, 8192, 512}},
{16777216, {268435456, 262144, 4096, 64, 1}},
{8388608, {536870912, 134217728, 524288, 131072, 2048, 32}},
{4194304, {268435456, 67108864, 262144, 65536, 16384, 1024}},
{2097152, {134217728, 33554432, 131072, 32768, 8192, 512}},
{1048576, {67108864, 65536, 4096, 256, 16}},
{524288, {134217728, 8388608, 8192, 128, 2}},
{262144, {67108864, 16777216, 4194304, 16384, 4096, 64, 1}},
{131072, {536870912, 33554432, 8388608, 2097152, 8192, 2048, 512, 32}},
{65536, {268435456, 4194304, 1048576, 4096, 1024, 256, 16}},
{32768, {134217728, 2097152, 2048, 128, 8}},
{16384, {67108864, 4194304, 262144, 256, 4}},
{8192, {33554432, 2097152, 524288, 131072, 512, 128, 2}},
{4096, {16777216, 1048576, 262144, 65536, 256, 64, 16, 1}},
{2048, {536870912, 8388608, 131072, 32768, 128, 32, 8}},
{1024, {268435456, 4194304, 65536, 64, 4}},
{512, {33554432, 2097152, 131072, 8192, 8}},
{256, {1048576, 65536, 16384, 4096, 16, 4}},
{128, {524288, 32768, 8192, 2048, 8, 2}},
{64, {16777216, 262144, 4096, 1024, 4, 1}},
{32, {536870912, 8388608, 131072, 2048, 2}},
{16, {1048576, 65536, 4096, 256}},
{8, {32768, 2048, 512, 128}},
{4, {16384, 1024, 256, 64}},
{2, {524288, 8192, 128, 32}},
{1, {16777216, 262144, 4096, 64}},
};
static Attack_Masks KNIGHT_ATTACK_MASKS = {
{536870912, {4194304, 262144}},
{268435456, {2097152, 524288, 131072}},
{134217728, {16777216, 1048576, 262144, 65536}},
{67108864, {8388608, 131072, 32768}},
{33554432, {4194304, 65536}},
{16777216, {134217728, 131072, 8192}},
{8388608, {67108864, 65536, 16384, 4096}},
{4194304, {536870912, 33554432, 524288, 32768, 8192, 2048}},
{2097152, {268435456, 262144, 4096, 1024}},
{1048576, {134217728, 131072, 2048}},
{524288, {268435456, 4194304, 4096, 256}},
{262144, {536870912, 134217728, 2097152, 2048, 512, 128}},
{131072, {268435456, 67108864, 16777216, 1048576, 16384, 1024, 256, 64}},
{65536, {134217728, 33554432, 8388608, 8192, 128, 32}},
{32768, {67108864, 4194304, 4096, 64}},
{16384, {8388608, 131072, 128, 8}},
{8192, {16777216, 4194304, 65536, 64, 16, 4}},
{4096, {8388608, 2097152, 524288, 32768, 512, 32, 8, 2}},
{2048, {4194304, 1048576, 262144, 256, 4, 1}},
{1024, {2097152, 131072, 128, 2}},
{512, {262144, 4096, 4}},
{256, {524288, 131072, 2048, 2}},
{128, {262144, 65536, 16384, 1024, 16, 1}},
{64, {131072, 32768, 8192, 8}},
{32, {65536, 4096, 4}},
{16, {8192, 128}},
{8, {16384, 4096, 64}},
{4, {8192, 2048, 512, 32}},
{2, {4096, 1024, 256}},
{1, {2048, 128}},
};
static Attack_Masks ROOK_ATTACK_MASKS = {
{536870912, {268435456, 134217728, 67108864, 33554432, 16777216, 524288, 16384, 512, 16}},
{268435456, {536870912, 134217728, 67108864, 33554432, 8388608, 262144, 8192, 256, 8}},
{134217728, {536870912, 268435456, 67108864, 33554432, 4194304, 131072, 4096, 128, 4}},
{67108864, {536870912, 268435456, 134217728, 33554432, 2097152, 65536, 2048, 64, 2}},
{33554432, {536870912, 268435456, 134217728, 67108864, 1048576, 32768, 1024, 32, 1}},
{16777216, {536870912, 8388608, 4194304, 2097152, 1048576, 524288, 16384, 512, 16}},
{8388608, {268435456, 16777216, 4194304, 2097152, 1048576, 262144, 8192, 256, 8}},
{4194304, {134217728, 16777216, 8388608, 2097152, 1048576, 131072, 4096, 128, 4}},
{2097152, {67108864, 16777216, 8388608, 4194304, 1048576, 65536, 2048, 64, 2}},
{1048576, {33554432, 16777216, 8388608, 4194304, 2097152, 32768, 1024, 32, 1}},
{524288, {536870912, 16777216, 262144, 131072, 65536, 32768, 16384, 512, 16}},
{262144, {268435456, 8388608, 524288, 131072, 65536, 32768, 8192, 256, 8}},
{131072, {134217728, 4194304, 524288, 262144, 65536, 32768, 4096, 128, 4}},
{65536, {67108864, 2097152, 524288, 262144, 131072, 32768, 2048, 64, 2}},
{32768, {33554432, 1048576, 524288, 262144, 131072, 65536, 1024, 32, 1}},
{16384, {536870912, 16777216, 524288, 8192, 4096, 2048, 1024, 512, 16}},
{8192, {268435456, 8388608, 262144, 16384, 4096, 2048, 1024, 256, 8}},
{4096, {134217728, 4194304, 131072, 16384, 8192, 2048, 1024, 128, 4}},
{2048, {67108864, 2097152, 65536, 16384, 8192, 4096, 1024, 64, 2}},
{1024, {33554432, 1048576, 32768, 16384, 8192, 4096, 2048, 32, 1}},
{512, {536870912, 16777216, 524288, 16384, 256, 128, 64, 32, 16}},
{256, {268435456, 8388608, 262144, 8192, 512, 128, 64, 32, 8}},
{128, {134217728, 4194304, 131072, 4096, 512, 256, 64, 32, 4}},
{64, {67108864, 2097152, 65536, 2048, 512, 256, 128, 32, 2}},
{32, {33554432, 1048576, 32768, 1024, 512, 256, 128, 64, 1}},
{16, {536870912, 16777216, 524288, 16384, 512, 8, 4, 2, 1}},
{8, {268435456, 8388608, 262144, 8192, 256, 16, 4, 2, 1}},
{4, {134217728, 4194304, 131072, 4096, 128, 16, 8, 2, 1}},
{2, {67108864, 2097152, 65536, 2048, 64, 16, 8, 4, 1}},
{1, {33554432, 1048576, 32768, 1024, 32, 16, 8, 4, 2}},
};
static Attack_Masks BLACK_PAWN_ATTACK_MASKS = {
{1610612736, {268435456, 134217728, 67108864, 33554432, 16777216, 8388608, 524288, 131072, 16384, 2048, 512, 32, 16}},
{1342177280, {536870912, 134217728, 67108864, 33554432, 16777216, 8388608, 4194304, 262144, 65536, 8192, 1024, 256, 8}},
{1207959552, {536870912, 268435456, 67108864, 33554432, 8388608, 4194304, 2097152, 524288, 131072, 32768, 4096, 128, 4}},
{1140850688, {536870912, 268435456, 134217728, 33554432, 4194304, 2097152, 1048576, 262144, 65536, 16384, 2048, 64, 2}},
{1107296256, {536870912, 268435456, 134217728, 67108864, 2097152, 1048576, 131072, 32768, 8192, 1024, 512, 32, 1}},
{1090519040, {536870912, 268435456, 8388608, 4194304, 2097152, 1048576, 524288, 262144, 16384, 4096, 512, 64, 16, 1}},
{1082130432, {536870912, 268435456, 134217728, 16777216, 4194304, 2097152, 1048576, 524288, 262144, 131072, 8192, 2048, 256, 32, 8}},
{1077936128, {268435456, 134217728, 67108864, 16777216, 8388608, 2097152, 1048576, 262144, 131072, 65536, 16384, 4096, 1024, 128, 4}},
{1075838976, {134217728, 67108864, 33554432, 16777216, 8388608, 4194304, 1048576, 131072, 65536, 32768, 8192, 2048, 512, 64, 2}},
{1074790400, {67108864, 33554432, 16777216, 8388608, 4194304, 2097152, 65536, 32768, 4096, 1024, 256, 32, 16, 1}},
{1074266112, {536870912, 134217728, 16777216, 8388608, 262144, 131072, 65536, 32768, 16384, 8192, 512, 128, 16, 2}},
{1074003968, {268435456, 67108864, 16777216, 8388608, 4194304, 524288, 131072, 65536, 32768, 16384, 8192, 4096, 256, 64, 8, 1}},
{1073872896, {536870912, 134217728, 33554432, 8388608, 4194304, 2097152, 524288, 262144, 65536, 32768, 8192, 4096, 2048, 512, 128, 32, 4}},
{1073807360, {268435456, 67108864, 4194304, 2097152, 1048576, 524288, 262144, 131072, 32768, 4096, 2048, 1024, 256, 64, 16, 2}},
{1073774592, {134217728, 33554432, 2097152, 1048576, 524288, 262144, 131072, 65536, 2048, 1024, 128, 32, 8, 1}},
{1073758208, {536870912, 67108864, 16777216, 4194304, 524288, 262144, 8192, 4096, 2048, 1024, 512, 256, 16, 4}},
{1073750016, {268435456, 33554432, 8388608, 2097152, 524288, 262144, 131072, 16384, 4096, 2048, 1024, 512, 256, 128, 8, 2}},
{1073745920, {134217728, 16777216, 4194304, 1048576, 262144, 131072, 65536, 16384, 8192, 2048, 1024, 256, 128, 64, 16, 4, 1}},
{1073743872, {536870912, 67108864, 8388608, 2097152, 131072, 65536, 32768, 16384, 8192, 4096, 1024, 128, 64, 32, 8, 2}},
{1073742848, {268435456, 33554432, 4194304, 1048576, 65536, 32768, 16384, 8192, 4096, 2048, 64, 32, 4, 1}},
{1073742336, {536870912, 33554432, 16777216, 2097152, 524288, 131072, 16384, 8192, 256, 128, 64, 32, 16, 8}},
{1073742080, {268435456, 8388608, 1048576, 262144, 65536, 16384, 8192, 4096, 512, 128, 64, 32, 16, 8, 4}},
{1073741952, {134217728, 4194304, 524288, 131072, 32768, 8192, 4096, 2048, 512, 256, 64, 32, 8, 4, 2}},
{1073741888, {67108864, 16777216, 2097152, 262144, 65536, 4096, 2048, 1024, 512, 256, 128, 32, 4, 2, 1}},
{1073741856, {536870912, 33554432, 8388608, 1048576, 131072, 32768, 2048, 1024, 512, 256, 128, 64, 2, 1}},
{1073741840, {536870912, 16777216, 1048576, 524288, 65536, 16384, 4096, 512, 256, 8, 4, 2, 1}},
{1073741832, {268435456, 8388608, 262144, 32768, 8192, 2048, 512, 256, 128, 16, 4, 2, 1}},
{1073741828, {134217728, 4194304, 131072, 16384, 4096, 1024, 256, 128, 64, 16, 8, 2, 1}},
{1073741826, {67108864, 2097152, 524288, 65536, 8192, 2048, 128, 64, 32, 16, 8, 4, 1}},
{1073741825, {33554432, 16777216, 1048576, 262144, 32768, 4096, 1024, 64, 32, 16, 8, 4, 2}},
{536870912, {8388608}},
{268435456, {16777216, 4194304}},
{134217728, {8388608, 2097152}},
{67108864, {4194304, 1048576}},
{33554432, {2097152}},
{16777216, {262144}},
{8388608, {524288, 131072}},
{4194304, {262144, 65536}},
{2097152, {131072, 32768}},
{1048576, {65536}},
{524288, {8192}},
{262144, {16384, 4096}},
{131072, {8192, 2048}},
{65536, {4096, 1024}},
{32768, {2048}},
{16384, {256}},
{8192, {512, 128}},
{4096, {256, 64}},
{2048, {128, 32}},
{1024, {64}},
{512, {8}},
{256, {16, 4}},
{128, {8, 2}},
{64, {4, 1}},
{32, {2}},
};
static Attack_Masks WHITE_PAWN_ATTACK_MASKS = {
{1610612736, {268435456, 134217728, 67108864, 33554432, 16777216, 8388608, 524288, 131072, 16384, 2048, 512, 32, 16}},
{1342177280, {536870912, 134217728, 67108864, 33554432, 16777216, 8388608, 4194304, 262144, 65536, 8192, 1024, 256, 8}},
{1207959552, {536870912, 268435456, 67108864, 33554432, 8388608, 4194304, 2097152, 524288, 131072, 32768, 4096, 128, 4}},
{1140850688, {536870912, 268435456, 134217728, 33554432, 4194304, 2097152, 1048576, 262144, 65536, 16384, 2048, 64, 2}},
{1107296256, {536870912, 268435456, 134217728, 67108864, 2097152, 1048576, 131072, 32768, 8192, 1024, 512, 32, 1}},
{1090519040, {536870912, 268435456, 8388608, 4194304, 2097152, 1048576, 524288, 262144, 16384, 4096, 512, 64, 16, 1}},
{1082130432, {536870912, 268435456, 134217728, 16777216, 4194304, 2097152, 1048576, 524288, 262144, 131072, 8192, 2048, 256, 32, 8}},
{1077936128, {268435456, 134217728, 67108864, 16777216, 8388608, 2097152, 1048576, 262144, 131072, 65536, 16384, 4096, 1024, 128, 4}},
{1075838976, {134217728, 67108864, 33554432, 16777216, 8388608, 4194304, 1048576, 131072, 65536, 32768, 8192, 2048, 512, 64, 2}},
{1074790400, {67108864, 33554432, 16777216, 8388608, 4194304, 2097152, 65536, 32768, 4096, 1024, 256, 32, 16, 1}},
{1074266112, {536870912, 134217728, 16777216, 8388608, 262144, 131072, 65536, 32768, 16384, 8192, 512, 128, 16, 2}},
{1074003968, {268435456, 67108864, 16777216, 8388608, 4194304, 524288, 131072, 65536, 32768, 16384, 8192, 4096, 256, 64, 8, 1}},
{1073872896, {536870912, 134217728, 33554432, 8388608, 4194304, 2097152, 524288, 262144, 65536, 32768, 8192, 4096, 2048, 512, 128, 32, 4}},
{1073807360, {268435456, 67108864, 4194304, 2097152, 1048576, 524288, 262144, 131072, 32768, 4096, 2048, 1024, 256, 64, 16, 2}},
{1073774592, {134217728, 33554432, 2097152, 1048576, 524288, 262144, 131072, 65536, 2048, 1024, 128, 32, 8, 1}},
{1073758208, {536870912, 67108864, 16777216, 4194304, 524288, 262144, 8192, 4096, 2048, 1024, 512, 256, 16, 4}},
{1073750016, {268435456, 33554432, 8388608, 2097152, 524288, 262144, 131072, 16384, 4096, 2048, 1024, 512, 256, 128, 8, 2}},
{1073745920, {134217728, 16777216, 4194304, 1048576, 262144, 131072, 65536, 16384, 8192, 2048, 1024, 256, 128, 64, 16, 4, 1}},
{1073743872, {536870912, 67108864, 8388608, 2097152, 131072, 65536, 32768, 16384, 8192, 4096, 1024, 128, 64, 32, 8, 2}},
{1073742848, {268435456, 33554432, 4194304, 1048576, 65536, 32768, 16384, 8192, 4096, 2048, 64, 32, 4, 1}},
{1073742336, {536870912, 33554432, 16777216, 2097152, 524288, 131072, 16384, 8192, 256, 128, 64, 32, 16, 8}},
{1073742080, {268435456, 8388608, 1048576, 262144, 65536, 16384, 8192, 4096, 512, 128, 64, 32, 16, 8, 4}},
{1073741952, {134217728, 4194304, 524288, 131072, 32768, 8192, 4096, 2048, 512, 256, 64, 32, 8, 4, 2}},
{1073741888, {67108864, 16777216, 2097152, 262144, 65536, 4096, 2048, 1024, 512, 256, 128, 32, 4, 2, 1}},
{1073741856, {536870912, 33554432, 8388608, 1048576, 131072, 32768, 2048, 1024, 512, 256, 128, 64, 2, 1}},
{1073741840, {536870912, 16777216, 1048576, 524288, 65536, 16384, 4096, 512, 256, 8, 4, 2, 1}},
{1073741832, {268435456, 8388608, 262144, 32768, 8192, 2048, 512, 256, 128, 16, 4, 2, 1}},
{1073741828, {134217728, 4194304, 131072, 16384, 4096, 1024, 256, 128, 64, 16, 8, 2, 1}},
{1073741826, {67108864, 2097152, 524288, 65536, 8192, 2048, 128, 64, 32, 16, 8, 4, 1}},
{1073741825, {33554432, 16777216, 1048576, 262144, 32768, 4096, 1024, 64, 32, 16, 8, 4, 2}},
{16777216, {268435456}},
{8388608, {536870912, 134217728}},
{4194304, {268435456, 67108864}},
{2097152, {134217728, 33554432}},
{1048576, {67108864}},
{524288, {8388608}},
{262144, {16777216, 4194304}},
{131072, {8388608, 2097152}},
{65536, {4194304, 1048576}},
{32768, {2097152}},
{16384, {262144}},
{8192, {524288, 131072}},
{4096, {262144, 65536}},
{2048, {131072, 32768}},
{1024, {65536}},
{512, {8192}},
{256, {16384, 4096}},
{128, {8192, 2048}},
{64, {4096, 1024}},
{32, {2048}},
{16, {256}},
{8, {512, 128}},
{4, {256, 64}},
{2, {128, 32}},
{1, {64}},
};
static std::unordered_map<unsigned int, unsigned int> KING_ATTACK_MASKS_COMBINED = {
{536870912, 830472192},
{268435456, 968884224},
{134217728, 484442112},
{67108864, 242221056},
{33554432, 103809024},
{16777216, 831258624},
{8388608, 969801728},
{4194304, 484900864},
{2097152, 242450432},
{1048576, 103907328},
{524288, 25976832},
{262144, 30306304},
{131072, 15153152},
{65536, 7576576},
{32768, 3247104},
{16384, 811776},
{8192, 947072},
{4096, 473536},
{2048, 236768},
{1024, 101472},
{512, 25368},
{256, 29596},
{128, 14798},
{64, 7399},
{32, 3171},
{16, 792},
{8, 924},
{4, 462},
{2, 231},
{1, 99},
};
static std::unordered_map<unsigned int, unsigned int> QUEEN_ATTACK_MASKS_COMBINED = {
{536870912, 1066027568},
{268435456, 1069884680},
{134217728, 1055559812},
{67108864, 1047873602},
{33554432, 1043506721},
{16777216, 838619729},
{8388608, 972957992},
{4194304, 502748292},
{2097152, 267627074},
{1048576, 133272881},
{524288, 697295506},
{262144, 365949257},
{131072, 720353956},
{65536, 343907666},
{32768, 171936937},
{16384, 625770260},
{8192, 313425802},
{4096, 156728789},
{2048, 614726890},
{1024, 307362917},
{512, 589980664},
{256, 278230012},
{128, 139115502},
{64, 86319079},
{32, 580030435},
{16, 555307807},
{8, 277130143},
{4, 138565087},
{2, 69806335},
{1, 51680383},
};
static std::unordered_map<unsigned int, unsigned int> BISHOP_ATTACK_MASKS_COMBINED = {
{536870912, 545392672},
{268435456, 289473536},
{134217728, 145260544},
{67108864, 72630272},
{33554432, 35791360},
{16777216, 285478977},
{8388608, 680134688},
{4194304, 340083712},
{2097152, 170041856},
{1048576, 68227344},
{524288, 143138946},
{262144, 88363073},
{131072, 581052960},
{65536, 273749264},
{32768, 136349832},
{16384, 71581956},
{8192, 36315778},
{4096, 18157905},
{2048, 545425576},
{1024, 272696388},
{512, 35791368},
{256, 1134868},
{128, 567434},
{64, 17044549},
{32, 545392674},
{16, 1118480},
{8, 35464},
{4, 17732},
{2, 532642},
{1, 17043521},
};
static std::unordered_map<unsigned int, unsigned int> KNIGHT_ATTACK_MASKS_COMBINED = {
{536870912, 541327360},
{268435456, 271187968},
{134217728, 152371200},
{67108864, 75661312},
{33554432, 37814272},
{16777216, 151134208},
{8388608, 75583488},
{4194304, 575186944},
{2097152, 270799872},
{1048576, 135399424},
{524288, 273158400},
{262144, 673450624},
{131072, 353518912},
{65536, 176234656},
{32768, 71340096},
{16384, 8536200},
{8192, 21045332},
{4096, 11047466},
{2048, 5507333},
{1024, 2229378},
{512, 266756},
{256, 657666},
{128, 345233},
{64, 172104},
{32, 69668},
{16, 8336},
{8, 20552},
{4, 10788},
{2, 5378},
{1, 2177},
};
static std::unordered_map<unsigned int, unsigned int> ROOK_ATTACK_MASKS_COMBINED = {
{536870912, 1057505808},
{268435456, 1048846600},
{134217728, 1044516996},
{67108864, 1042352194},
{33554432, 1041269793},
{16777216, 569917968},
{8388608, 301211912},
{4194304, 166858884},
{2097152, 99682370},
{1048576, 66094113},
{524288, 554680848},
{262144, 277848328},
{131072, 139432068},
{65536, 70223938},
{32768, 35619873},
{16384, 554204688},
{8192, 277118216},
{4096, 138574980},
{2048, 69303362},
{1024, 34667553},
{512, 554189808},
{256, 277095400},
{128, 138548196},
{64, 69274594},
{32, 34637793},
{16, 554189343},
{8, 277094687},
{4, 138547359},
{2, 69273695},
{1, 34636863},
};
static std::unordered_map<unsigned int, unsigned int> BLACK_PAWN_ATTACK_MASKS_COMBINED = {
{536870912, 545259520},
{268435456, 289406976},
{134217728, 144703488},
{67108864, 72351744},
{33554432, 35651584},
{16777216, 17039360},
{8388608, 9043968},
{4194304, 4521984},
{2097152, 2260992},
{1048576, 1114112},
{524288, 532480},
{262144, 282624},
{131072, 141312},
{65536, 70656},
{32768, 34816},
{16384, 16640},
{8192, 8832},
{4096, 4416},
{2048, 2208},
{1024, 1088},
{512, 520},
{256, 276},
{128, 138},
{64, 69},
{32, 34},
{16, 16},
{8, 8},
{4, 4},
{2, 2},
{1, 1},
};
static std::unordered_map<unsigned int, unsigned int> WHITE_PAWN_ATTACK_MASKS_COMBINED = {
{536870912, 536870912},
{268435456, 268435456},
{134217728, 134217728},
{67108864, 67108864},
{33554432, 33554432},
{16777216, 285212672},
{8388608, 679477248},
{4194304, 339738624},
{2097152, 169869312},
{1048576, 68157440},
{524288, 8912896},
{262144, 21233664},
{131072, 10616832},
{65536, 5308416},
{32768, 2129920},
{16384, 278528},
{8192, 663552},
{4096, 331776},
{2048, 165888},
{1024, 66560},
{512, 8704},
{256, 20736},
{128, 10368},
{64, 5184},
{32, 2080},
{16, 272},
{8, 648},
{4, 324},
{2, 162},
{1, 65},
};
static Move_Masks KING_MOVE_MASKS = {
{536870912, {268435456, 16777216, 8388608}},
{268435456, {536870912, 134217728, 16777216, 8388608, 4194304}},
{134217728, {268435456, 67108864, 8388608, 4194304, 2097152}},
{67108864, {134217728, 33554432, 4194304, 2097152, 1048576}},
{33554432, {67108864, 2097152, 1048576}},
{16777216, {536870912, 268435456, 8388608, 524288, 262144}},
{8388608, {536870912, 268435456, 134217728, 16777216, 4194304, 524288, 262144, 131072}},
{4194304, {268435456, 134217728, 67108864, 8388608, 2097152, 262144, 131072, 65536}},
{2097152, {134217728, 67108864, 33554432, 4194304, 1048576, 131072, 65536, 32768}},
{1048576, {67108864, 33554432, 2097152, 65536, 32768}},
{524288, {16777216, 8388608, 262144, 16384, 8192}},
{262144, {16777216, 8388608, 4194304, 524288, 131072, 16384, 8192, 4096}},
{131072, {8388608, 4194304, 2097152, 262144, 65536, 8192, 4096, 2048}},
{65536, {4194304, 2097152, 1048576, 131072, 32768, 4096, 2048, 1024}},
{32768, {2097152, 1048576, 65536, 2048, 1024}},
{16384, {524288, 262144, 8192, 512, 256}},
{8192, {524288, 262144, 131072, 16384, 4096, 512, 256, 128}},
{4096, {262144, 131072, 65536, 8192, 2048, 256, 128, 64}},
{2048, {131072, 65536, 32768, 4096, 1024, 128, 64, 32}},
{1024, {65536, 32768, 2048, 64, 32}},
{512, {16384, 8192, 256, 16, 8}},
{256, {16384, 8192, 4096, 512, 128, 16, 8, 4}},
{128, {8192, 4096, 2048, 256, 64, 8, 4, 2}},
{64, {4096, 2048, 1024, 128, 32, 4, 2, 1}},
{32, {2048, 1024, 64, 2, 1}},
{16, {512, 256, 8}},
{8, {512, 256, 128, 16, 4}},
{4, {256, 128, 64, 8, 2}},
{2, {128, 64, 32, 4, 1}},
{1, {64, 32, 2}},
};
static Move_Masks QUEEN_MOVE_MASKS = {
{536870912, {268435456, 134217728, 67108864, 33554432, 16777216, 8388608, 524288, 131072, 16384, 2048, 512, 32, 16}},
{268435456, {536870912, 134217728, 67108864, 33554432, 16777216, 8388608, 4194304, 262144, 65536, 8192, 1024, 256, 8}},
{134217728, {536870912, 268435456, 67108864, 33554432, 8388608, 4194304, 2097152, 524288, 131072, 32768, 4096, 128, 4}},
{67108864, {536870912, 268435456, 134217728, 33554432, 4194304, 2097152, 1048576, 262144, 65536, 16384, 2048, 64, 2}},
{33554432, {536870912, 268435456, 134217728, 67108864, 2097152, 1048576, 131072, 32768, 8192, 1024, 512, 32, 1}},
{16777216, {536870912, 268435456, 8388608, 4194304, 2097152, 1048576, 524288, 262144, 16384, 4096, 512, 64, 16, 1}},
{8388608, {536870912, 268435456, 134217728, 16777216, 4194304, 2097152, 1048576, 524288, 262144, 131072, 8192, 2048, 256, 32, 8}},
{4194304, {268435456, 134217728, 67108864, 16777216, 8388608, 2097152, 1048576, 262144, 131072, 65536, 16384, 4096, 1024, 128, 4}},
{2097152, {134217728, 67108864, 33554432, 16777216, 8388608, 4194304, 1048576, 131072, 65536, 32768, 8192, 2048, 512, 64, 2}},
{1048576, {67108864, 33554432, 16777216, 8388608, 4194304, 2097152, 65536, 32768, 4096, 1024, 256, 32, 16, 1}},
{524288, {536870912, 134217728, 16777216, 8388608, 262144, 131072, 65536, 32768, 16384, 8192, 512, 128, 16, 2}},
{262144, {268435456, 67108864, 16777216, 8388608, 4194304, 524288, 131072, 65536, 32768, 16384, 8192, 4096, 256, 64, 8, 1}},
{131072, {536870912, 134217728, 33554432, 8388608, 4194304, 2097152, 524288, 262144, 65536, 32768, 8192, 4096, 2048, 512, 128, 32, 4}},
{65536, {268435456, 67108864, 4194304, 2097152, 1048576, 524288, 262144, 131072, 32768, 4096, 2048, 1024, 256, 64, 16, 2}},
{32768, {134217728, 33554432, 2097152, 1048576, 524288, 262144, 131072, 65536, 2048, 1024, 128, 32, 8, 1}},
{16384, {536870912, 67108864, 16777216, 4194304, 524288, 262144, 8192, 4096, 2048, 1024, 512, 256, 16, 4}},
{8192, {268435456, 33554432, 8388608, 2097152, 524288, 262144, 131072, 16384, 4096, 2048, 1024, 512, 256, 128, 8, 2}},
{4096, {134217728, 16777216, 4194304, 1048576, 262144, 131072, 65536, 16384, 8192, 2048, 1024, 256, 128, 64, 16, 4, 1}},
{2048, {536870912, 67108864, 8388608, 2097152, 131072, 65536, 32768, 16384, 8192, 4096, 1024, 128, 64, 32, 8, 2}},
{1024, {268435456, 33554432, 4194304, 1048576, 65536, 32768, 16384, 8192, 4096, 2048, 64, 32, 4, 1}},
{512, {536870912, 33554432, 16777216, 2097152, 524288, 131072, 16384, 8192, 256, 128, 64, 32, 16, 8}},
{256, {268435456, 8388608, 1048576, 262144, 65536, 16384, 8192, 4096, 512, 128, 64, 32, 16, 8, 4}},
{128, {134217728, 4194304, 524288, 131072, 32768, 8192, 4096, 2048, 512, 256, 64, 32, 8, 4, 2}},
{64, {67108864, 16777216, 2097152, 262144, 65536, 4096, 2048, 1024, 512, 256, 128, 32, 4, 2, 1}},
{32, {536870912, 33554432, 8388608, 1048576, 131072, 32768, 2048, 1024, 512, 256, 128, 64, 2, 1}},
{16, {536870912, 16777216, 1048576, 524288, 65536, 16384, 4096, 512, 256, 8, 4, 2, 1}},
{8, {268435456, 8388608, 262144, 32768, 8192, 2048, 512, 256, 128, 16, 4, 2, 1}},
{4, {134217728, 4194304, 131072, 16384, 4096, 1024, 256, 128, 64, 16, 8, 2, 1}},
{2, {67108864, 2097152, 524288, 65536, 8192, 2048, 128, 64, 32, 16, 8, 4, 1}},
{1, {33554432, 16777216, 1048576, 262144, 32768, 4096, 1024, 64, 32, 16, 8, 4, 2}},
};
static Move_Masks BISHOP_MOVE_MASKS = {
{536870912, {268435456, 16777216, 8388608, 131072, 2048, 32}},
{268435456, {536870912, 134217728, 16777216, 8388608, 4194304, 65536, 1024}},
{134217728, {268435456, 67108864, 8388608, 4194304, 2097152, 524288, 32768}},
{67108864, {134217728, 33554432, 4194304, 2097152, 1048576, 262144, 16384}},
{33554432, {67108864, 2097152, 1048576, 131072, 8192, 512}},
{16777216, {536870912, 268435456, 8388608, 524288, 262144, 4096, 64, 1}},
{8388608, {536870912, 268435456, 134217728, 16777216, 4194304, 524288, 262144, 131072, 2048, 32}},
{4194304, {268435456, 134217728, 67108864, 8388608, 2097152, 262144, 131072, 65536, 16384, 1024}},
{2097152, {134217728, 67108864, 33554432, 4194304, 1048576, 131072, 65536, 32768, 8192, 512}},
{1048576, {67108864, 33554432, 2097152, 65536, 32768, 4096, 256, 16}},
{524288, {134217728, 16777216, 8388608, 262144, 16384, 8192, 128, 2}},
{262144, {67108864, 16777216, 8388608, 4194304, 524288, 131072, 16384, 8192, 4096, 64, 1}},
{131072, {536870912, 33554432, 8388608, 4194304, 2097152, 262144, 65536, 8192, 4096, 2048, 512, 32}},
{65536, {268435456, 4194304, 2097152, 1048576, 131072, 32768, 4096, 2048, 1024, 256, 16}},
{32768, {134217728, 2097152, 1048576, 65536, 2048, 1024, 128, 8}},
{16384, {67108864, 4194304, 524288, 262144, 8192, 512, 256, 4}},
{8192, {33554432, 2097152, 524288, 262144, 131072, 16384, 4096, 512, 256, 128, 2}},
{4096, {16777216, 1048576, 262144, 131072, 65536, 8192, 2048, 256, 128, 64, 16, 1}},
{2048, {536870912, 8388608, 131072, 65536, 32768, 4096, 1024, 128, 64, 32, 8}},
{1024, {268435456, 4194304, 65536, 32768, 2048, 64, 32, 4}},
{512, {33554432, 2097152, 131072, 16384, 8192, 256, 16, 8}},
{256, {1048576, 65536, 16384, 8192, 4096, 512, 128, 16, 8, 4}},
{128, {524288, 32768, 8192, 4096, 2048, 256, 64, 8, 4, 2}},
{64, {16777216, 262144, 4096, 2048, 1024, 128, 32, 4, 2, 1}},
{32, {536870912, 8388608, 131072, 2048, 1024, 64, 2, 1}},
{16, {1048576, 65536, 4096, 512, 256, 8}},
{8, {32768, 2048, 512, 256, 128, 16, 4}},
{4, {16384, 1024, 256, 128, 64, 8, 2}},
{2, {524288, 8192, 128, 64, 32, 4, 1}},
{1, {16777216, 262144, 4096, 64, 32, 2}},
};
static Move_Masks KNIGHT_MOVE_MASKS = {
{536870912, {4194304, 262144}},
{268435456, {2097152, 524288, 131072}},
{134217728, {16777216, 1048576, 262144, 65536}},
{67108864, {8388608, 131072, 32768}},
{33554432, {4194304, 65536}},
{16777216, {134217728, 131072, 8192}},
{8388608, {67108864, 65536, 16384, 4096}},
{4194304, {536870912, 33554432, 524288, 32768, 8192, 2048}},
{2097152, {268435456, 262144, 4096, 1024}},
{1048576, {134217728, 131072, 2048}},
{524288, {268435456, 4194304, 4096, 256}},
{262144, {536870912, 134217728, 2097152, 2048, 512, 128}},
{131072, {268435456, 67108864, 16777216, 1048576, 16384, 1024, 256, 64}},
{65536, {134217728, 33554432, 8388608, 8192, 128, 32}},
{32768, {67108864, 4194304, 4096, 64}},
{16384, {8388608, 131072, 128, 8}},
{8192, {16777216, 4194304, 65536, 64, 16, 4}},
{4096, {8388608, 2097152, 524288, 32768, 512, 32, 8, 2}},
{2048, {4194304, 1048576, 262144, 256, 4, 1}},
{1024, {2097152, 131072, 128, 2}},
{512, {262144, 4096, 4}},
{256, {524288, 131072, 2048, 2}},
{128, {262144, 65536, 16384, 1024, 16, 1}},
{64, {131072, 32768, 8192, 8}},
{32, {65536, 4096, 4}},
{16, {8192, 128}},
{8, {16384, 4096, 64}},
{4, {8192, 2048, 512, 32}},
{2, {4096, 1024, 256}},
{1, {2048, 128}},
};
static Move_Masks ROOK_MOVE_MASKS = {
{536870912, {268435456, 134217728, 67108864, 33554432, 16777216, 524288, 16384, 512, 16}},
{268435456, {536870912, 134217728, 67108864, 33554432, 8388608, 262144, 8192, 256, 8}},
{134217728, {536870912, 268435456, 67108864, 33554432, 4194304, 131072, 4096, 128, 4}},
{67108864, {536870912, 268435456, 134217728, 33554432, 2097152, 65536, 2048, 64, 2}},
{33554432, {536870912, 268435456, 134217728, 67108864, 1048576, 32768, 1024, 32, 1}},
{16777216, {536870912, 8388608, 4194304, 2097152, 1048576, 524288, 16384, 512, 16}},
{8388608, {268435456, 16777216, 4194304, 2097152, 1048576, 262144, 8192, 256, 8}},
{4194304, {134217728, 16777216, 8388608, 2097152, 1048576, 131072, 4096, 128, 4}},
{2097152, {67108864, 16777216, 8388608, 4194304, 1048576, 65536, 2048, 64, 2}},
{1048576, {33554432, 16777216, 8388608, 4194304, 2097152, 32768, 1024, 32, 1}},
{524288, {536870912, 16777216, 262144, 131072, 65536, 32768, 16384, 512, 16}},
{262144, {268435456, 8388608, 524288, 131072, 65536, 32768, 8192, 256, 8}},
{131072, {134217728, 4194304, 524288, 262144, 65536, 32768, 4096, 128, 4}},
{65536, {67108864, 2097152, 524288, 262144, 131072, 32768, 2048, 64, 2}},
{32768, {33554432, 1048576, 524288, 262144, 131072, 65536, 1024, 32, 1}},
{16384, {536870912, 16777216, 524288, 8192, 4096, 2048, 1024, 512, 16}},
{8192, {268435456, 8388608, 262144, 16384, 4096, 2048, 1024, 256, 8}},
{4096, {134217728, 4194304, 131072, 16384, 8192, 2048, 1024, 128, 4}},
{2048, {67108864, 2097152, 65536, 16384, 8192, 4096, 1024, 64, 2}},
{1024, {33554432, 1048576, 32768, 16384, 8192, 4096, 2048, 32, 1}},
{512, {536870912, 16777216, 524288, 16384, 256, 128, 64, 32, 16}},
{256, {268435456, 8388608, 262144, 8192, 512, 128, 64, 32, 8}},
{128, {134217728, 4194304, 131072, 4096, 512, 256, 64, 32, 4}},
{64, {67108864, 2097152, 65536, 2048, 512, 256, 128, 32, 2}},
{32, {33554432, 1048576, 32768, 1024, 512, 256, 128, 64, 1}},
{16, {536870912, 16777216, 524288, 16384, 512, 8, 4, 2, 1}},
{8, {268435456, 8388608, 262144, 8192, 256, 16, 4, 2, 1}},
{4, {134217728, 4194304, 131072, 4096, 128, 16, 8, 2, 1}},
{2, {67108864, 2097152, 65536, 2048, 64, 16, 8, 4, 1}},
{1, {33554432, 1048576, 32768, 1024, 32, 16, 8, 4, 2}},
};
static Move_Masks BLACK_PAWN_MOVE_MASKS = {
{1610612736, {268435456, 134217728, 67108864, 33554432, 16777216, 8388608, 524288, 131072, 16384, 2048, 512, 32, 16}},
{1342177280, {536870912, 134217728, 67108864, 33554432, 16777216, 8388608, 4194304, 262144, 65536, 8192, 1024, 256, 8}},
{1207959552, {536870912, 268435456, 67108864, 33554432, 8388608, 4194304, 2097152, 524288, 131072, 32768, 4096, 128, 4}},
{1140850688, {536870912, 268435456, 134217728, 33554432, 4194304, 2097152, 1048576, 262144, 65536, 16384, 2048, 64, 2}},
{1107296256, {536870912, 268435456, 134217728, 67108864, 2097152, 1048576, 131072, 32768, 8192, 1024, 512, 32, 1}},
{1090519040, {536870912, 268435456, 8388608, 4194304, 2097152, 1048576, 524288, 262144, 16384, 4096, 512, 64, 16, 1}},
{1082130432, {536870912, 268435456, 134217728, 16777216, 4194304, 2097152, 1048576, 524288, 262144, 131072, 8192, 2048, 256, 32, 8}},
{1077936128, {268435456, 134217728, 67108864, 16777216, 8388608, 2097152, 1048576, 262144, 131072, 65536, 16384, 4096, 1024, 128, 4}},
{1075838976, {134217728, 67108864, 33554432, 16777216, 8388608, 4194304, 1048576, 131072, 65536, 32768, 8192, 2048, 512, 64, 2}},
{1074790400, {67108864, 33554432, 16777216, 8388608, 4194304, 2097152, 65536, 32768, 4096, 1024, 256, 32, 16, 1}},
{1074266112, {536870912, 134217728, 16777216, 8388608, 262144, 131072, 65536, 32768, 16384, 8192, 512, 128, 16, 2}},
{1074003968, {268435456, 67108864, 16777216, 8388608, 4194304, 524288, 131072, 65536, 32768, 16384, 8192, 4096, 256, 64, 8, 1}},
{1073872896, {536870912, 134217728, 33554432, 8388608, 4194304, 2097152, 524288, 262144, 65536, 32768, 8192, 4096, 2048, 512, 128, 32, 4}},
{1073807360, {268435456, 67108864, 4194304, 2097152, 1048576, 524288, 262144, 131072, 32768, 4096, 2048, 1024, 256, 64, 16, 2}},
{1073774592, {134217728, 33554432, 2097152, 1048576, 524288, 262144, 131072, 65536, 2048, 1024, 128, 32, 8, 1}},
{1073758208, {536870912, 67108864, 16777216, 4194304, 524288, 262144, 8192, 4096, 2048, 1024, 512, 256, 16, 4}},
{1073750016, {268435456, 33554432, 8388608, 2097152, 524288, 262144, 131072, 16384, 4096, 2048, 1024, 512, 256, 128, 8, 2}},
{1073745920, {134217728, 16777216, 4194304, 1048576, 262144, 131072, 65536, 16384, 8192, 2048, 1024, 256, 128, 64, 16, 4, 1}},
{1073743872, {536870912, 67108864, 8388608, 2097152, 131072, 65536, 32768, 16384, 8192, 4096, 1024, 128, 64, 32, 8, 2}},
{1073742848, {268435456, 33554432, 4194304, 1048576, 65536, 32768, 16384, 8192, 4096, 2048, 64, 32, 4, 1}},
{1073742336, {536870912, 33554432, 16777216, 2097152, 524288, 131072, 16384, 8192, 256, 128, 64, 32, 16, 8}},
{1073742080, {268435456, 8388608, 1048576, 262144, 65536, 16384, 8192, 4096, 512, 128, 64, 32, 16, 8, 4}},
{1073741952, {134217728, 4194304, 524288, 131072, 32768, 8192, 4096, 2048, 512, 256, 64, 32, 8, 4, 2}},
{1073741888, {67108864, 16777216, 2097152, 262144, 65536, 4096, 2048, 1024, 512, 256, 128, 32, 4, 2, 1}},
{1073741856, {536870912, 33554432, 8388608, 1048576, 131072, 32768, 2048, 1024, 512, 256, 128, 64, 2, 1}},
{1073741840, {536870912, 16777216, 1048576, 524288, 65536, 16384, 4096, 512, 256, 8, 4, 2, 1}},
{1073741832, {268435456, 8388608, 262144, 32768, 8192, 2048, 512, 256, 128, 16, 4, 2, 1}},
{1073741828, {134217728, 4194304, 131072, 16384, 4096, 1024, 256, 128, 64, 16, 8, 2, 1}},
{1073741826, {67108864, 2097152, 524288, 65536, 8192, 2048, 128, 64, 32, 16, 8, 4, 1}},
{1073741825, {33554432, 16777216, 1048576, 262144, 32768, 4096, 1024, 64, 32, 16, 8, 4, 2}},
{536870912, {16777216}},
{268435456, {8388608}},
{134217728, {4194304}},
{67108864, {2097152}},
{33554432, {1048576}},
{16777216, {524288}},
{8388608, {262144}},
{4194304, {131072}},
{2097152, {65536}},
{1048576, {32768}},
{524288, {16384}},
{262144, {8192}},
{131072, {4096}},
{65536, {2048}},
{32768, {1024}},
{16384, {512}},
{8192, {256}},
{4096, {128}},
{2048, {64}},
{1024, {32}},
{512, {16}},
{256, {8}},
{128, {4}},
{64, {2}},
{32, {1}},
};
static Move_Masks WHITE_PAWN_MOVE_MASKS = {
{1610612736, {268435456, 134217728, 67108864, 33554432, 16777216, 8388608, 524288, 131072, 16384, 2048, 512, 32, 16}},
{1342177280, {536870912, 134217728, 67108864, 33554432, 16777216, 8388608, 4194304, 262144, 65536, 8192, 1024, 256, 8}},
{1207959552, {536870912, 268435456, 67108864, 33554432, 8388608, 4194304, 2097152, 524288, 131072, 32768, 4096, 128, 4}},
{1140850688, {536870912, 268435456, 134217728, 33554432, 4194304, 2097152, 1048576, 262144, 65536, 16384, 2048, 64, 2}},
{1107296256, {536870912, 268435456, 134217728, 67108864, 2097152, 1048576, 131072, 32768, 8192, 1024, 512, 32, 1}},
{1090519040, {536870912, 268435456, 8388608, 4194304, 2097152, 1048576, 524288, 262144, 16384, 4096, 512, 64, 16, 1}},
{1082130432, {536870912, 268435456, 134217728, 16777216, 4194304, 2097152, 1048576, 524288, 262144, 131072, 8192, 2048, 256, 32, 8}},
{1077936128, {268435456, 134217728, 67108864, 16777216, 8388608, 2097152, 1048576, 262144, 131072, 65536, 16384, 4096, 1024, 128, 4}},
{1075838976, {134217728, 67108864, 33554432, 16777216, 8388608, 4194304, 1048576, 131072, 65536, 32768, 8192, 2048, 512, 64, 2}},
{1074790400, {67108864, 33554432, 16777216, 8388608, 4194304, 2097152, 65536, 32768, 4096, 1024, 256, 32, 16, 1}},
{1074266112, {536870912, 134217728, 16777216, 8388608, 262144, 131072, 65536, 32768, 16384, 8192, 512, 128, 16, 2}},
{1074003968, {268435456, 67108864, 16777216, 8388608, 4194304, 524288, 131072, 65536, 32768, 16384, 8192, 4096, 256, 64, 8, 1}},
{1073872896, {536870912, 134217728, 33554432, 8388608, 4194304, 2097152, 524288, 262144, 65536, 32768, 8192, 4096, 2048, 512, 128, 32, 4}},
{1073807360, {268435456, 67108864, 4194304, 2097152, 1048576, 524288, 262144, 131072, 32768, 4096, 2048, 1024, 256, 64, 16, 2}},
{1073774592, {134217728, 33554432, 2097152, 1048576, 524288, 262144, 131072, 65536, 2048, 1024, 128, 32, 8, 1}},
{1073758208, {536870912, 67108864, 16777216, 4194304, 524288, 262144, 8192, 4096, 2048, 1024, 512, 256, 16, 4}},
{1073750016, {268435456, 33554432, 8388608, 2097152, 524288, 262144, 131072, 16384, 4096, 2048, 1024, 512, 256, 128, 8, 2}},
{1073745920, {134217728, 16777216, 4194304, 1048576, 262144, 131072, 65536, 16384, 8192, 2048, 1024, 256, 128, 64, 16, 4, 1}},
{1073743872, {536870912, 67108864, 8388608, 2097152, 131072, 65536, 32768, 16384, 8192, 4096, 1024, 128, 64, 32, 8, 2}},
{1073742848, {268435456, 33554432, 4194304, 1048576, 65536, 32768, 16384, 8192, 4096, 2048, 64, 32, 4, 1}},
{1073742336, {536870912, 33554432, 16777216, 2097152, 524288, 131072, 16384, 8192, 256, 128, 64, 32, 16, 8}},
{1073742080, {268435456, 8388608, 1048576, 262144, 65536, 16384, 8192, 4096, 512, 128, 64, 32, 16, 8, 4}},
{1073741952, {134217728, 4194304, 524288, 131072, 32768, 8192, 4096, 2048, 512, 256, 64, 32, 8, 4, 2}},
{1073741888, {67108864, 16777216, 2097152, 262144, 65536, 4096, 2048, 1024, 512, 256, 128, 32, 4, 2, 1}},
{1073741856, {536870912, 33554432, 8388608, 1048576, 131072, 32768, 2048, 1024, 512, 256, 128, 64, 2, 1}},
{1073741840, {536870912, 16777216, 1048576, 524288, 65536, 16384, 4096, 512, 256, 8, 4, 2, 1}},
{1073741832, {268435456, 8388608, 262144, 32768, 8192, 2048, 512, 256, 128, 16, 4, 2, 1}},
{1073741828, {134217728, 4194304, 131072, 16384, 4096, 1024, 256, 128, 64, 16, 8, 2, 1}},
{1073741826, {67108864, 2097152, 524288, 65536, 8192, 2048, 128, 64, 32, 16, 8, 4, 1}},
{1073741825, {33554432, 16777216, 1048576, 262144, 32768, 4096, 1024, 64, 32, 16, 8, 4, 2}},
{16777216, {536870912}},
{8388608, {268435456}},
{4194304, {134217728}},
{2097152, {67108864}},
{1048576, {33554432}},
{524288, {16777216}},
{262144, {8388608}},
{131072, {4194304}},
{65536, {2097152}},
{32768, {1048576}},
{16384, {524288}},
{8192, {262144}},
{4096, {131072}},
{2048, {65536}},
{1024, {32768}},
{512, {16384}},
{256, {8192}},
{128, {4096}},
{64, {2048}},
{32, {1024}},
{16, {512}},
{8, {256}},
{4, {128}},
{2, {64}},
{1, {32}},
};
static std::unordered_map<unsigned int, unsigned int> KING_MOVE_MASKS_COMBINED = {
{536870912, 830472192},
{268435456, 968884224},
{134217728, 484442112},
{67108864, 242221056},
{33554432, 103809024},
{16777216, 831258624},
{8388608, 969801728},
{4194304, 484900864},
{2097152, 242450432},
{1048576, 103907328},
{524288, 25976832},
{262144, 30306304},
{131072, 15153152},
{65536, 7576576},
{32768, 3247104},
{16384, 811776},
{8192, 947072},
{4096, 473536},
{2048, 236768},
{1024, 101472},
{512, 25368},
{256, 29596},
{128, 14798},
{64, 7399},
{32, 3171},
{16, 792},
{8, 924},
{4, 462},
{2, 231},
{1, 99},
};
static std::unordered_map<unsigned int, unsigned int> QUEEN_MOVE_MASKS_COMBINED = {
{536870912, 1066027568},
{268435456, 1069884680},
{134217728, 1055559812},
{67108864, 1047873602},
{33554432, 1043506721},
{16777216, 838619729},
{8388608, 972957992},
{4194304, 502748292},
{2097152, 267627074},
{1048576, 133272881},
{524288, 697295506},
{262144, 365949257},
{131072, 720353956},
{65536, 343907666},
{32768, 171936937},
{16384, 625770260},
{8192, 313425802},
{4096, 156728789},
{2048, 614726890},
{1024, 307362917},
{512, 589980664},
{256, 278230012},
{128, 139115502},
{64, 86319079},
{32, 580030435},
{16, 555307807},
{8, 277130143},
{4, 138565087},
{2, 69806335},
{1, 51680383},
};
static std::unordered_map<unsigned int, unsigned int> BISHOP_MOVE_MASKS_COMBINED = {
{536870912, 830605344},
{268435456, 968950784},
{134217728, 484999168},
{67108864, 242499584},
{33554432, 103948800},
{16777216, 831262785},
{8388608, 969803808},
{4194304, 484918272},
{2097152, 242459136},
{1048576, 103911696},
{524288, 160194690},
{262144, 97415233},
{131072, 585579040},
{65536, 276012304},
{32768, 137464968},
{16384, 72114948},
{8192, 36598658},
{4096, 18299345},
{2048, 545496296},
{1024, 272731236},
{512, 35808024},
{256, 1143708},
{128, 571854},
{64, 17046759},
{32, 545393763},
{16, 1119000},
{8, 35740},
{4, 17870},
{2, 532711},
{1, 17043555},
};
static std::unordered_map<unsigned int, unsigned int> KNIGHT_MOVE_MASKS_COMBINED = {
{536870912, 541327360},
{268435456, 271187968},
{134217728, 152371200},
{67108864, 75661312},
{33554432, 37814272},
{16777216, 151134208},
{8388608, 75583488},
{4194304, 575186944},
{2097152, 270799872},
{1048576, 135399424},
{524288, 273158400},
{262144, 673450624},
{131072, 353518912},
{65536, 176234656},
{32768, 71340096},
{16384, 8536200},
{8192, 21045332},
{4096, 11047466},
{2048, 5507333},
{1024, 2229378},
{512, 266756},
{256, 657666},
{128, 345233},
{64, 172104},
{32, 69668},
{16, 8336},
{8, 20552},
{4, 10788},
{2, 5378},
{1, 2177},
};
static std::unordered_map<unsigned int, unsigned int> ROOK_MOVE_MASKS_COMBINED = {
{536870912, 1057505808},
{268435456, 1048846600},
{134217728, 1044516996},
{67108864, 1042352194},
{33554432, 1041269793},
{16777216, 569917968},
{8388608, 301211912},
{4194304, 166858884},
{2097152, 99682370},
{1048576, 66094113},
{524288, 554680848},
{262144, 277848328},
{131072, 139432068},
{65536, 70223938},
{32768, 35619873},
{16384, 554204688},
{8192, 277118216},
{4096, 138574980},
{2048, 69303362},
{1024, 34667553},
{512, 554189808},
{256, 277095400},
{128, 138548196},
{64, 69274594},
{32, 34637793},
{16, 554189343},
{8, 277094687},
{4, 138547359},
{2, 69273695},
{1, 34636863},
};
static std::unordered_map<unsigned int, unsigned int> BLACK_PAWN_MOVE_MASKS_COMBINED = {
{536870912, 553648128},
{268435456, 276824064},
{134217728, 138412032},
{67108864, 69206016},
{33554432, 34603008},
{16777216, 17301504},
{8388608, 8650752},
{4194304, 4325376},
{2097152, 2162688},
{1048576, 1081344},
{524288, 540672},
{262144, 270336},
{131072, 135168},
{65536, 67584},
{32768, 33792},
{16384, 16896},
{8192, 8448},
{4096, 4224},
{2048, 2112},
{1024, 1056},
{512, 528},
{256, 264},
{128, 132},
{64, 66},
{32, 33},
{16, 16},
{8, 8},
{4, 4},
{2, 2},
{1, 1},
};
static std::unordered_map<unsigned int, unsigned int> WHITE_PAWN_MOVE_MASKS_COMBINED = {
{536870912, 536870912},
{268435456, 268435456},
{134217728, 134217728},
{67108864, 67108864},
{33554432, 33554432},
{16777216, 553648128},
{8388608, 276824064},
{4194304, 138412032},
{2097152, 69206016},
{1048576, 34603008},
{524288, 17301504},
{262144, 8650752},
{131072, 4325376},
{65536, 2162688},
{32768, 1081344},
{16384, 540672},
{8192, 270336},
{4096, 135168},
{2048, 67584},
{1024, 33792},
{512, 16896},
{256, 8448},
{128, 4224},
{64, 2112},
{32, 1056},
{16, 528},
{8, 264},
{4, 132},
{2, 66},
{1, 33},
};
static Shadow_Mask SHADOW_MASK = {
{
1610612736, {
{1342177280, 234881024},
{1207959552, 100663296},
{1140850688, 33554432},
{1090519040, 541200},
{1082130432, 133152},
{1074266112, 16912},
{1073872896, 2080},
{1073758208, 528},
{1073743872, 32},
{1073742336, 16},
{268435456, 234881024},
{134217728, 100663296},
{67108864, 33554432},
{16777216, 541200},
{8388608, 133152},
{524288, 16912},
{131072, 2080},
{16384, 528},
{2048, 32},
{512, 16},
}
},
{
1342177280, {
{1207959552, 100663296},
{1140850688, 33554432},
{1082130432, 270600},
{1077936128, 66560},
{1074003968, 8456},
{1073807360, 1024},
{1073750016, 264},
{1073742080, 8},
{134217728, 100663296},
{67108864, 33554432},
{8388608, 270600},
{4194304, 66560},
{262144, 8456},
{65536, 1024},
{8192, 264},
{256, 8},
}
},
{
1207959552, {
{1342177280, 536870912},
{1140850688, 33554432},
{1082130432, 524288},
{1077936128, 135300},
{1075838976, 32768},
{1073872896, 4228},
{1073745920, 132},
{1073741952, 4},
{268435456, 536870912},
{67108864, 33554432},
{8388608, 524288},
{4194304, 135300},
{2097152, 32768},
{131072, 4228},
{4096, 132},
{128, 4},
}
},
{
1140850688, {
{1342177280, 536870912},
{1207959552, 805306368},
{1077936128, 278528},
{1075838976, 67650},
{1074003968, 16384},
{1073807360, 2114},
{1073743872, 66},
{1073741888, 2},
{268435456, 536870912},
{134217728, 805306368},
{4194304, 278528},
{2097152, 67650},
{262144, 16384},
{65536, 2114},
{2048, 66},
{64, 2},
}
},
{
1107296256, {
{1342177280, 536870912},
{1207959552, 805306368},
{1140850688, 939524096},
{1075838976, 139776},
{1074790400, 33825},
{1073872896, 8704},
{1073774592, 1057},
{1073750016, 512},
{1073742848, 33},
{1073741856, 1},
{268435456, 536870912},
{134217728, 805306368},
{67108864, 939524096},
{2097152, 139776},
{1048576, 33825},
{131072, 8704},
{32768, 1057},
{8192, 512},
{1024, 33},
{32, 1},
}
},
{
1090519040, {
{1082130432, 7340032},
{1077936128, 3145728},
{1075838976, 1048576},
{1074266112, 16912},
{1074003968, 4161},
{1073758208, 528},
{1073745920, 65},
{1073742336, 16},
{1073741888, 1},
{8388608, 7340032},
{4194304, 3145728},
{2097152, 1048576},
{524288, 16912},
{262144, 4161},
{16384, 528},
{4096, 65},
{512, 16},
{64, 1},
}
},
{
1082130432, {
{1077936128, 3145728},
{1075838976, 1048576},
{1074003968, 8456},
{1073872896, 2080},
{1073750016, 264},
{1073743872, 32},
{1073742080, 8},
{4194304, 3145728},
{2097152, 1048576},
{262144, 8456},
{131072, 2080},
{8192, 264},
{2048, 32},
{256, 8},
}
},
{
1077936128, {
{1082130432, 16777216},
{1075838976, 1048576},
{1074003968, 16384},
{1073872896, 4228},
{1073807360, 1024},
{1073745920, 132},
{1073741952, 4},
{8388608, 16777216},
{2097152, 1048576},
{262144, 16384},
{131072, 4228},
{65536, 1024},
{4096, 132},
{128, 4},
}
},
{
1075838976, {
{1082130432, 16777216},
{1077936128, 25165824},
{1073872896, 8704},
{1073807360, 2114},
{1073750016, 512},
{1073743872, 66},
{1073741888, 2},
{8388608, 16777216},
{4194304, 25165824},
{131072, 8704},
{65536, 2114},
{8192, 512},
{2048, 66},
{64, 2},
}
},
{
1074790400, {
{1082130432, 16777216},
{1077936128, 25165824},
{1075838976, 29360128},
{1073807360, 4368},
{1073774592, 1057},
{1073745920, 272},
{1073742848, 33},
{1073742080, 16},
{1073741856, 1},
{8388608, 16777216},
{4194304, 25165824},
{2097152, 29360128},
{65536, 4368},
{32768, 1057},
{4096, 272},
{1024, 33},
{256, 16},
{32, 1},
}
},
{
1074266112, {
{1090519040, 536870912},
{1082130432, 134217728},
{1074003968, 229376},
{1073872896, 98304},
{1073807360, 32768},
{1073758208, 528},
{1073750016, 130},
{1073742336, 16},
{1073741952, 2},
{16777216, 536870912},
{8388608, 134217728},
{262144, 229376},
{131072, 98304},
{65536, 32768},
{16384, 528},
{8192, 130},
{512, 16},
{128, 2},
}
},
{
1074003968, {
{1082130432, 268435456},
{1077936128, 67108864},
{1073872896, 98304},
{1073807360, 32768},
{1073750016, 264},
{1073745920, 65},
{1073742080, 8},
{1073741888, 1},
{8388608, 268435456},
{4194304, 67108864},
{131072, 98304},
{65536, 32768},
{8192, 264},
{4096, 65},
{256, 8},
{64, 1},
}
},
{
1073872896, {
{1082130432, 536870912},
{1077936128, 134217728},
{1075838976, 33554432},
{1074003968, 524288},
{1073807360, 32768},
{1073750016, 512},
{1073745920, 132},
{1073743872, 32},
{1073741952, 4},
{8388608, 536870912},
{4194304, 134217728},
{2097152, 33554432},
{262144, 524288},
{65536, 32768},
{8192, 512},
{4096, 132},
{2048, 32},
{128, 4},
}
},
{
1073807360, {
{1077936128, 268435456},
{1075838976, 67108864},
{1074003968, 524288},
{1073872896, 786432},
{1073745920, 272},
{1073743872, 66},
{1073742080, 16},
{1073741888, 2},
{4194304, 268435456},
{2097152, 67108864},
{262144, 524288},
{131072, 786432},
{4096, 272},
{2048, 66},
{256, 16},
{64, 2},
}
},
{
1073774592, {
{1075838976, 134217728},
{1074790400, 33554432},
{1074003968, 524288},
{1073872896, 786432},
{1073807360, 917504},
{1073743872, 136},
{1073742848, 33},
{1073741952, 8},
{1073741856, 1},
{2097152, 134217728},
{1048576, 33554432},
{262144, 524288},
{131072, 786432},
{65536, 917504},
{2048, 136},
{1024, 33},
{128, 8},
{32, 1},
}
},
{
1073758208, {
{1090519040, 536870912},
{1077936128, 67108864},
{1074266112, 553648128},
{1074003968, 71303168},
{1073750016, 7168},
{1073745920, 3072},
{1073743872, 1024},
{1073742336, 16},
{1073742080, 4},
{16777216, 536870912},
{4194304, 67108864},
{524288, 553648128},
{262144, 71303168},
{8192, 7168},
{4096, 3072},
{2048, 1024},
{512, 16},
{256, 4},
}
},
{
1073750016, {
{1082130432, 268435456},
{1075838976, 33554432},
{1074003968, 276824064},
{1073872896, 35651584},
{1073745920, 3072},
{1073743872, 1024},
{1073742080, 8},
{1073741952, 2},
{8388608, 268435456},
{2097152, 33554432},
{262144, 276824064},
{131072, 35651584},
{4096, 3072},
{2048, 1024},
{256, 8},
{128, 2},
}
},
{
1073745920, {
{1077936128, 134217728},
{1074003968, 16777216},
{1073872896, 138412032},
{1073807360, 1048576},
{1073750016, 16384},
{1073743872, 1024},
{1073742080, 16},
{1073741952, 4},
{1073741888, 1},
{4194304, 134217728},
{262144, 16777216},
{131072, 138412032},
{65536, 1048576},
{8192, 16384},
{2048, 1024},
{256, 16},
{128, 4},
{64, 1},
}
},
{
1073743872, {
{1082130432, 536870912},
{1075838976, 67108864},
{1073872896, 545259520},
{1073807360, 69206016},
{1073750016, 16384},
{1073745920, 24576},
{1073741952, 8},
{1073741888, 2},
{8388608, 536870912},
{2097152, 67108864},
{131072, 545259520},
{65536, 69206016},
{8192, 16384},
{4096, 24576},
{128, 8},
{64, 2},
}
},
{
1073742848, {
{1077936128, 268435456},
{1074790400, 33554432},
{1073807360, 272629760},
{1073774592, 34603008},
{1073750016, 16384},
{1073745920, 24576},
{1073743872, 28672},
{1073741888, 4},
{1073741856, 1},
{4194304, 268435456},
{1048576, 33554432},
{65536, 272629760},
{32768, 34603008},
{8192, 16384},
{4096, 24576},
{2048, 28672},
{64, 4},
{32, 1},
}
},
{
1073742336, {
{1090519040, 536870912},
{1075838976, 33554432},
{1074266112, 553648128},
{1073872896, 35651584},
{1073758208, 554172416},
{1073750016, 35782656},
{1073742080, 224},
{1073741952, 96},
{1073741888, 32},
{16777216, 536870912},
{2097152, 33554432},
{524288, 553648128},
{131072, 35651584},
{16384, 554172416},
{8192, 35782656},
{256, 224},
{128, 96},
{64, 32},
}
},
{
1073742080, {
{1082130432, 268435456},
{1074003968, 276824064},
{1073807360, 1048576},
{1073750016, 277086208},
{1073745920, 1114112},
{1073741952, 96},
{1073741888, 32},
{8388608, 268435456},
{262144, 276824064},
{65536, 1048576},
{8192, 277086208},
{4096, 1114112},
{128, 96},
{64, 32},
}
},
{
1073741952, {
{1077936128, 134217728},
{1073872896, 138412032},
{1073750016, 524288},
{1073745920, 138543104},
{1073743872, 32768},
{1073742080, 512},
{1073741888, 32},
{4194304, 134217728},
{131072, 138412032},
{8192, 524288},
{4096, 138543104},
{2048, 32768},
{256, 512},
{64, 32},
}
},
{
1073741888, {
{1075838976, 67108864},
{1074003968, 16777216},
{1073807360, 69206016},
{1073745920, 17039360},
{1073743872, 69271552},
{1073742080, 512},
{1073741952, 768},
{2097152, 67108864},
{262144, 16777216},
{65536, 69206016},
{4096, 17039360},
{2048, 69271552},
{256, 512},
{128, 768},
}
},
{
1073741856, {
{1082130432, 536870912},
{1074790400, 33554432},
{1073872896, 545259520},
{1073774592, 34603008},
{1073743872, 545390592},
{1073742848, 34635776},
{1073742080, 512},
{1073741952, 768},
{1073741888, 896},
{8388608, 536870912},
{1048576, 33554432},
{131072, 545259520},
{32768, 34603008},
{2048, 545390592},
{1024, 34635776},
{256, 512},
{128, 768},
{64, 896},
}
},
{
1073741840, {
{1090519040, 536870912},
{1074266112, 553648128},
{1073807360, 1048576},
{1073758208, 554172416},
{1073745920, 1114112},
{1073742336, 554188800},
{1073742080, 1118208},
{1073741832, 7},
{1073741828, 3},
{1073741826, 1},
{16777216, 536870912},
{524288, 553648128},
{65536, 1048576},
{16384, 554172416},
{4096, 1114112},
{512, 554188800},
{256, 1118208},
{8, 7},
{4, 3},
{2, 1},
}
},
{
1073741832, {
{1082130432, 268435456},
{1074003968, 276824064},
{1073750016, 277086208},
{1073743872, 32768},
{1073742080, 277094400},
{1073741952, 34816},
{1073741828, 3},
{1073741826, 1},
{8388608, 268435456},
{262144, 276824064},
{8192, 277086208},
{2048, 32768},
{256, 277094400},
{128, 34816},
{4, 3},
{2, 1},
}
},
{
1073741828, {
{1077936128, 134217728},
{1073872896, 138412032},
{1073745920, 138543104},
{1073742080, 16384},
{1073741952, 138547200},
{1073741888, 1024},
{1073741832, 16},
{1073741826, 1},
{4194304, 134217728},
{131072, 138412032},
{4096, 138543104},
{256, 16384},
{128, 138547200},
{64, 1024},
{8, 16},
{2, 1},
}
},
{
1073741826, {
{1075838976, 67108864},
{1073807360, 69206016},
{1073750016, 524288},
{1073743872, 69271552},
{1073741952, 532480},
{1073741888, 69273600},
{1073741832, 16},
{1073741828, 24},
{2097152, 67108864},
{65536, 69206016},
{8192, 524288},
{2048, 69271552},
{128, 532480},
{64, 69273600},
{8, 16},
{4, 24},
}
},
{
1073741825, {
{1074790400, 33554432},
{1074003968, 16777216},
{1073774592, 34603008},
{1073745920, 17039360},
{1073742848, 34635776},
{1073741888, 17043456},
{1073741856, 34636800},
{1073741832, 16},
{1073741828, 24},
{1073741826, 28},
{1048576, 33554432},
{262144, 16777216},
{32768, 34603008},
{4096, 17039360},
{1024, 34635776},
{64, 17043456},
{32, 34636800},
{8, 16},
{4, 24},
{2, 28},
}
},
{
536870912, {
{1342177280, 234881024},
{1207959552, 100663296},
{1140850688, 33554432},
{1090519040, 541200},
{1082130432, 133152},
{1074266112, 16912},
{1073872896, 2080},
{1073758208, 528},
{1073743872, 32},
{1073742336, 16},
{268435456, 234881024},
{134217728, 100663296},
{67108864, 33554432},
{16777216, 541200},
{8388608, 133152},
{524288, 16912},
{131072, 2080},
{16384, 528},
{2048, 32},
{512, 16},
}
},
{
268435456, {
{1207959552, 100663296},
{1140850688, 33554432},
{1082130432, 270600},
{1077936128, 66560},
{1074003968, 8456},
{1073807360, 1024},
{1073750016, 264},
{1073742080, 8},
{134217728, 100663296},
{67108864, 33554432},
{8388608, 270600},
{4194304, 66560},
{262144, 8456},
{65536, 1024},
{8192, 264},
{256, 8},
}
},
{
134217728, {
{1342177280, 536870912},
{1140850688, 33554432},
{1082130432, 524288},
{1077936128, 135300},
{1075838976, 32768},
{1073872896, 4228},
{1073745920, 132},
{1073741952, 4},
{268435456, 536870912},
{67108864, 33554432},
{8388608, 524288},
{4194304, 135300},
{2097152, 32768},
{131072, 4228},
{4096, 132},
{128, 4},
}
},
{
67108864, {
{1342177280, 536870912},
{1207959552, 805306368},
{1077936128, 278528},
{1075838976, 67650},
{1074003968, 16384},
{1073807360, 2114},
{1073743872, 66},
{1073741888, 2},
{268435456, 536870912},
{134217728, 805306368},
{4194304, 278528},
{2097152, 67650},
{262144, 16384},
{65536, 2114},
{2048, 66},
{64, 2},
}
},
{
33554432, {
{1342177280, 536870912},
{1207959552, 805306368},
{1140850688, 939524096},
{1075838976, 139776},
{1074790400, 33825},
{1073872896, 8704},
{1073774592, 1057},
{1073750016, 512},
{1073742848, 33},
{1073741856, 1},
{268435456, 536870912},
{134217728, 805306368},
{67108864, 939524096},
{2097152, 139776},
{1048576, 33825},
{131072, 8704},
{32768, 1057},
{8192, 512},
{1024, 33},
{32, 1},
}
},
{
16777216, {
{1082130432, 7340032},
{1077936128, 3145728},
{1075838976, 1048576},
{1074266112, 16912},
{1074003968, 4161},
{1073758208, 528},
{1073745920, 65},
{1073742336, 16},
{1073741888, 1},
{8388608, 7340032},
{4194304, 3145728},
{2097152, 1048576},
{524288, 16912},
{262144, 4161},
{16384, 528},
{4096, 65},
{512, 16},
{64, 1},
}
},
{
8388608, {
{1077936128, 3145728},
{1075838976, 1048576},
{1074003968, 8456},
{1073872896, 2080},
{1073750016, 264},
{1073743872, 32},
{1073742080, 8},
{4194304, 3145728},
{2097152, 1048576},
{262144, 8456},
{131072, 2080},
{8192, 264},
{2048, 32},
{256, 8},
}
},
{
4194304, {
{1082130432, 16777216},
{1075838976, 1048576},
{1074003968, 16384},
{1073872896, 4228},
{1073807360, 1024},
{1073745920, 132},
{1073741952, 4},
{8388608, 16777216},
{2097152, 1048576},
{262144, 16384},
{131072, 4228},
{65536, 1024},
{4096, 132},
{128, 4},
}
},
{
2097152, {
{1082130432, 16777216},
{1077936128, 25165824},
{1073872896, 8704},
{1073807360, 2114},
{1073750016, 512},
{1073743872, 66},
{1073741888, 2},
{8388608, 16777216},
{4194304, 25165824},
{131072, 8704},
{65536, 2114},
{8192, 512},
{2048, 66},
{64, 2},
}
},
{
1048576, {
{1082130432, 16777216},
{1077936128, 25165824},
{1075838976, 29360128},
{1073807360, 4368},
{1073774592, 1057},
{1073745920, 272},
{1073742848, 33},
{1073742080, 16},
{1073741856, 1},
{8388608, 16777216},
{4194304, 25165824},
{2097152, 29360128},
{65536, 4368},
{32768, 1057},
{4096, 272},
{1024, 33},
{256, 16},
{32, 1},
}
},
{
524288, {
{1090519040, 536870912},
{1082130432, 134217728},
{1074003968, 229376},
{1073872896, 98304},
{1073807360, 32768},
{1073758208, 528},
{1073750016, 130},
{1073742336, 16},
{1073741952, 2},
{16777216, 536870912},
{8388608, 134217728},
{262144, 229376},
{131072, 98304},
{65536, 32768},
{16384, 528},
{8192, 130},
{512, 16},
{128, 2},
}
},
{
262144, {
{1082130432, 268435456},
{1077936128, 67108864},
{1073872896, 98304},
{1073807360, 32768},
{1073750016, 264},
{1073745920, 65},
{1073742080, 8},
{1073741888, 1},
{8388608, 268435456},
{4194304, 67108864},
{131072, 98304},
{65536, 32768},
{8192, 264},
{4096, 65},
{256, 8},
{64, 1},
}
},
{
131072, {
{1082130432, 536870912},
{1077936128, 134217728},
{1075838976, 33554432},
{1074003968, 524288},
{1073807360, 32768},
{1073750016, 512},
{1073745920, 132},
{1073743872, 32},
{1073741952, 4},
{8388608, 536870912},
{4194304, 134217728},
{2097152, 33554432},
{262144, 524288},
{65536, 32768},
{8192, 512},
{4096, 132},
{2048, 32},
{128, 4},
}
},
{
65536, {
{1077936128, 268435456},
{1075838976, 67108864},
{1074003968, 524288},
{1073872896, 786432},
{1073745920, 272},
{1073743872, 66},
{1073742080, 16},
{1073741888, 2},
{4194304, 268435456},
{2097152, 67108864},
{262144, 524288},
{131072, 786432},
{4096, 272},
{2048, 66},
{256, 16},
{64, 2},
}
},
{
32768, {
{1075838976, 134217728},
{1074790400, 33554432},
{1074003968, 524288},
{1073872896, 786432},
{1073807360, 917504},
{1073743872, 136},
{1073742848, 33},
{1073741952, 8},
{1073741856, 1},
{2097152, 134217728},
{1048576, 33554432},
{262144, 524288},
{131072, 786432},
{65536, 917504},
{2048, 136},
{1024, 33},
{128, 8},
{32, 1},
}
},
{
16384, {
{1090519040, 536870912},
{1077936128, 67108864},
{1074266112, 553648128},
{1074003968, 71303168},
{1073750016, 7168},
{1073745920, 3072},
{1073743872, 1024},
{1073742336, 16},
{1073742080, 4},
{16777216, 536870912},
{4194304, 67108864},
{524288, 553648128},
{262144, 71303168},
{8192, 7168},
{4096, 3072},
{2048, 1024},
{512, 16},
{256, 4},
}
},
{
8192, {
{1082130432, 268435456},
{1075838976, 33554432},
{1074003968, 276824064},
{1073872896, 35651584},
{1073745920, 3072},
{1073743872, 1024},
{1073742080, 8},
{1073741952, 2},
{8388608, 268435456},
{2097152, 33554432},
{262144, 276824064},
{131072, 35651584},
{4096, 3072},
{2048, 1024},
{256, 8},
{128, 2},
}
},
{
4096, {
{1077936128, 134217728},
{1074003968, 16777216},
{1073872896, 138412032},
{1073807360, 1048576},
{1073750016, 16384},
{1073743872, 1024},
{1073742080, 16},
{1073741952, 4},
{1073741888, 1},
{4194304, 134217728},
{262144, 16777216},
{131072, 138412032},
{65536, 1048576},
{8192, 16384},
{2048, 1024},
{256, 16},
{128, 4},
{64, 1},
}
},
{
2048, {
{1082130432, 536870912},
{1075838976, 67108864},
{1073872896, 545259520},
{1073807360, 69206016},
{1073750016, 16384},
{1073745920, 24576},
{1073741952, 8},
{1073741888, 2},
{8388608, 536870912},
{2097152, 67108864},
{131072, 545259520},
{65536, 69206016},
{8192, 16384},
{4096, 24576},
{128, 8},
{64, 2},
}
},
{
1024, {
{1077936128, 268435456},
{1074790400, 33554432},
{1073807360, 272629760},
{1073774592, 34603008},
{1073750016, 16384},
{1073745920, 24576},
{1073743872, 28672},
{1073741888, 4},
{1073741856, 1},
{4194304, 268435456},
{1048576, 33554432},
{65536, 272629760},
{32768, 34603008},
{8192, 16384},
{4096, 24576},
{2048, 28672},
{64, 4},
{32, 1},
}
},
{
512, {
{1090519040, 536870912},
{1075838976, 33554432},
{1074266112, 553648128},
{1073872896, 35651584},
{1073758208, 554172416},
{1073750016, 35782656},
{1073742080, 224},
{1073741952, 96},
{1073741888, 32},
{16777216, 536870912},
{2097152, 33554432},
{524288, 553648128},
{131072, 35651584},
{16384, 554172416},
{8192, 35782656},
{256, 224},
{128, 96},
{64, 32},
}
},
{
256, {
{1082130432, 268435456},
{1074003968, 276824064},
{1073807360, 1048576},
{1073750016, 277086208},
{1073745920, 1114112},
{1073741952, 96},
{1073741888, 32},
{8388608, 268435456},
{262144, 276824064},
{65536, 1048576},
{8192, 277086208},
{4096, 1114112},
{128, 96},
{64, 32},
}
},
{
128, {
{1077936128, 134217728},
{1073872896, 138412032},
{1073750016, 524288},
{1073745920, 138543104},
{1073743872, 32768},
{1073742080, 512},
{1073741888, 32},
{4194304, 134217728},
{131072, 138412032},
{8192, 524288},
{4096, 138543104},
{2048, 32768},
{256, 512},
{64, 32},
}
},
{
64, {
{1075838976, 67108864},
{1074003968, 16777216},
{1073807360, 69206016},
{1073745920, 17039360},
{1073743872, 69271552},
{1073742080, 512},
{1073741952, 768},
{2097152, 67108864},
{262144, 16777216},
{65536, 69206016},
{4096, 17039360},
{2048, 69271552},
{256, 512},
{128, 768},
}
},
{
32, {
{1082130432, 536870912},
{1074790400, 33554432},
{1073872896, 545259520},
{1073774592, 34603008},
{1073743872, 545390592},
{1073742848, 34635776},
{1073742080, 512},
{1073741952, 768},
{1073741888, 896},
{8388608, 536870912},
{1048576, 33554432},
{131072, 545259520},
{32768, 34603008},
{2048, 545390592},
{1024, 34635776},
{256, 512},
{128, 768},
{64, 896},
}
},
{
16, {
{1090519040, 536870912},
{1074266112, 553648128},
{1073807360, 1048576},
{1073758208, 554172416},
{1073745920, 1114112},
{1073742336, 554188800},
{1073742080, 1118208},
{1073741832, 7},
{1073741828, 3},
{1073741826, 1},
{16777216, 536870912},
{524288, 553648128},
{65536, 1048576},
{16384, 554172416},
{4096, 1114112},
{512, 554188800},
{256, 1118208},
{8, 7},
{4, 3},
{2, 1},
}
},
{
8, {
{1082130432, 268435456},
{1074003968, 276824064},
{1073750016, 277086208},
{1073743872, 32768},
{1073742080, 277094400},
{1073741952, 34816},
{1073741828, 3},
{1073741826, 1},
{8388608, 268435456},
{262144, 276824064},
{8192, 277086208},
{2048, 32768},
{256, 277094400},
{128, 34816},
{4, 3},
{2, 1},
}
},
{
4, {
{1077936128, 134217728},
{1073872896, 138412032},
{1073745920, 138543104},
{1073742080, 16384},
{1073741952, 138547200},
{1073741888, 1024},
{1073741832, 16},
{1073741826, 1},
{4194304, 134217728},
{131072, 138412032},
{4096, 138543104},
{256, 16384},
{128, 138547200},
{64, 1024},
{8, 16},
{2, 1},
}
},
{
2, {
{1075838976, 67108864},
{1073807360, 69206016},
{1073750016, 524288},
{1073743872, 69271552},
{1073741952, 532480},
{1073741888, 69273600},
{1073741832, 16},
{1073741828, 24},
{2097152, 67108864},
{65536, 69206016},
{8192, 524288},
{2048, 69271552},
{128, 532480},
{64, 69273600},
{8, 16},
{4, 24},
}
},
{
1, {
{1074790400, 33554432},
{1074003968, 16777216},
{1073774592, 34603008},
{1073745920, 17039360},
{1073742848, 34635776},
{1073741888, 17043456},
{1073741856, 34636800},
{1073741832, 16},
{1073741828, 24},
{1073741826, 28},
{1048576, 33554432},
{262144, 16777216},
{32768, 34603008},
{4096, 17039360},
{1024, 34635776},
{64, 17043456},
{32, 34636800},
{8, 16},
{4, 24},
{2, 28},
}
},
};
static std::unordered_map<unsigned int, int> begin_white_queen_heuristic = {
{536870912, 1000},
{268435456, -500},
{134217728, -500},
{67108864, -500},
{33554432, -500},
{16777216, -500},
{8388608, -500},
{4194304, -500},
{2097152, -500},
{1048576, -500},
{524288, -500},
{262144, -500},
{131072, -500},
{65536, -500},
{32768, -500},
{16384, -500},
{8192, -500},
{4096, -500},
{2048, -500},
{1024, -500},
{512, -500},
{256, -500},
{128, -500},
{64, -500},
{32, 0},
{16, -500},
{8, -500},
{4, -500},
{2, 0},
{1, -500},
{0, 0},
};
static std::unordered_map<unsigned int, int> begin_black_queen_heuristic = {
{536870912, -500},
{268435456, 0},
{134217728, -500},
{67108864, -500},
{33554432, -500},
{16777216, 0},
{8388608, -500},
{4194304, -500},
{2097152, -500},
{1048576, -500},
{524288, -500},
{262144, -500},
{131072, -500},
{65536, -500},
{32768, -500},
{16384, -500},
{8192, -500},
{4096, -500},
{2048, -500},
{1024, -500},
{512, -500},
{256, -500},
{128, -500},
{64, -500},
{32, -500},
{16, -500},
{8, -500},
{4, -500},
{2, -500},
{1, 1000},
{0, 0},
};
static std::unordered_map<unsigned int, int> white_queen_heuristic = {
{536870912, -20},
{268435456, -10},
{134217728, -5},
{67108864, -10},
{33554432, -20},
{16777216, -10},
{8388608, 0},
{4194304, 0},
{2097152, 0},
{1048576, -10},
{524288, -10},
{262144, 5},
{131072, 5},
{65536, 5},
{32768, -10},
{16384, 0},
{8192, 5},
{4096, 5},
{2048, 5},
{1024, 0},
{512, -10},
{256, 5},
{128, 5},
{64, 5},
{32, 100},
{16, -20},
{8, -10},
{4, -5},
{2, -10},
{1, -20},
{0, 0},
};
static std::unordered_map<unsigned int, int> black_queen_heuristic = {
{536870912, -20},
{268435456, -10},
{134217728, -5},
{67108864, -10},
{33554432, -20},
{16777216, 100},
{8388608, 5},
{4194304, 5},
{2097152, 5},
{1048576, -10},
{524288, 0},
{262144, 5},
{131072, 5},
{65536, 5},
{32768, 0},
{16384, -10},
{8192, 5},
{4096, 5},
{2048, 5},
{1024, -10},
{512, -10},
{256, 0},
{128, 0},
{64, 0},
{32, -10},
{16, -20},
{8, -10},
{4, -5},
{2, -10},
{1, -20},
{0, 0},
};
static std::unordered_map<unsigned int, int> white_pawn_heuristic = {
{1610612736, -20},
{1342177280, -10},
{1207959552, -5},
{1140850688, -10},
{1107296256, -20},
{1090519040, -10},
{1082130432, 0},
{1077936128, 0},
{1075838976, 0},
{1074790400, -10},
{1074266112, -10},
{1074003968, 5},
{1073872896, 5},
{1073807360, 5},
{1073774592, -10},
{1073758208, 0},
{1073750016, 5},
{1073745920, 5},
{1073743872, 5},
{1073742848, 0},
{1073742336, -10},
{1073742080, 5},
{1073741952, 5},
{1073741888, 5},
{1073741856, 100},
{1073741840, -20},
{1073741832, -10},
{1073741828, -5},
{1073741826, -10},
{1073741825, -20},
{536870912, 1000},
{268435456, 1000},
{134217728, 1000},
{67108864, 1000},
{33554432, 1000},
{16777216, 10},
{8388608, 25},
{4194304, 35},
{2097152, 15},
{1048576, 10},
{524288, 5},
{262144, 20},
{131072, 30},
{65536, 10},
{32768, 5},
{16384, 0},
{8192, 10},
{4096, 20},
{2048, -5},
{1024, 0},
{512, 0},
{256, -5},
{128, -10},
{64, 0},
{32, -10},
{16, 0},
{8, 0},
{4, 0},
{2, 0},
{1, 0},
{0, 0},
};
static std::unordered_map<unsigned int, int> black_pawn_heuristic = {
{1610612736, -20},
{1342177280, -10},
{1207959552, -5},
{1140850688, -10},
{1107296256, -20},
{1090519040, 100},
{1082130432, 5},
{1077936128, 5},
{1075838976, 5},
{1074790400, -10},
{1074266112, 0},
{1074003968, 5},
{1073872896, 5},
{1073807360, 5},
{1073774592, 0},
{1073758208, -10},
{1073750016, 5},
{1073745920, 5},
{1073743872, 5},
{1073742848, -10},
{1073742336, -10},
{1073742080, 0},
{1073741952, 0},
{1073741888, 0},
{1073741856, -10},
{1073741840, -20},
{1073741832, -10},
{1073741828, -5},
{1073741826, -10},
{1073741825, -20},
{536870912, 0},
{268435456, 0},
{134217728, 0},
{67108864, 0},
{33554432, 0},
{16777216, -10},
{8388608, 0},
{4194304, -10},
{2097152, -5},
{1048576, 0},
{524288, 0},
{262144, -5},
{131072, 20},
{65536, 10},
{32768, 0},
{16384, 5},
{8192, 10},
{4096, 30},
{2048, 20},
{1024, 5},
{512, 10},
{256, 15},
{128, 35},
{64, 25},
{32, 10},
{16, 1000},
{8, 1000},
{4, 1000},
{2, 1000},
{1, 1000},
{0, 0},
};
static std::unordered_map<unsigned int, int> begin_white_knight_heuristic = {
{536870912, 500},
{268435456, 0},
{134217728, 0},
{67108864, 0},
{33554432, 0},
{16777216, 0},
{8388608, 0},
{4194304, 0},
{2097152, 0},
{1048576, 0},
{524288, 0},
{262144, 0},
{131072, 0},
{65536, 0},
{32768, 0},
{16384, -500},
{8192, 0},
{4096, -500},
{2048, 0},
{1024, 0},
{512, 0},
{256, 0},
{128, 0},
{64, 0},
{32, 0},
{16, 0},
{8, 300},
{4, 0},
{2, 0},
{1, 0},
{0, 0},
};
static std::unordered_map<unsigned int, int> begin_black_knight_heuristic = {
{536870912, 0},
{268435456, 0},
{134217728, 0},
{67108864, 300},
{33554432, 0},
{16777216, 0},
{8388608, 0},
{4194304, 0},
{2097152, 0},
{1048576, 0},
{524288, 0},
{262144, 0},
{131072, -500},
{65536, 0},
{32768, -500},
{16384, 0},
{8192, 0},
{4096, 0},
{2048, 0},
{1024, 0},
{512, 0},
{256, 0},
{128, 0},
{64, 0},
{32, 0},
{16, 0},
{8, 0},
{4, 0},
{2, 0},
{1, 500},
{0, 0},
};
static std::unordered_map<unsigned int, int> middle_white_knight_heuristic = {
{536870912, -50},
{268435456, -40},
{134217728, -30},
{67108864, -40},
{33554432, -50},
{16777216, -40},
{8388608, 5},
{4194304, 10},
{2097152, 5},
{1048576, -40},
{524288, -30},
{262144, 10},
{131072, 20},
{65536, 10},
{32768, -30},
{16384, -30},
{8192, 10},
{4096, 20},
{2048, 10},
{1024, -30},
{512, -40},
{256, 5},
{128, 10},
{64, 5},
{32, -40},
{16, -50},
{8, -40},
{4, -30},
{2, -40},
{1, -50},
{0, 0},
};
static std::unordered_map<unsigned int, int> middle_black_knight_heuristic = {
{536870912, -50},
{268435456, -40},
{134217728, -30},
{67108864, -40},
{33554432, -50},
{16777216, -40},
{8388608, 5},
{4194304, 10},
{2097152, 5},
{1048576, -40},
{524288, -30},
{262144, 10},
{131072, 20},
{65536, 10},
{32768, -30},
{16384, -30},
{8192, 10},
{4096, 20},
{2048, 10},
{1024, -30},
{512, -40},
{256, 5},
{128, 10},
{64, 5},
{32, -40},
{16, -50},
{8, -40},
{4, -30},
{2, -40},
{1, -50},
{0, 0},
};
static std::unordered_map<unsigned int, int> white_bishop_heuristic = {
{536870912, -20},
{268435456, -15},
{134217728, -10},
{67108864, -15},
{33554432, -20},
{16777216, -15},
{8388608, 5},
{4194304, 5},
{2097152, 5},
{1048576, -15},
{524288, -10},
{262144, 5},
{131072, 15},
{65536, 5},
{32768, -10},
{16384, -15},
{8192, 10},
{4096, 10},
{2048, 10},
{1024, -15},
{512, -10},
{256, 0},
{128, 10},
{64, 0},
{32, -10},
{16, -25},
{8, -10},
{4, -15},
{2, -10},
{1, -25},
{0, 0},
};
static std::unordered_map<unsigned int, int> black_bishop_heuristic = {
{536870912, -25},
{268435456, -10},
{134217728, -15},
{67108864, -10},
{33554432, -25},
{16777216, -10},
{8388608, 0},
{4194304, 10},
{2097152, 0},
{1048576, -10},
{524288, -15},
{262144, 10},
{131072, 10},
{65536, 10},
{32768, -15},
{16384, -10},
{8192, 5},
{4096, 15},
{2048, 5},
{1024, -10},
{512, -15},
{256, 5},
{128, 5},
{64, 5},
{32, -15},
{16, -20},
{8, -15},
{4, -10},
{2, -15},
{1, -20},
{0, 0},
};
static std::unordered_map<unsigned int, int> white_rook_heuristic = {
{536870912, 0},
{268435456, 0},
{134217728, 5},
{67108864, 0},
{33554432, 0},
{16777216, -10},
{8388608, 0},
{4194304, 0},
{2097152, 0},
{1048576, -10},
{524288, -10},
{262144, 0},
{131072, 0},
{65536, 0},
{32768, -10},
{16384, -10},
{8192, 0},
{4096, 0},
{2048, 0},
{1024, -10},
{512, 5},
{256, 10},
{128, 10},
{64, 10},
{32, 5},
{16, 0},
{8, 0},
{4, 0},
{2, 0},
{1, 0},
{0, 0},
};
static std::unordered_map<unsigned int, int> black_rook_heuristic = {
{536870912, 0},
{268435456, 0},
{134217728, 0},
{67108864, 0},
{33554432, 0},
{16777216, 5},
{8388608, 10},
{4194304, 10},
{2097152, 10},
{1048576, 5},
{524288, -10},
{262144, 0},
{131072, 0},
{65536, 0},
{32768, -10},
{16384, -10},
{8192, 0},
{4096, 0},
{2048, 0},
{1024, -10},
{512, -10},
{256, 0},
{128, 0},
{64, 0},
{32, -10},
{16, 0},
{8, 0},
{4, 5},
{2, 0},
{1, 0},
{0, 0},
};
static std::unordered_map<unsigned int, int> white_king_begin_game_heuristic = {
{536870912, -500},
{268435456, -500},
{134217728, -500},
{67108864, -500},
{33554432, -500},
{16777216, -500},
{8388608, -500},
{4194304, -500},
{2097152, -500},
{1048576, -500},
{524288, -500},
{262144, -500},
{131072, -500},
{65536, -500},
{32768, -500},
{16384, -500},
{8192, -500},
{4096, -500},
{2048, -500},
{1024, -500},
{512, -500},
{256, -500},
{128, -500},
{64, -500},
{32, -500},
{16, -500},
{8, -500},
{4, -500},
{2, -500},
{1, 0},
{0, 0},
};
static std::unordered_map<unsigned int, int> black_king_begin_game_heuristic = {
{536870912, 0},
{268435456, -500},
{134217728, -500},
{67108864, -500},
{33554432, -500},
{16777216, -500},
{8388608, -500},
{4194304, -500},
{2097152, -500},
{1048576, -500},
{524288, -500},
{262144, -500},
{131072, -500},
{65536, -500},
{32768, -500},
{16384, -500},
{8192, -500},
{4096, -500},
{2048, -500},
{1024, -500},
{512, -500},
{256, -500},
{128, -500},
{64, -500},
{32, -500},
{16, -500},
{8, -500},
{4, -500},
{2, -500},
{1, -500},
{0, 0},
};
static std::unordered_map<unsigned int, int> white_king_middle_game_heuristic = {
{536870912, -30},
{268435456, -40},
{134217728, -50},
{67108864, -40},
{33554432, -30},
{16777216, -30},
{8388608, -40},
{4194304, -50},
{2097152, -40},
{1048576, -30},
{524288, -30},
{262144, -40},
{131072, -50},
{65536, -40},
{32768, -30},
{16384, -20},
{8192, -30},
{4096, -40},
{2048, -30},
{1024, -20},
{512, -10},
{256, -20},
{128, -30},
{64, -20},
{32, -10},
{16, 50},
{8, 40},
{4, 0},
{2, 40},
{1, 50},
{0, 0},
};
static std::unordered_map<unsigned int, int> black_king_middle_game_heuristic = {
{536870912, 50},
{268435456, 40},
{134217728, 0},
{67108864, 40},
{33554432, 50},
{16777216, -10},
{8388608, -20},
{4194304, -30},
{2097152, -20},
{1048576, -10},
{524288, -20},
{262144, -30},
{131072, -40},
{65536, -30},
{32768, -20},
{16384, -30},
{8192, -40},
{4096, -50},
{2048, -40},
{1024, -30},
{512, -30},
{256, -40},
{128, -50},
{64, -40},
{32, -30},
{16, -30},
{8, -40},
{4, -50},
{2, -40},
{1, -30},
{0, 0},
};
static std::unordered_map<unsigned int, int> white_king_end_game_heuristic = {
{536870912, -50},
{268435456, -40},
{134217728, -30},
{67108864, -40},
{33554432, -50},
{16777216, -30},
{8388608, -15},
{4194304, 0},
{2097152, -15},
{1048576, -30},
{524288, -30},
{262144, 15},
{131072, 40},
{65536, 15},
{32768, -30},
{16384, -30},
{8192, 15},
{4096, 40},
{2048, 15},
{1024, -30},
{512, -30},
{256, 0},
{128, 0},
{64, 0},
{32, -30},
{16, -50},
{8, -40},
{4, -30},
{2, -40},
{1, -50},
{0, 0},
};
static std::unordered_map<unsigned int, int> black_king_end_game_heuristic = {
{536870912, -50},
{268435456, -40},
{134217728, -30},
{67108864, -40},
{33554432, -50},
{16777216, -30},
{8388608, 0},
{4194304, 0},
{2097152, 0},
{1048576, -30},
{524288, -30},
{262144, 15},
{131072, 40},
{65536, 15},
{32768, -30},
{16384, -30},
{8192, 15},
{4096, 40},
{2048, 15},
{1024, -30},
{512, -30},
{256, -15},
{128, 0},
{64, -15},
{32, -30},
{16, -50},
{8, -40},
{4, -30},
{2, -40},
{1, -50},
{0, 0},
};
static Attack_Masks type_to_attack[20] = {
KING_ATTACK_MASKS,
QUEEN_ATTACK_MASKS,
BISHOP_ATTACK_MASKS,
KNIGHT_ATTACK_MASKS,
ROOK_ATTACK_MASKS,
BLACK_PAWN_ATTACK_MASKS,
BLACK_PAWN_ATTACK_MASKS,
BLACK_PAWN_ATTACK_MASKS,
BLACK_PAWN_ATTACK_MASKS,
BLACK_PAWN_ATTACK_MASKS,
WHITE_PAWN_ATTACK_MASKS,
WHITE_PAWN_ATTACK_MASKS,
WHITE_PAWN_ATTACK_MASKS,
WHITE_PAWN_ATTACK_MASKS,
WHITE_PAWN_ATTACK_MASKS,
ROOK_ATTACK_MASKS,
KNIGHT_ATTACK_MASKS,
BISHOP_ATTACK_MASKS,
QUEEN_ATTACK_MASKS,
KING_ATTACK_MASKS
};
static Move_Masks type_to_move[20] = {
KING_MOVE_MASKS,
QUEEN_MOVE_MASKS,
BISHOP_MOVE_MASKS,
KNIGHT_MOVE_MASKS,
ROOK_MOVE_MASKS,
BLACK_PAWN_MOVE_MASKS,
BLACK_PAWN_MOVE_MASKS,
BLACK_PAWN_MOVE_MASKS,
BLACK_PAWN_MOVE_MASKS,
BLACK_PAWN_MOVE_MASKS,
WHITE_PAWN_MOVE_MASKS,
WHITE_PAWN_MOVE_MASKS,
WHITE_PAWN_MOVE_MASKS,
WHITE_PAWN_MOVE_MASKS,
WHITE_PAWN_MOVE_MASKS,
ROOK_MOVE_MASKS,
KNIGHT_MOVE_MASKS,
BISHOP_MOVE_MASKS,
QUEEN_MOVE_MASKS,
KING_MOVE_MASKS
};
static const int black_on_move_values[20]{
10000, // MY KING
900, // MY QUEEN
300, // MY BISHOP
300, // MY KNIGHT
500, // MY ROOK
100, // MY PAWN
100, // MY PAWN
100, // MY PAWN
100, // MY PAWN
100, // MY PAWN
-100, // OPPONENT PAWN
-100, // OPPONENT PAWN
-100, // OPPONENT PAWN
-100, // OPPONENT PAWN
-100, // OPPONENT PAWN
-500, // OPPONENT ROOK
-300, // OPPONENT KNIGHT
-300, // OPPONENT BISHOP
-900, // OPPONENT QUEEN
-10000 // OPPONENT KING
};
static const int white_on_move_values[20]{
-10000, // OPPONENT KING
-900, // OPPONENT QUEEN
-300, // OPPONENT BISHOP
-300, // OPPONENT KNIGHT
-500, // OPPONENT ROOK
-100, // OPPONENT PAWN
-100, // OPPONENT PAWN
-100, // OPPONENT PAWN
-100, // OPPONENT PAWN
-100, // OPPONENT PAWN
100, // MY PAWN
100, // MY PAWN
100, // MY PAWN
100, // MY PAWN
100, // MY PAWN
500, // MY ROOK
300, // MY KNIGHT
300, // MY BISHOP
900, // MY QUEEN
10000 // MY KING
};
static const int piece_type_zobrist_index[20]{
0, // k
1, // q
2, // b
3, // n
4, // r
5, // p
5, // p
5, // p
5, // p
5, // p
6, // P
6, // P
6, // P
6, // P
6, // P
7, // R
8, // N
9, // B
10, // Q
11, // K
};
static std::unordered_map<unsigned int, int> begin_heuristic_dispatch[20] = {
black_king_begin_game_heuristic,
begin_black_queen_heuristic,
black_bishop_heuristic,
begin_black_knight_heuristic,
black_rook_heuristic,
black_pawn_heuristic,
black_pawn_heuristic,
black_pawn_heuristic,
black_pawn_heuristic,
black_pawn_heuristic,
white_pawn_heuristic,
white_pawn_heuristic,
white_pawn_heuristic,
white_pawn_heuristic,
white_pawn_heuristic,
white_rook_heuristic,
begin_white_knight_heuristic,
white_bishop_heuristic,
begin_white_queen_heuristic,
white_king_begin_game_heuristic,
};
static std::unordered_map<unsigned int, int> middle_heuristic_dispatch[20] = {
black_king_middle_game_heuristic,
black_queen_heuristic,
black_bishop_heuristic,
middle_black_knight_heuristic,
black_rook_heuristic,
black_pawn_heuristic,
black_pawn_heuristic,
black_pawn_heuristic,
black_pawn_heuristic,
black_pawn_heuristic,
white_pawn_heuristic,
white_pawn_heuristic,
white_pawn_heuristic,
white_pawn_heuristic,
white_pawn_heuristic,
white_rook_heuristic,
middle_white_knight_heuristic,
white_bishop_heuristic,
white_queen_heuristic,
white_king_middle_game_heuristic,
};
static std::unordered_map<unsigned int, int> end_heuristic_dispatch[20] = {
black_king_end_game_heuristic,
black_queen_heuristic,
black_bishop_heuristic,
middle_black_knight_heuristic,
black_rook_heuristic,
black_pawn_heuristic,
black_pawn_heuristic,
black_pawn_heuristic,
black_pawn_heuristic,
black_pawn_heuristic,
white_pawn_heuristic,
white_pawn_heuristic,
white_pawn_heuristic,
white_pawn_heuristic,
white_pawn_heuristic,
white_rook_heuristic,
middle_white_knight_heuristic,
white_bishop_heuristic,
white_queen_heuristic,
white_king_end_game_heuristic,
};
static std::unordered_map<unsigned int, unsigned int> combined_attack_dispatch[20] = {
KING_ATTACK_MASKS_COMBINED,
QUEEN_ATTACK_MASKS_COMBINED,
BISHOP_ATTACK_MASKS_COMBINED,
KNIGHT_ATTACK_MASKS_COMBINED,
ROOK_ATTACK_MASKS_COMBINED,
BLACK_PAWN_ATTACK_MASKS_COMBINED,
BLACK_PAWN_ATTACK_MASKS_COMBINED,
BLACK_PAWN_ATTACK_MASKS_COMBINED,
BLACK_PAWN_ATTACK_MASKS_COMBINED,
BLACK_PAWN_ATTACK_MASKS_COMBINED,
WHITE_PAWN_ATTACK_MASKS_COMBINED,
WHITE_PAWN_ATTACK_MASKS_COMBINED,
WHITE_PAWN_ATTACK_MASKS_COMBINED,
WHITE_PAWN_ATTACK_MASKS_COMBINED,
WHITE_PAWN_ATTACK_MASKS_COMBINED,
ROOK_ATTACK_MASKS_COMBINED,
KNIGHT_ATTACK_MASKS_COMBINED,
BISHOP_ATTACK_MASKS_COMBINED,
QUEEN_ATTACK_MASKS_COMBINED,
KING_ATTACK_MASKS_COMBINED
};
static std::unordered_map<unsigned int, unsigned int> combined_move_dispatch[20] = {
KING_MOVE_MASKS_COMBINED,
QUEEN_MOVE_MASKS_COMBINED,
BISHOP_MOVE_MASKS_COMBINED,
KNIGHT_MOVE_MASKS_COMBINED,
ROOK_MOVE_MASKS_COMBINED,
BLACK_PAWN_MOVE_MASKS_COMBINED,
BLACK_PAWN_MOVE_MASKS_COMBINED,
BLACK_PAWN_MOVE_MASKS_COMBINED,
BLACK_PAWN_MOVE_MASKS_COMBINED,
BLACK_PAWN_MOVE_MASKS_COMBINED,
WHITE_PAWN_MOVE_MASKS_COMBINED,
WHITE_PAWN_MOVE_MASKS_COMBINED,
WHITE_PAWN_MOVE_MASKS_COMBINED,
WHITE_PAWN_MOVE_MASKS_COMBINED,
WHITE_PAWN_MOVE_MASKS_COMBINED,
ROOK_MOVE_MASKS_COMBINED,
KNIGHT_MOVE_MASKS_COMBINED,
BISHOP_MOVE_MASKS_COMBINED,
QUEEN_MOVE_MASKS_COMBINED,
KING_MOVE_MASKS_COMBINED
};
static std::unordered_map<unsigned int, unsigned int> my_player_index{
{1, 10},
{2, 0}
};
static std::unordered_map<unsigned int, unsigned int> opponent_player_index{
{1, 0},
{2, 10}
};
static std::unordered_map<unsigned int, unsigned int> opponent{
{1, 2},
{2, 1}
};
#endif // BITBOARD_TABLES_H
In [ ]:
Content source: mikelane/minichess
Similar notebooks: