summaryrefslogtreecommitdiff
path: root/BitB.py
diff options
context:
space:
mode:
authorroot <root@annapurna.annapurna.fitness>2025-07-09 15:50:50 +0200
committerroot <root@annapurna.annapurna.fitness>2025-07-09 15:50:50 +0200
commite07a195bdd87932b9d00d3d680a9a5a747359566 (patch)
tree002bc641d9a0955eb7689c30398dfe4ed57cdde8 /BitB.py
initial commitHEADmaster
Diffstat (limited to 'BitB.py')
-rw-r--r--BitB.py132
1 files changed, 132 insertions, 0 deletions
diff --git a/BitB.py b/BitB.py
new file mode 100644
index 0000000..5bba199
--- /dev/null
+++ b/BitB.py
@@ -0,0 +1,132 @@
+import piece_move_tables
+import typing
+
+bb = {
+ 'P': 0x00FF_0000_0000_0000,
+ 'R': 0x8100_0000_0000_0000,
+ 'N': 0x4200_0000_0000_0000,
+ 'B': 0x2400_0000_0000_0000,
+ 'Q': 0x0800_0000_0008_0000,
+ 'K': 0x1000_0000_0000_0000,
+
+ 'p': 0x0000_0000_0000_FF00,
+ 'r': 0x0000_0000_0000_0081,
+ 'n': 0x0000_0000_0000_0042,
+ 'b': 0x0000_0000_0000_0024,
+ 'q': 0x0000_0000_0000_0008,
+ 'k': 0x0000_0000_0000_0010,
+
+ 'ep': 0x0000_0000_0000_0000,
+ }
+
+def render_hex(hex_val: int) -> None:
+ if not isinstance(hex_val, int):
+ raise ValueError('Input must be integer.')
+ if hex_val > 0xFFFF_FFFF_FFFF_FFFF:
+ raise ValueError('Input hexadecimal value is too large, must be 64 bits or less.')
+ binary_value = bin(hex_val)[2:].zfill(64)
+ print('\n', end = '')
+ for i in range(0, 64, 8):
+ print(*['\x1b[47m' + bit + '\x1b[0m' if bit == '1' else bit for bit in binary_value[i:i+8]])
+
+def bit_not(bm: int) -> int:
+ return bm ^ 0xFFFF_FFFF_FFFF_FFFF
+
+def get_bit(bm: int, idx: int) -> int:
+ return bm & 1 << idx
+
+def set_bit(bm: int, idx: int) -> int:
+ return bm | 1 << idx
+
+def rm_bit(bm: int, idx: int) -> int:
+ return bm & bit_not(1 << idx)
+
+def switch_bit(bm: int, *idxs: int) -> int:
+ for idx in idxs:
+ bm ^= 1 << idx
+ return bm
+
+def count_trailing_zeros(bm: int) -> int:
+ return (bm & -bm).bit_length() - 1
+
+def w_pcs() -> int:
+ return bb['P'] | bb['R'] | bb['N'] | bb['B'] | bb['Q'] | bb['Q']
+
+def b_pcs() -> int:
+ return bb['p'] | bb['r'] | bb['n'] | bb['b'] | bb['q'] | bb['k']
+
+def all_pcs() -> int:
+ return w_pcs() ^ b_pcs()
+
+def R_mvs(idx: int) -> int:
+ all_pieces = all_pcs()
+ left = piece_move_tables.L_MASK[idx][all_pieces & piece_move_tables.L_BORDER_MASK[idx]]
+ right = piece_move_tables.R_MASK[idx][all_pieces & piece_move_tables.R_BORDER_MASK[idx]]
+ up = piece_move_tables.U_MASK[idx][all_pieces & piece_move_tables.U_BORDER_MASK[idx]]
+ down = piece_move_tables.D_MASK[idx][all_pieces & piece_move_tables.D_BORDER_MASK[idx]]
+ return (left | right | up | down) & bit_not(w_pcs())
+
+def N_mvs(idx) -> int:
+ return piece_move_tables.N_MASK[idx] & bit_not(w_pcs())
+
+def B_mvs(idx: int) -> int:
+ all_pieces = all_pcs()
+ left_up = piece_move_tables.LU_MASK[idx][all_pieces & piece_move_tables.LU_BORDER_MASK[idx]]
+ left_down = piece_move_tables.LD_MASK[idx][all_pieces & piece_move_tables.LD_BORDER_MASK[idx]]
+ right_up = piece_move_tables.RU_MASK[idx][all_pieces & piece_move_tables.RU_BORDER_MASK[idx]]
+ right_down = piece_move_tables.RD_MASK[idx][all_pieces & piece_move_tables.RD_BORDER_MASK[idx]]
+ return (left_up | left_down | right_up | right_down) & bit_not(w_pcs())
+
+def Q_mvs(idx: int) -> int:
+ return R_mvs(idx) | B_mvs(idx)
+
+def K_mvs(idx: int) -> int:
+ return piece_move_tables.K_MASK[idx] & bit_not(w_pcs())
+
+def P_mvs(idx: int) -> int:
+ return piece_move_tables.WP_PUSH_MASK[idx] & bit_not(all_pcs()) | piece_move_tables.WP_LEFT_TAKE_MASK[idx] | piece_move_tables.WP_RIGHT_TAKE_MASK[idx] & b_pcs()
+
+def r_mvs(idx: int) -> int:
+ all_pieces = all_pcs()
+ left = piece_move_tables.L_MASK[idx][all_pieces & piece_move_tables.L_BORDER_MASK[idx]]
+ right = piece_move_tables.R_MASK[idx][all_pieces & piece_move_tables.R_BORDER_MASK[idx]]
+ up = piece_move_tables.U_MASK[idx][all_pieces & piece_move_tables.U_BORDER_MASK[idx]]
+ down = piece_move_tables.D_MASK[idx][all_pieces & piece_move_tables.D_BORDER_MASK[idx]]
+ return (left | right | up | down) & bit_not(b_pcs())
+
+def n_mvs(idx: int) -> int:
+ return piece_move_tables.N_MASK[idx] & bit_not(b_pcs())
+
+def b_mvs(idx: int) -> int:
+ all_pieces = all_pcs()
+ left_up = piece_move_tables.LU_MASK[idx][all_pieces & piece_move_tables.LU_BORDER_MASK[idx]]
+ left_down = piece_move_tables.LD_MASK[idx][all_pieces & piece_move_tables.LD_BORDER_MASK[idx]]
+ right_up = piece_move_tables.RU_MASK[idx][all_pieces & piece_move_tables.RU_BORDER_MASK[idx]]
+ right_down = piece_move_tables.RD_MASK[idx][all_pieces & piece_move_tables.RD_BORDER_MASK[idx]]
+ return (left_up | left_down | right_up | right_down) & bit_not(b_pcs())
+
+def q_mvs(idx: int) -> int:
+ return r_mvs(idx) | b_mvs(idx)
+
+def k_mvs(idx: int) -> int:
+ return piece_move_tables.K_MASK[idx] & bit_not(b_pcs())
+
+def p_mvs(idx) -> int:
+ return piece_move_tables.BP_PUSH_MASK[idx] & bit_not(all_pcs()) | piece_move_tables.BP_LEFT_TAKE_MASK[idx] | piece_move_tables.BP_RIGHT_TAKE_MASK[idx] & w_pcs()
+
+def ver_mirr(bm: int) -> int:
+ return (bm & 0x8080_8080_8080_8080) >> 7 | (bm & 0x4040_4040_4040_4040) >> 5 | (bm & 0x2020_2020_2020_2020) >> 3 | (bm & 0x1010_1010_1010_1010) >> 1 | (bm & 0x0808_0808_0808_0808) << 1 | (bm & 0x0404_0404_0404_0404) << 3 | (bm & 0x0202_0202_0202_0202) << 5 | (bm & 0x0101_0101_0101_0101) << 7
+
+def hor_mirr(bm: int) -> int:
+ return (bm & 0xFF00_0000_0000_0000) >> 56 | (bm & 0x00FF_0000_0000_0000) >> 40 | (bm & 0x0000_FF00_0000_0000) >> 24 | (bm & 0x0000_00FF_0000_0000) >> 8 | (bm & 0x0000_0000_FF00_0000) << 8 | (bm & 0x0000_0000_00FF_0000) << 24 | (bm & 0x0000_0000_0000_FF00) << 40 | (bm & 0x0000_0000_0000_00FF) << 56
+
+def bits(bm: int) -> typing.Generator[int, int, None]:
+ for idx in range(64):
+ if bm & 1 << idx:
+ yield 1 << idx
+
+render_hex(1 << 33)
+render_hex(R_mvs(33))
+
+render_hex(1 << 44)
+render_hex(Q_mvs(44)) \ No newline at end of file