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 [ ]: