pub struct Magic {
pub factor: u64,
pub offset: usize,
pub mask: u64,
}
impl Magic {
const fn new(mask: u64, factor: u64, offset: usize) -> Self {
Self {
factor,
offset,
mask,
}
}
pub fn rook_index(&self, occupied: u64) -> usize {
((self.factor.wrapping_mul(occupied & self.mask)) >> (64 - 12)) as usize + self.offset
}
pub fn bishop_index(&self, occupied: u64) -> usize {
((self.factor.wrapping_mul(occupied & self.mask)) >> (64 - 9)) as usize + self.offset
}
pub const ROOK: [Self; 64] = [
Self::new(0x000101010101017e, 0x00280077ffebfffe, 26304),
Self::new(0x000202020202027c, 0x2004010201097fff, 35520),
Self::new(0x000404040404047a, 0x0010020010053fff, 38592),
Self::new(0x0008080808080876, 0x0040040008004002, 8026),
Self::new(0x001010101010106e, 0x7fd00441ffffd003, 22196),
Self::new(0x002020202020205e, 0x4020008887dffffe, 80870),
Self::new(0x004040404040403e, 0x004000888847ffff, 76747),
Self::new(0x008080808080807e, 0x006800fbff75fffd, 30400),
Self::new(0x0001010101017e00, 0x000028010113ffff, 11115),
Self::new(0x0002020202027c00, 0x0020040201fcffff, 18205),
Self::new(0x0004040404047a00, 0x007fe80042ffffe8, 53577),
Self::new(0x0008080808087600, 0x00001800217fffe8, 62724),
Self::new(0x0010101010106e00, 0x00001800073fffe8, 34282),
Self::new(0x0020202020205e00, 0x00001800e05fffe8, 29196),
Self::new(0x0040404040403e00, 0x00001800602fffe8, 23806),
Self::new(0x0080808080807e00, 0x000030002fffffa0, 49481),
Self::new(0x00010101017e0100, 0x00300018010bffff, 2410),
Self::new(0x00020202027c0200, 0x0003000c0085fffb, 36498),
Self::new(0x00040404047a0400, 0x0004000802010008, 24478),
Self::new(0x0008080808760800, 0x0004002020020004, 10074),
Self::new(0x00101010106e1000, 0x0001002002002001, 79315),
Self::new(0x00202020205e2000, 0x0001001000801040, 51779),
Self::new(0x00404040403e4000, 0x0000004040008001, 13586),
Self::new(0x00808080807e8000, 0x0000006800cdfff4, 19323),
Self::new(0x000101017e010100, 0x0040200010080010, 70612),
Self::new(0x000202027c020200, 0x0000080010040010, 83652),
Self::new(0x000404047a040400, 0x0004010008020008, 63110),
Self::new(0x0008080876080800, 0x0000040020200200, 34496),
Self::new(0x001010106e101000, 0x0002008010100100, 84966),
Self::new(0x002020205e202000, 0x0000008020010020, 54341),
Self::new(0x004040403e404000, 0x0000008020200040, 60421),
Self::new(0x008080807e808000, 0x0000820020004020, 86402),
Self::new(0x0001017e01010100, 0x00fffd1800300030, 50245),
Self::new(0x0002027c02020200, 0x007fff7fbfd40020, 76622),
Self::new(0x0004047a04040400, 0x003fffbd00180018, 84676),
Self::new(0x0008087608080800, 0x001fffde80180018, 78757),
Self::new(0x0010106e10101000, 0x000fffe0bfe80018, 37346),
Self::new(0x0020205e20202000, 0x0001000080202001, 370),
Self::new(0x0040403e40404000, 0x0003fffbff980180, 42182),
Self::new(0x0080807e80808000, 0x0001fffdff9000e0, 45385),
Self::new(0x00017e0101010100, 0x00fffefeebffd800, 61659),
Self::new(0x00027c0202020200, 0x007ffff7ffc01400, 12790),
Self::new(0x00047a0404040400, 0x003fffbfe4ffe800, 16762),
Self::new(0x0008760808080800, 0x001ffff01fc03000, 0),
Self::new(0x00106e1010101000, 0x000fffe7f8bfe800, 38380),
Self::new(0x00205e2020202000, 0x0007ffdfdf3ff808, 11098),
Self::new(0x00403e4040404000, 0x0003fff85fffa804, 21803),
Self::new(0x00807e8080808000, 0x0001fffd75ffa802, 39189),
Self::new(0x007e010101010100, 0x00ffffd7ffebffd8, 58628),
Self::new(0x007c020202020200, 0x007fff75ff7fbfd8, 44116),
Self::new(0x007a040404040400, 0x003fff863fbf7fd8, 78357),
Self::new(0x0076080808080800, 0x001fffbfdfd7ffd8, 44481),
Self::new(0x006e101010101000, 0x000ffff810280028, 64134),
Self::new(0x005e202020202000, 0x0007ffd7f7feffd8, 41759),
Self::new(0x003e404040404000, 0x0003fffc0c480048, 1394),
Self::new(0x007e808080808000, 0x0001ffffafd7ffd8, 40910),
Self::new(0x7e01010101010100, 0x00ffffe4ffdfa3ba, 66516),
Self::new(0x7c02020202020200, 0x007fffef7ff3d3da, 3897),
Self::new(0x7a04040404040400, 0x003fffbfdfeff7fa, 3930),
Self::new(0x7608080808080800, 0x001fffeff7fbfc22, 72934),
Self::new(0x6e10101010101000, 0x0000020408001001, 72662),
Self::new(0x5e20202020202000, 0x0007fffeffff77fd, 56325),
Self::new(0x3e40404040404000, 0x0003ffffbf7dfeec, 66501),
Self::new(0x7e80808080808000, 0x0001ffff9dffa333, 14826),
];
pub const BISHOP: [Self; 64] = [
Self::new(0x0040201008040200, 0x007fbfbfbfbfbfff, 5378),
Self::new(0x0000402010080400, 0x0000a060401007fc, 4093),
Self::new(0x0000004020100a00, 0x0001004008020000, 4314),
Self::new(0x0000000040221400, 0x0000806004000000, 6587),
Self::new(0x0000000002442800, 0x0000100400000000, 6491),
Self::new(0x0000000204085000, 0x000021c100b20000, 6330),
Self::new(0x0000020408102000, 0x0000040041008000, 5609),
Self::new(0x0002040810204000, 0x00000fb0203fff80, 22236),
Self::new(0x0020100804020000, 0x0000040100401004, 6106),
Self::new(0x0040201008040000, 0x0000020080200802, 5625),
Self::new(0x00004020100a0000, 0x0000004010202000, 16785),
Self::new(0x0000004022140000, 0x0000008060040000, 16817),
Self::new(0x0000000244280000, 0x0000004402000000, 6842),
Self::new(0x0000020408500000, 0x0000000801008000, 7003),
Self::new(0x0002040810200000, 0x000007efe0bfff80, 4197),
Self::new(0x0004081020400000, 0x0000000820820020, 7356),
Self::new(0x0010080402000200, 0x0000400080808080, 4602),
Self::new(0x0020100804000400, 0x00021f0100400808, 4538),
Self::new(0x004020100a000a00, 0x00018000c06f3fff, 29531),
Self::new(0x0000402214001400, 0x0000258200801000, 45393),
Self::new(0x0000024428002800, 0x0000240080840000, 12420),
Self::new(0x0002040850005000, 0x000018000c03fff8, 15763),
Self::new(0x0004081020002000, 0x00000a5840208020, 5050),
Self::new(0x0008102040004000, 0x0000020008208020, 4346),
Self::new(0x0008040200020400, 0x0000804000810100, 6074),
Self::new(0x0010080400040800, 0x0001011900802008, 7866),
Self::new(0x0020100a000a1000, 0x0000804000810100, 32139),
Self::new(0x0040221400142200, 0x000100403c0403ff, 57673),
Self::new(0x0002442800284400, 0x00078402a8802000, 55365),
Self::new(0x0004085000500800, 0x0000101000804400, 15818),
Self::new(0x0008102000201000, 0x0000080800104100, 5562),
Self::new(0x0010204000402000, 0x00004004c0082008, 6390),
Self::new(0x0004020002040800, 0x0001010120008020, 7930),
Self::new(0x0008040004081000, 0x000080809a004010, 13329),
Self::new(0x00100a000a102000, 0x0007fefe08810010, 7170),
Self::new(0x0022140014224000, 0x0003ff0f833fc080, 27267),
Self::new(0x0044280028440200, 0x007fe08019003042, 53787),
Self::new(0x0008500050080400, 0x003fffefea003000, 5097),
Self::new(0x0010200020100800, 0x0000101010002080, 6643),
Self::new(0x0020400040201000, 0x0000802005080804, 6138),
Self::new(0x0002000204081000, 0x0000808080a80040, 7418),
Self::new(0x0004000408102000, 0x0000104100200040, 7898),
Self::new(0x000a000a10204000, 0x0003ffdf7f833fc0, 42012),
Self::new(0x0014001422400000, 0x0000008840450020, 57350),
Self::new(0x0028002844020000, 0x00007ffc80180030, 22813),
Self::new(0x0050005008040200, 0x007fffdd80140028, 56693),
Self::new(0x0020002010080400, 0x00020080200a0004, 5818),
Self::new(0x0040004020100800, 0x0000101010100020, 7098),
Self::new(0x0000020408102000, 0x0007ffdfc1805000, 4451),
Self::new(0x0000040810204000, 0x0003ffefe0c02200, 4709),
Self::new(0x00000a1020400000, 0x0000000820806000, 4794),
Self::new(0x0000142240000000, 0x0000000008403000, 13364),
Self::new(0x0000284402000000, 0x0000000100202000, 4570),
Self::new(0x0000500804020000, 0x0000004040802000, 4282),
Self::new(0x0000201008040200, 0x0004010040100400, 14964),
Self::new(0x0000402010080400, 0x00006020601803f4, 4026),
Self::new(0x0002040810204000, 0x0003ffdfdfc28048, 4826),
Self::new(0x0004081020400000, 0x0000000820820020, 7354),
Self::new(0x000a102040000000, 0x0000000008208060, 4848),
Self::new(0x0014224000000000, 0x0000000000808020, 15946),
Self::new(0x0028440200000000, 0x0000000001002020, 14932),
Self::new(0x0050080402000000, 0x0000000401002008, 16588),
Self::new(0x0020100804020000, 0x0000004040404040, 6905),
Self::new(0x0040201008040200, 0x007fff9fdf7ff813, 16076),
];
}