diff --git a/.github/workflows/clang-format.yml b/.github/workflows/clang-format.yml deleted file mode 100644 index 9a072bb..0000000 --- a/.github/workflows/clang-format.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: clang-format - -on: - pull_request: - branches: [ "main" ] - push: - branches-ignore: - - main -jobs: - format: - if: github.actor != 'github-actions[bot]' - runs-on: ubuntu-latest - permissions: - contents: write - - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ github.head_ref }} - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Install clang-format - run: sudo apt-get update && sudo apt-get install -y clang-format - - - name: Run clang-format - run: | - clang-format -i $(git ls-files '*.cpp' '*.hpp' '*.h' '*.c') - - - name: Commit and push changes - uses: stefanzweifel/git-auto-commit-action@v7 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 23bfde3..729aefa 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -10,7 +10,31 @@ on: - '**.hpp' jobs: + format: + if: github.actor != 'github-actions[bot]' + runs-on: ubuntu-latest + permissions: + contents: write + outputs: + commit_sha: ${{ steps.auto-commit.outputs.commit_hash }} + + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.head_ref }} + + - name: Install clang-format + run: sudo apt-get update && sudo apt-get install -y clang-format + + - name: Run clang-format + run: clang-format -i $(git ls-files '*.cpp' '*.hpp' '*.h' '*.c') + + - name: Commit and push changes + id: auto-commit + uses: stefanzweifel/git-auto-commit-action@v7 + build: + needs: format runs-on: ${{ matrix.os }} strategy: diff --git a/attacks.cpp b/attacks.cpp index 733a42f..4dbaee5 100644 --- a/attacks.cpp +++ b/attacks.cpp @@ -93,7 +93,7 @@ namespace chess::attacks { #ifndef GENERATE_AT_RUNTIME #define _POSSIBLY_CONSTEXPR constexpr #else -#define _POSSIBLY_CONSTEXPR const +#define _POSSIBLY_CONSTEXPR #endif // clang-format off _POSSIBLY_CONSTEXPR std::array RookMagics = { @@ -140,7 +140,6 @@ _POSSIBLY_CONSTEXPR std::pair, std::array attacks{}; size_t offset = 0; - for (Square sq = SQ_A1; sq < SQ_NONE; ++sq) { Bitboard occ = 0; Bitboard edges = ((attacks::MASK_RANK[0] | attacks::MASK_RANK[7]) & ~attacks::MASK_RANK[rank_of(sq)]) | @@ -165,6 +164,7 @@ _POSSIBLY_CONSTEXPR std::pair, std::array(sq), occ); @@ -173,7 +173,6 @@ _POSSIBLY_CONSTEXPR std::pair, std::array, std::array> bishopData = @@ -185,14 +184,22 @@ _POSSIBLY_CONSTEXPR std::pair, std::array(); _POSSIBLY_CONSTEXPR std::array RookTable = rookData.first; _POSSIBLY_CONSTEXPR std::array RookAttacks = rookData.second; + +[[nodiscard]] Bitboard bishop(Square sq, Bitboard occupied) { + return BishopAttacks[BishopTable[(int)sq].index + BishopTable[(int)sq](occupied)]; +} + +[[nodiscard]] Bitboard rook(Square sq, Bitboard occupied) { + return RookAttacks[RookTable[(int)sq].index + RookTable[(int)sq](occupied)]; +} } // namespace chess::attacks namespace chess::movegen { inline static Bitboard att(PieceType pt, Square sq, Bitboard occ) { return (pt == BISHOP) ? chess::_chess::_HyperbolaBishopAttacks(sq, occ) : chess::_chess::_HyperbolaRookAttacks(sq, occ); } -inline static std::array, SQ_NONE + 1> generate_between() { - std::array, SQ_NONE + 1> squares_between_bb{}; +inline static std::array, 64> generate_between() { + std::array, 64> squares_between_bb{}; for (int sq1 = 0; sq1 < 64; ++sq1) { for (PieceType pt : { BISHOP, ROOK }) { @@ -207,5 +214,5 @@ inline static std::array, SQ_NONE + 1> generat return squares_between_bb; } -std::array, SQ_NONE + 1> SQUARES_BETWEEN_BB = generate_between(); -} // namespace chess::movegen \ No newline at end of file +std::array, 64> SQUARES_BETWEEN_BB = generate_between(); +} // namespace chess::movegen diff --git a/attacks.h b/attacks.h index fb90680..c3e1654 100644 --- a/attacks.h +++ b/attacks.h @@ -23,6 +23,7 @@ #include "types.h" #include #include +#include namespace chess::attacks { // clang-format off // pre-calculated lookup table for pawn attacks @@ -110,13 +111,9 @@ namespace chess::attacks { 0x101010101010101, 0x202020202020202, 0x404040404040404, 0x808080808080808, 0x1010101010101010, 0x2020202020202020, 0x4040404040404040, 0x8080808080808080, }; - extern const std::array BishopMagics; - extern const std::array RookMagics; // clang-format on #ifdef __BMI2__ constexpr uint64_t software_pext_u64(uint64_t val, uint64_t mask) { - if (!is_constant_evaluated()) - return ~0ULL; uint64_t result = 0; uint64_t bit_position = 0; @@ -153,10 +150,6 @@ struct Magic { } // namespace chess::attacks namespace chess::attacks { -extern const std::array RookTable; -extern const std::array RookAttacks; -extern const std::array BishopTable; -extern const std::array BishopAttacks; /** * @brief Shifts a bitboard in a given direction * @tparam direction @@ -293,16 +286,13 @@ template [[nodiscard]] constexpr Bitboard pawn(const Bitboard pawns) { Bitboard h2 = l2 | r2; // 2-square horizontal shifts return (h1 << 16) | (h1 >> 16) | (h2 << 8) | (h2 >> 8); // vertical shifts: +2,+1,-2,-1 } - /** * @brief Returns the bishop attacks for a given square * @param sq * @param occupied * @return */ -[[nodiscard]] constexpr Bitboard bishop(Square sq, Bitboard occupied) { - return BishopAttacks[BishopTable[(int)sq].index + BishopTable[(int)sq](occupied)]; -} +[[nodiscard]] Bitboard bishop(Square sq, Bitboard occupied); /** * @brief Returns the rook attacks for a given square @@ -310,17 +300,14 @@ template [[nodiscard]] constexpr Bitboard pawn(const Bitboard pawns) { * @param occupied * @return */ -[[nodiscard]] constexpr Bitboard rook(Square sq, Bitboard occupied) { - return RookAttacks[RookTable[(int)sq].index + RookTable[(int)sq](occupied)]; -} - +[[nodiscard]] Bitboard rook(Square sq, Bitboard occupied); /** * @brief Returns the queen attacks for a given square * @param sq * @param occupied * @return */ -[[nodiscard]] constexpr Bitboard queen(Square sq, Bitboard occupied) { return bishop(sq, occupied) | rook(sq, occupied); } +[[nodiscard]] inline Bitboard queen(Square sq, Bitboard occupied) { return bishop(sq, occupied) | rook(sq, occupied); } /** * @brief Returns the king attacks for a given square @@ -336,7 +323,7 @@ template [[nodiscard]] constexpr Bitboard pawn(const Bitboard pawns) { * @tparam pt * @return */ -template [[nodiscard]] constexpr Bitboard slider(Square sq, Bitboard occupied) { +template [[nodiscard]] inline Bitboard slider(Square sq, Bitboard occupied) { static_assert(pt == PieceType::BISHOP || pt == PieceType::ROOK || pt == PieceType::QUEEN, "PieceType must be a slider!"); if constexpr (pt == PieceType::BISHOP) diff --git a/chess960_tests.cpp b/chess960_tests.cpp index eec59dc..4269620 100644 --- a/chess960_tests.cpp +++ b/chess960_tests.cpp @@ -54,15 +54,15 @@ template uint64_t perft(_Po pos.template legals(moves); uint64_t total = 0; for (const Move &m : moves) { - pos.template doMove(m); + pos.template do_move(m); #if !IS_RELEASE { const auto pre_nm_hash_1 = pos.hash(); const auto pre_nm_fen_1 = pos.fen(); if (pos.zobrist() != pos.hash()) REQUIRE(pos.zobrist() == pos.hash()); - pos.doNullMove(); - pos.undoMove(); + pos.do_null_move(); + pos.undo_move(); if (!(pos.hash() == pre_nm_hash_1 && pos.fen() == pre_nm_fen_1 && pos.zobrist() == pre_nm_hash_1)) { REQUIRE(pos.hash() == pre_nm_hash_1); REQUIRE(pos.fen() == pre_nm_fen_1); @@ -77,8 +77,8 @@ template uint64_t perft(_Po const auto pre_nm_fen_1 = pos.fen(); if (pos.zobrist() != pos.hash()) REQUIRE(pos.zobrist() == pos.hash()); - pos.doNullMove(); - pos.undoMove(); + pos.do_null_move(); + pos.undo_move(); if (!(pos.hash() == pre_nm_hash_1 && pos.fen() == pre_nm_fen_1 && pos.zobrist() == pre_nm_hash_1)) { REQUIRE(pos.hash() == pre_nm_hash_1); REQUIRE(pos.fen() == pre_nm_fen_1); @@ -86,7 +86,7 @@ template uint64_t perft(_Po } } #endif - pos.undoMove(); + pos.undo_move(); if constexpr (EnableDiv) std::cout << m << ": " << nodes << '\n'; total += nodes; @@ -112,13 +112,22 @@ auto split_testcases(std::vector> &entries) { bucket3.push_back(e); } - size_t n1 = std::min(bucket1.size(), size_t(2000)); + size_t n1 = std::min(bucket1.size(), size_t(1000)); optimized.insert(optimized.end(), bucket1.begin(), bucket1.begin() + n1); +#if defined(_WIN32) + size_t size = 5; +#else + size_t size = 15; +#endif + size_t n2 = std::min(bucket2.size(), size); // GitHub Actions having slowdown on Windows runners - size_t n2 = std::min(bucket2.size(), size_t(30)); optimized.insert(optimized.end(), bucket2.begin(), bucket2.begin() + n2); - - size_t n3 = std::min(bucket3.size(), size_t(5)); +#if defined(_WIN32) + size = 0; +#else + size = 1; +#endif + size_t n3 = std::min(bucket3.size(), size); if (n3 > 0) { optimized.insert(optimized.end(), bucket3.end() - n3, bucket3.end()); } @@ -137,12 +146,6 @@ void check_perfts(std::vector> &entries) { auto start_time = high_resolution_clock::now(); for (auto &entry : entries) { std::cerr << entry.input << " (chess960=true) " << entry.info.depth; -#if !IS_RELEASE - if (entry.info.nodes > 1e6) { - std::cerr << "(skipped)\n"; - continue; - } -#endif std::cerr << '\n'; { _Position pos(entry.input, true); diff --git a/movegen.cpp b/movegen.cpp index 60f5155..18f78ea 100644 --- a/movegen.cpp +++ b/movegen.cpp @@ -126,7 +126,7 @@ inline Move *splat_moves(Move *moveList, Square from, Bitboard to_bb) { namespace chess { template void movegen::genEP(const _Position &pos, Movelist &mv) { - const Square king_sq = pos.kingSq(c); + const Square king_sq = pos.king_sq(c); const Square ep_sq = pos.ep_square(); if (ep_sq == SQ_NONE) return; @@ -139,12 +139,12 @@ template void movegen::genEP(const _Position &pos const Bitboard ep_mask = (1ULL << ep_pawn_sq) | (1ULL << ep_sq); // ASSUME(popcount(candidates) <= 32); + Bitboard occ_all = pos.occ(); while (candidates) { Square from = static_cast(pop_lsb(candidates)); // Remove the EP pawn and this attacker from occupancy - Bitboard occ_temp = pos.occ(); - occ_temp ^= (1ULL << from) | ep_mask; + Bitboard occ_temp = occ_all ^ ((1ULL << from) | ep_mask); // attackers check Bitboard atks = 0; @@ -165,7 +165,7 @@ void movegen::genPawnDoubleMoves(const _Position &pos, Movelist &moves, Bitboard pawns = pos.template pieces() & RANK_2; // Split pin types - Bitboard pin_file = pin_mask & attacks::MASK_FILE[file_of(pos.kingSq(c))]; + Bitboard pin_file = pin_mask & attacks::MASK_FILE[file_of(pos.king_sq(c))]; Bitboard unpinned = pawns & ~pin_mask; Bitboard file_pinned = pawns & pin_file; @@ -283,7 +283,7 @@ void movegen::genKnightMoves(const _Position &pos, Movelist &list, Bitb template void movegen::genKingMoves(const _Position &pos, Movelist &out, Bitboard _pin_mask) { constexpr Color them = ~c; - const Square kingSq = pos.kingSq(c); + const Square kingSq = pos.king_sq(c); const Bitboard occAll = pos.occ(); const Bitboard myOcc = pos.occ(c); @@ -307,7 +307,7 @@ void movegen::genKingMoves(const _Position &pos, Movelist &out, Bitboar enemyAttacks |= attacks::pawn(pos.template pieces()); // Enemy king (adjacent control squares) - enemyAttacks |= attacks::king(pos.kingSq(them)); + enemyAttacks |= attacks::king(pos.king_sq(them)); Bitboard moves = attacks::king(kingSq) & ~myOcc & ~enemyAttacks; if constexpr (capturesOnly) @@ -322,11 +322,11 @@ void movegen::genKingMoves(const _Position &pos, Movelist &out, Bitboar Bitboard enemy_attacks = enemyAttacks; constexpr CastlingRights kingRights = KING_SIDE & (c == WHITE ? WHITE_CASTLING : BLACK_CASTLING), queenRights = QUEEN_SIDE & (c == WHITE ? WHITE_CASTLING : BLACK_CASTLING); - Bitboard OO_EMPTY = pos.getCastlingPath(c, true); + Bitboard OO_EMPTY = pos.get_castling_path(c, true); Bitboard OO_SAFE = between(kingSq, castling_king_square(c, true)); - Bitboard OOO_EMPTY = pos.getCastlingPath(c, false); + Bitboard OOO_EMPTY = pos.get_castling_path(c, false); Bitboard OOO_SAFE = between(kingSq, castling_king_square(c, false)); - Square rookKing = pos.getCastlingMetadata(c).rook_start_ks, rookQueen = pos.getCastlingMetadata(c).rook_start_qs; + Square rookKing = pos.get_castling_metadata(c).rook_start_ks, rookQueen = pos.get_castling_metadata(c).rook_start_qs; if (pos.castlingRights() & kingRights && !(occupancy & OO_EMPTY || enemy_attacks & OO_SAFE || _pin_mask & 1ULL << rookKing)) { @@ -350,6 +350,7 @@ void movegen::genSlidingMoves( sliders &= ~rook_pinners; if constexpr (pt == ROOK) sliders &= ~bishop_pinners; + Bitboard occ_opp = pos.occ(~c); Bitboard filter_list = ~pos.occ(c) & _check_mask; while (sliders) { Square from = static_cast(pop_lsb(sliders)); @@ -368,7 +369,7 @@ void movegen::genSlidingMoves( Bitboard filtered_pin = pin_mask & filter_list; Bitboard targets = func(from, occ_all) & filtered_pin; if constexpr (capturesOnly) - targets &= pos.occ(~c); + targets &= occ_opp; _chess::splat_moves(moves.data() + moves.size_, from, targets); moves.size_ += popcount(targets); } diff --git a/movegen.h b/movegen.h index bb6aea0..2459d05 100644 --- a/movegen.h +++ b/movegen.h @@ -30,7 +30,7 @@ void genKnightMoves(const _Position &, Movelist &, Bitboard, Bitboard); template void genKingMoves(const _Position &, Movelist &, Bitboard); template void genSlidingMoves(const _Position &, Movelist &, Bitboard, Bitboard, Bitboard); -extern std::array, 65> SQUARES_BETWEEN_BB; +extern std::array, 64> SQUARES_BETWEEN_BB; /* * [(file(sq1), rank(sq1)), (file(sq2), rank(sq2))] -> bitboard of squares between sq1 and sq2, excluding sq1 and sq2 */ diff --git a/moves_io.cpp b/moves_io.cpp index f794881..8afd594 100644 --- a/moves_io.cpp +++ b/moves_io.cpp @@ -111,7 +111,7 @@ template Move uciToMove(const _Position &pos, std } // castling in chess960 if (pos.chess960() && pt == PieceType::KING && pos.template at(target) == PieceType::ROOK && - pos.template at(target) == pos.sideToMove()) { + pos.template at(target) == pos.side_to_move()) { move = Move::make(source, target); } @@ -122,12 +122,12 @@ template Move uciToMove(const _Position &pos, std move = Move::make(source, target); } // en passant - else if (pt == PAWN && target == pos.enpassantSq()) { + else if (pt == PAWN && target == pos.ep_square()) { move = Move::make(source, target); } // promotion - else if (pt == PAWN && uci.length() == 5 && (rank_of(target) == (pos.sideToMove() == WHITE ? RANK_8 : RANK_1))) { + else if (pt == PAWN && uci.length() == 5 && (rank_of(target) == (pos.side_to_move() == WHITE ? RANK_8 : RANK_1))) { auto promotion = parse_pt(uci[4]); if (promotion == NO_PIECE_TYPE || promotion == KING || promotion == PAWN) { @@ -164,8 +164,8 @@ template Move parseSan(const _Position &pos, std: // 1) Castling shortcuts if (san == "O-O" || san == "0-0" || san == "O-O+" || san == "0-0+" || san == "O-O#" || san == "0-0#") { - const auto from = pos.kingSq(pos.side_to_move()); - const auto to = pos.getCastlingMetadata(pos.sideToMove()).rook_start_ks; + const auto from = pos.king_sq(pos.side_to_move()); + const auto to = pos.get_castling_metadata(pos.side_to_move()).rook_start_ks; Move km = chess::Move::make(from, to); if (std::find(moves.begin(), moves.end(), km) != moves.end()) @@ -174,8 +174,8 @@ template Move parseSan(const _Position &pos, std: return Move::none(); } if (san == "O-O-O" || san == "0-0-0" || san == "O-O-O+" || san == "0-0-0+" || san == "O-O-O#" || san == "0-0-0#") { - const auto from = pos.kingSq(pos.side_to_move()); - const auto to = pos.getCastlingMetadata(pos.sideToMove()).rook_start_qs; + const auto from = pos.king_sq(pos.side_to_move()); + const auto to = pos.get_castling_metadata(pos.side_to_move()).rook_start_qs; Move qm = chess::Move::make(from, to); if (std::find(moves.begin(), moves.end(), qm) != moves.end()) @@ -473,7 +473,7 @@ template std::string moveToSan(const _Position &p if (!suffix) return san; _Position p = pos; - p.doMove(move); + p.do_move(move); const bool _check = p.is_check(); Movelist moves; p.legals(moves); diff --git a/moves_io.h b/moves_io.h index 2a00591..7b5d961 100644 --- a/moves_io.h +++ b/moves_io.h @@ -18,6 +18,7 @@ */ #pragma once #include "fwd_decl.h" +#include "types.h" #include #include #include @@ -45,6 +46,15 @@ class AmbiguousMoveException : public std::exception { template Move uciToMove(const _Position &pos, std::string_view uci); template Move parseSan(const _Position &pos, std::string_view uci, bool remove_illegals = false); +template +Move parse_san(const _Position &pos, std::string_view uci, bool remove_illegals = false) { + return parseSan(pos, uci, remove_illegals); +} + template std::string moveToSan(const _Position &pos, Move move, bool long_ = false, bool suffix = true); +template +std::string move_to_san(const _Position &pos, Move move, bool long_ = false, bool suffix = true) { + return moveToSan(pos, move, long_, suffix); +} } // namespace chess::uci diff --git a/non_core_tests.cpp b/non_core_tests.cpp index d1786cd..3c8a47f 100644 --- a/non_core_tests.cpp +++ b/non_core_tests.cpp @@ -145,7 +145,7 @@ TEST_CASE("moveToUci") { TEST_CASE("push_uci/parse_uci") { Position p; REQUIRE(p.parse_uci("e2e4") == Move(SQ_E2, SQ_E4)); - p.setFEN("rn1qkbnr/pP1ppppp/8/1b6/8/8/PPP1PPPP/RNBQKBNR w KQkq - 1 5"); + p.set_fen("rn1qkbnr/pP1ppppp/8/1b6/8/8/PPP1PPPP/RNBQKBNR w KQkq - 1 5"); REQUIRE(p.parse_uci("b7a8q") == Move::make(SQ_B7, SQ_A8, QUEEN)); } template void check_was_into_check(std::vector> &tests) { @@ -274,19 +274,19 @@ void check_repetitions(std::vector> &tests) { { _Position pos(tc.input.FEN); for (auto &move : tc.input.moves) - pos.doMove(move); + pos.do_move(move); REQUIRE(pos.is_repetition(tc.input.repetition) == tc.info); } { _Position pos(tc.input.FEN); for (auto &move : tc.input.moves) - pos.doMove(move); + pos.do_move(move); REQUIRE(pos.is_repetition(tc.input.repetition) == tc.info); } { _Position pos(tc.input.FEN); for (auto &move : tc.input.moves) - pos.doMove(move); + pos.do_move(move); REQUIRE(pos.is_repetition(tc.input.repetition) == tc.info); } } @@ -313,8 +313,8 @@ TEST_SUITE("SAN Parser") { Move m = Move::make(Square::SQ_F6, Square::SQ_E5); - CHECK(uci::moveToSan(b, m) == "fxe5"); - REQUIRE(uci::parseSan(b, "fxe5") == m); + CHECK(uci::move_to_san(b, m) == "fxe5"); + REQUIRE(uci::parse_san(b, "fxe5") == m); } TEST_CASE("Test ambiguous pawn ep capture") { @@ -322,8 +322,8 @@ TEST_SUITE("SAN Parser") { Move m = Move::make(Square::SQ_F5, Square::SQ_G6); - CHECK(uci::moveToSan(b, m) == "fxg6"); - REQUIRE(uci::parseSan(b, "fxg6") == m); + CHECK(uci::move_to_san(b, m) == "fxg6"); + REQUIRE(uci::parse_san(b, "fxg6") == m); } TEST_CASE("Test ambiguous knight move") { @@ -331,8 +331,8 @@ TEST_SUITE("SAN Parser") { Move m = Move::make(Square::SQ_F3, Square::SQ_G5); - CHECK(uci::moveToSan(b, m) == "Nfg5"); - REQUIRE(uci::parseSan(b, "Nfg5") == m); + CHECK(uci::move_to_san(b, m) == "Nfg5"); + REQUIRE(uci::parse_san(b, "Nfg5") == m); } TEST_CASE("Test ambiguous rook move with check") { @@ -340,8 +340,8 @@ TEST_SUITE("SAN Parser") { Move m = Move::make(Square::SQ_C2, Square::SQ_E2); - CHECK(uci::moveToSan(b, m) == "Rce2+"); - REQUIRE(uci::parseSan(b, "Rce2+") == m); + CHECK(uci::move_to_san(b, m) == "Rce2+"); + REQUIRE(uci::parse_san(b, "Rce2+") == m); } TEST_CASE("Test ambiguous rook move with checkmate") { @@ -349,8 +349,8 @@ TEST_SUITE("SAN Parser") { Move m = Move::make(Square::SQ_D2, Square::SQ_E2); - CHECK(uci::moveToSan(b, m) == "Rde2#"); - REQUIRE(uci::parseSan(b, "Rde2#") == m); + CHECK(uci::move_to_san(b, m) == "Rde2#"); + REQUIRE(uci::parse_san(b, "Rde2#") == m); } TEST_CASE("Test Knight move") { @@ -358,8 +358,8 @@ TEST_SUITE("SAN Parser") { Move m = Move::make(Square::SQ_F3, Square::SQ_G5); - CHECK(uci::moveToSan(b, m) == "Ng5"); - REQUIRE(uci::parseSan(b, "Ng5") == m); + CHECK(uci::move_to_san(b, m) == "Ng5"); + REQUIRE(uci::parse_san(b, "Ng5") == m); } TEST_CASE("Test Bishop move") { @@ -367,8 +367,8 @@ TEST_SUITE("SAN Parser") { Move m = Move::make(Square::SQ_F1, Square::SQ_C4); - CHECK(uci::moveToSan(b, m) == "Bc4"); - REQUIRE(uci::parseSan(b, "Bc4") == m); + CHECK(uci::move_to_san(b, m) == "Bc4"); + REQUIRE(uci::parse_san(b, "Bc4") == m); } TEST_CASE("Test Rook move") { @@ -376,8 +376,8 @@ TEST_SUITE("SAN Parser") { Move m = Move::make(Square::SQ_F1, Square::SQ_F7); - CHECK(uci::moveToSan(b, m) == "Rxf7"); - REQUIRE(uci::parseSan(b, "Rxf7") == m); + CHECK(uci::move_to_san(b, m) == "Rxf7"); + REQUIRE(uci::parse_san(b, "Rxf7") == m); } TEST_CASE("Test Queen move") { @@ -385,8 +385,8 @@ TEST_SUITE("SAN Parser") { Move m = Move::make(Square::SQ_F1, Square::SQ_F7); - CHECK(uci::moveToSan(b, m) == "Qxf7+"); - REQUIRE(uci::parseSan(b, "Qxf7+") == m); + CHECK(uci::move_to_san(b, m) == "Qxf7+"); + REQUIRE(uci::parse_san(b, "Qxf7+") == m); } TEST_CASE("Test King move") { @@ -394,8 +394,8 @@ TEST_SUITE("SAN Parser") { Move m = Move::make(Square::SQ_E1, Square::SQ_F1); - CHECK(uci::moveToSan(b, m) == "Kf1"); - REQUIRE(uci::parseSan(b, "Kf1") == m); + CHECK(uci::move_to_san(b, m) == "Kf1"); + REQUIRE(uci::parse_san(b, "Kf1") == m); } TEST_CASE("Test King Castling Short move") { @@ -403,8 +403,8 @@ TEST_SUITE("SAN Parser") { Move m = Move::make(Square::SQ_E1, Square::SQ_H1); - CHECK(uci::moveToSan(b, m) == "O-O"); - REQUIRE(uci::parseSan(b, "O-O") == m); + CHECK(uci::move_to_san(b, m) == "O-O"); + REQUIRE(uci::parse_san(b, "O-O") == m); } TEST_CASE("Test King Castling Long move") { @@ -412,8 +412,8 @@ TEST_SUITE("SAN Parser") { Move m = Move::make(Square::SQ_E1, Square::SQ_A1); - CHECK(uci::moveToSan(b, m) == "O-O-O"); - REQUIRE(uci::parseSan(b, "O-O-O") == m); + CHECK(uci::move_to_san(b, m) == "O-O-O"); + REQUIRE(uci::parse_san(b, "O-O-O") == m); } TEST_CASE("Test King Castling Short move with Zero") { @@ -421,7 +421,7 @@ TEST_SUITE("SAN Parser") { Move m = Move::make(Square::SQ_E1, Square::SQ_H1); - REQUIRE(uci::parseSan(b, "0-0") == m); + REQUIRE(uci::parse_san(b, "0-0") == m); } TEST_CASE("Test King Castling Long move with Zero") { @@ -429,7 +429,7 @@ TEST_SUITE("SAN Parser") { Move m = Move::make(Square::SQ_E1, Square::SQ_A1); - REQUIRE(uci::parseSan(b, "0-0-0") == m); + REQUIRE(uci::parse_san(b, "0-0-0") == m); } // These are removed due to illegal move (annotations aren't allowed strictly) TEST_CASE("Test King Castling Short move with Annotation") { @@ -437,11 +437,11 @@ TEST_SUITE("SAN Parser") { Move m = Move::make(Square::SQ_E1, Square::SQ_H1); Move m2 = Move::none(); - REQUIRE_THROWS_WITH_AS(m2 = uci::parseSan(b, "0-0+?!"), + REQUIRE_THROWS_WITH_AS(m2 = uci::parse_san(b, "0-0+?!"), "illegal san: '0-0+?!' in rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQK2R w KQkq - 0 17", chess::uci::IllegalMoveException); REQUIRE(m2 == Move::none()); - REQUIRE(uci::parseSan(b, "0-0+?!", true) == m); + REQUIRE(uci::parse_san(b, "0-0+?!", true) == m); } TEST_CASE("Test King Castling Long move with Annotation") { @@ -450,12 +450,12 @@ TEST_SUITE("SAN Parser") { Move m = Move::make(Square::SQ_E1, Square::SQ_A1); Move m2 = Move::none(); - REQUIRE_THROWS_WITH_AS(m2 = uci::parseSan(b, "0-0-0+?!"), + REQUIRE_THROWS_WITH_AS(m2 = uci::parse_san(b, "0-0-0+?!"), "illegal san: '0-0-0+?!' in rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/R3K2R w KQkq - 0 1", chess::uci::IllegalMoveException); REQUIRE(m2 == Move::none()); - REQUIRE(uci::parseSan(b, "0-0-0+?!", true) == m); + REQUIRE(uci::parse_san(b, "0-0-0+?!", true) == m); } TEST_CASE("Test Queen Capture Ambiguity") { @@ -463,8 +463,8 @@ TEST_SUITE("SAN Parser") { Move m = Move::make(Square::SQ_C4, Square::SQ_E6); - CHECK(uci::moveToSan(b, m) == "Qcxe6"); - REQUIRE(uci::parseSan(b, "Qcxe6") == m); + CHECK(uci::move_to_san(b, m) == "Qcxe6"); + REQUIRE(uci::parse_san(b, "Qcxe6") == m); } TEST_CASE("Test Rook Ambiguity") { @@ -472,8 +472,8 @@ TEST_SUITE("SAN Parser") { Move m = Move::make(Square::SQ_A1, Square::SQ_A3); - CHECK(uci::moveToSan(b, m) == "R1a3"); - REQUIRE(uci::parseSan(b, "R1a3") == m); + CHECK(uci::move_to_san(b, m) == "R1a3"); + REQUIRE(uci::parse_san(b, "R1a3") == m); } TEST_CASE("Test Rook Capture Ambiguity") { @@ -481,8 +481,8 @@ TEST_SUITE("SAN Parser") { Move m = Move::make(Square::SQ_C8, Square::SQ_C4); - CHECK(uci::moveToSan(b, m) == "R8xc4"); - REQUIRE(uci::parseSan(b, "R8xc4") == m); + CHECK(uci::move_to_san(b, m) == "R8xc4"); + REQUIRE(uci::parse_san(b, "R8xc4") == m); } TEST_CASE("Test Knight Capture Ambiguity") { @@ -490,8 +490,8 @@ TEST_SUITE("SAN Parser") { Move m = Move::make(Square::SQ_C6, Square::SQ_E5); - CHECK(uci::moveToSan(b, m) == "N6xe5"); - REQUIRE(uci::parseSan(b, "N6xe5") == m); + CHECK(uci::move_to_san(b, m) == "N6xe5"); + REQUIRE(uci::parse_san(b, "N6xe5") == m); } TEST_CASE("Test Pawn Capture Promotion Ambiguity") { @@ -499,8 +499,8 @@ TEST_SUITE("SAN Parser") { Move m = Move::make(Square::SQ_E7, Square::SQ_F8, PieceType::QUEEN); - CHECK(uci::moveToSan(b, m) == "exf8=Q+"); - REQUIRE(uci::parseSan(b, "exf8=Q+") == m); + CHECK(uci::move_to_san(b, m) == "exf8=Q+"); + REQUIRE(uci::parse_san(b, "exf8=Q+") == m); } TEST_CASE("Test Pawn Push") { @@ -508,8 +508,8 @@ TEST_SUITE("SAN Parser") { Move m = Move::make(Square::SQ_E2, Square::SQ_E4); - CHECK(uci::moveToSan(b, m) == "e4"); - REQUIRE(uci::parseSan(b, "e4") == m); + CHECK(uci::move_to_san(b, m) == "e4"); + REQUIRE(uci::parse_san(b, "e4") == m); } TEST_CASE("Test Pawn Promotion") { @@ -517,8 +517,8 @@ TEST_SUITE("SAN Parser") { Move m = Move::make(Square::SQ_A7, Square::SQ_A8, PieceType::QUEEN); - CHECK(uci::moveToSan(b, m) == "a8=Q+"); - REQUIRE(uci::parseSan(b, "a8=Q+") == m); + CHECK(uci::move_to_san(b, m) == "a8=Q+"); + REQUIRE(uci::parse_san(b, "a8=Q+") == m); } TEST_CASE("Test Knight Ambiguity") { @@ -526,8 +526,8 @@ TEST_SUITE("SAN Parser") { Move m = Move::make(Square::SQ_D4, Square::SQ_B3); - CHECK(uci::moveToSan(b, m) == "N4b3"); - REQUIRE(uci::parseSan(b, "N4b3") == m); + CHECK(uci::move_to_san(b, m) == "N4b3"); + REQUIRE(uci::parse_san(b, "N4b3") == m); } TEST_CASE("Test Knight Capture Ambiguity") { @@ -535,8 +535,8 @@ TEST_SUITE("SAN Parser") { Move m = Move::make(Square::SQ_D4, Square::SQ_B3); - CHECK(uci::moveToSan(b, m) == "N4xb3"); - REQUIRE(uci::parseSan(b, "N4xb3") == m); + CHECK(uci::move_to_san(b, m) == "N4xb3"); + REQUIRE(uci::parse_san(b, "N4xb3") == m); } TEST_CASE("Test Knight Ambiguity 2") { @@ -545,29 +545,29 @@ TEST_SUITE("SAN Parser") { { Move m = Move::make(Square::SQ_E4, Square::SQ_D6); - CHECK(uci::moveToSan(b, m) == "Ne4d6"); - REQUIRE(uci::parseSan(b, "Ne4d6") == m); + CHECK(uci::move_to_san(b, m) == "Ne4d6"); + REQUIRE(uci::parse_san(b, "Ne4d6") == m); } { Move m = Move::make(Square::SQ_C4, Square::SQ_D6); - CHECK(uci::moveToSan(b, m) == "Nc4d6"); - REQUIRE(uci::parseSan(b, "Nc4d6") == m); + CHECK(uci::move_to_san(b, m) == "Nc4d6"); + REQUIRE(uci::parse_san(b, "Nc4d6") == m); } { Move m = Move::make(Square::SQ_C8, Square::SQ_D6); - CHECK(uci::moveToSan(b, m) == "Nc8d6"); - REQUIRE(uci::parseSan(b, "Nc8d6") == m); + CHECK(uci::move_to_san(b, m) == "Nc8d6"); + REQUIRE(uci::parse_san(b, "Nc8d6") == m); } { Move m = Move::make(Square::SQ_E8, Square::SQ_D6); - CHECK(uci::moveToSan(b, m) == "Ne8d6"); - REQUIRE(uci::parseSan(b, "Ne8d6") == m); + CHECK(uci::move_to_san(b, m) == "Ne8d6"); + REQUIRE(uci::parse_san(b, "Ne8d6") == m); } } @@ -577,8 +577,8 @@ TEST_SUITE("SAN Parser") { { Move m = Move::make(Square::SQ_E4, Square::SQ_D6); - CHECK(uci::moveToSan(b, m) == "Ne4xd6+"); - REQUIRE(uci::parseSan(b, "Ne4xd6+") == m); + CHECK(uci::move_to_san(b, m) == "Ne4xd6+"); + REQUIRE(uci::parse_san(b, "Ne4xd6+") == m); } } @@ -588,29 +588,29 @@ TEST_SUITE("SAN Parser") { { auto m = Move::make(Square::SQ_C2, Square::SQ_D3); - CHECK(uci::moveToSan(b, m) == "Bc2d3"); - REQUIRE(uci::parseSan(b, "Bc2d3") == m); + CHECK(uci::move_to_san(b, m) == "Bc2d3"); + REQUIRE(uci::parse_san(b, "Bc2d3") == m); } { auto m = Move::make(Square::SQ_C4, Square::SQ_D3); - CHECK(uci::moveToSan(b, m) == "Bc4d3"); - REQUIRE(uci::parseSan(b, "Bc4d3") == m); + CHECK(uci::move_to_san(b, m) == "Bc4d3"); + REQUIRE(uci::parse_san(b, "Bc4d3") == m); } { auto m = Move::make(Square::SQ_E2, Square::SQ_D3); - CHECK(uci::moveToSan(b, m) == "Be2d3"); - REQUIRE(uci::parseSan(b, "Be2d3") == m); + CHECK(uci::move_to_san(b, m) == "Be2d3"); + REQUIRE(uci::parse_san(b, "Be2d3") == m); } { auto m = Move::make(Square::SQ_E4, Square::SQ_D3); - CHECK(uci::moveToSan(b, m) == "Be4d3"); - REQUIRE(uci::parseSan(b, "Be4d3") == m); + CHECK(uci::move_to_san(b, m) == "Be4d3"); + REQUIRE(uci::parse_san(b, "Be4d3") == m); } } @@ -620,29 +620,29 @@ TEST_SUITE("SAN Parser") { { auto m = Move::make(Square::SQ_C2, Square::SQ_C3); - CHECK(uci::moveToSan(b, m) == "R2c3"); - REQUIRE(uci::parseSan(b, "R2c3") == m); + CHECK(uci::move_to_san(b, m) == "R2c3"); + REQUIRE(uci::parse_san(b, "R2c3") == m); } { auto m = Move::make(Square::SQ_C2, Square::SQ_D2); - CHECK(uci::moveToSan(b, m) == "Rcd2"); - REQUIRE(uci::parseSan(b, "Rcd2") == m); + CHECK(uci::move_to_san(b, m) == "Rcd2"); + REQUIRE(uci::parse_san(b, "Rcd2") == m); } { auto m = Move::make(Square::SQ_E2, Square::SQ_E3); - CHECK(uci::moveToSan(b, m) == "R2e3"); - REQUIRE(uci::parseSan(b, "R2e3") == m); + CHECK(uci::move_to_san(b, m) == "R2e3"); + REQUIRE(uci::parse_san(b, "R2e3") == m); } { auto m = Move::make(Square::SQ_E2, Square::SQ_D2); - CHECK(uci::moveToSan(b, m) == "Red2"); - REQUIRE(uci::parseSan(b, "Red2") == m); + CHECK(uci::move_to_san(b, m) == "Red2"); + REQUIRE(uci::parse_san(b, "Red2") == m); } } @@ -652,29 +652,29 @@ TEST_SUITE("SAN Parser") { { auto m = Move::make(Square::SQ_C2, Square::SQ_D3); - CHECK(uci::moveToSan(b, m) == "Qc2d3"); - REQUIRE(uci::parseSan(b, "Qc2d3") == m); + CHECK(uci::move_to_san(b, m) == "Qc2d3"); + REQUIRE(uci::parse_san(b, "Qc2d3") == m); } { auto m = Move::make(Square::SQ_C4, Square::SQ_D3); - CHECK(uci::moveToSan(b, m) == "Qc4d3"); - REQUIRE(uci::parseSan(b, "Qc4d3") == m); + CHECK(uci::move_to_san(b, m) == "Qc4d3"); + REQUIRE(uci::parse_san(b, "Qc4d3") == m); } { auto m = Move::make(Square::SQ_E2, Square::SQ_D3); - CHECK(uci::moveToSan(b, m) == "Qe2d3"); - REQUIRE(uci::parseSan(b, "Qe2d3") == m); + CHECK(uci::move_to_san(b, m) == "Qe2d3"); + REQUIRE(uci::parse_san(b, "Qe2d3") == m); } { auto m = Move::make(Square::SQ_E4, Square::SQ_D3); - CHECK(uci::moveToSan(b, m) == "Qe4d3"); - REQUIRE(uci::parseSan(b, "Qe4d3") == m); + CHECK(uci::move_to_san(b, m) == "Qe4d3"); + REQUIRE(uci::parse_san(b, "Qe4d3") == m); } } @@ -684,8 +684,8 @@ TEST_SUITE("SAN Parser") { { auto m = Move::make(Square::SQ_F8, Square::SQ_F6); - CHECK(uci::moveToSan(b, m) == "Q8f6"); - REQUIRE(uci::parseSan(b, "Q8f6") == m); + CHECK(uci::move_to_san(b, m) == "Q8f6"); + REQUIRE(uci::parse_san(b, "Q8f6") == m); } } @@ -695,8 +695,8 @@ TEST_SUITE("SAN Parser") { { auto m = Move::make(Square::SQ_H4, Square::SQ_F6); - CHECK(uci::moveToSan(b, m) == "Q4f6"); - REQUIRE(uci::parseSan(b, "Q4f6") == m); + CHECK(uci::move_to_san(b, m) == "Q4f6"); + REQUIRE(uci::parse_san(b, "Q4f6") == m); } } @@ -706,15 +706,15 @@ TEST_SUITE("SAN Parser") { { auto m = Move::make(Square::SQ_H4, Square::SQ_F6); - CHECK(uci::moveToSan(b, m) == "Qh4f6"); - REQUIRE(uci::parseSan(b, "Qh4f6") == m); + CHECK(uci::move_to_san(b, m) == "Qh4f6"); + REQUIRE(uci::parse_san(b, "Qh4f6") == m); } { auto m = Move::make(Square::SQ_F4, Square::SQ_F6); - CHECK(uci::moveToSan(b, m) == "Qf4f6"); - REQUIRE(uci::parseSan(b, "Qf4f6") == m); + CHECK(uci::move_to_san(b, m) == "Qf4f6"); + REQUIRE(uci::parse_san(b, "Qf4f6") == m); } } @@ -724,15 +724,15 @@ TEST_SUITE("SAN Parser") { { auto m = Move::make(Square::SQ_B1, Square::SQ_B2); - CHECK(uci::moveToSan(b, m) == "R1b2"); - REQUIRE(uci::parseSan(b, "R1b2") == m); + CHECK(uci::move_to_san(b, m) == "R1b2"); + REQUIRE(uci::parse_san(b, "R1b2") == m); } { auto m = Move::make(Square::SQ_D2, Square::SQ_B2); - CHECK(uci::moveToSan(b, m) == "Rdb2"); - REQUIRE(uci::parseSan(b, "Rdb2") == m); + CHECK(uci::move_to_san(b, m) == "Rdb2"); + REQUIRE(uci::parse_san(b, "Rdb2") == m); } } @@ -742,15 +742,15 @@ TEST_SUITE("SAN Parser") { { auto m = Move::make(Square::SQ_B5, Square::SQ_B2); - CHECK(uci::moveToSan(b, m) == "Rbb2"); - REQUIRE(uci::parseSan(b, "Rbb2") == m); + CHECK(uci::move_to_san(b, m) == "Rbb2"); + REQUIRE(uci::parse_san(b, "Rbb2") == m); } { auto m = Move::make(Square::SQ_B5, Square::SQ_B6); - CHECK(uci::moveToSan(b, m) == "R5b6"); - REQUIRE(uci::parseSan(b, "R5b6") == m); + CHECK(uci::move_to_san(b, m) == "R5b6"); + REQUIRE(uci::parse_san(b, "R5b6") == m); } } @@ -760,15 +760,15 @@ TEST_SUITE("SAN Parser") { { auto m = Move::make(Square::SQ_B5, Square::SQ_B2); - CHECK(uci::moveToSan(b, m) == "Rb2"); - REQUIRE(uci::parseSan(b, "Rb2") == m); + CHECK(uci::move_to_san(b, m) == "Rb2"); + REQUIRE(uci::parse_san(b, "Rb2") == m); } { auto m = Move::make(Square::SQ_B5, Square::SQ_B6); - CHECK(uci::moveToSan(b, m) == "R5b6"); - REQUIRE(uci::parseSan(b, "R5b6") == m); + CHECK(uci::move_to_san(b, m) == "R5b6"); + REQUIRE(uci::parse_san(b, "R5b6") == m); } } @@ -778,15 +778,15 @@ TEST_SUITE("SAN Parser") { { auto m = Move::make(Square::SQ_C4, Square::SQ_A6); - CHECK(uci::moveToSan(b, m) == "B4a6"); - REQUIRE(uci::parseSan(b, "B4a6") == m); + CHECK(uci::move_to_san(b, m) == "B4a6"); + REQUIRE(uci::parse_san(b, "B4a6") == m); } { auto m = Move::make(Square::SQ_C4, Square::SQ_D3); - CHECK(uci::moveToSan(b, m) == "Bcd3"); - REQUIRE(uci::parseSan(b, "Bcd3") == m); + CHECK(uci::move_to_san(b, m) == "Bcd3"); + REQUIRE(uci::parse_san(b, "Bcd3") == m); } } @@ -796,15 +796,15 @@ TEST_SUITE("SAN Parser") { { auto m = Move::make(Square::SQ_C4, Square::SQ_A6); - CHECK(uci::moveToSan(b, m) == "Ba6"); - REQUIRE(uci::parseSan(b, "Ba6") == m); + CHECK(uci::move_to_san(b, m) == "Ba6"); + REQUIRE(uci::parse_san(b, "Ba6") == m); } { auto m = Move::make(Square::SQ_C4, Square::SQ_D3); - CHECK(uci::moveToSan(b, m) == "Bcd3"); - REQUIRE(uci::parseSan(b, "Bcd3") == m); + CHECK(uci::move_to_san(b, m) == "Bcd3"); + REQUIRE(uci::parse_san(b, "Bcd3") == m); } } @@ -814,8 +814,8 @@ TEST_SUITE("SAN Parser") { { auto m = Move::make(Square::SQ_C4, Square::SQ_D3); - CHECK(uci::moveToSan(b, m) == "Bcxd3#"); - REQUIRE(uci::parseSan(b, "Bcxd3#") == m); + CHECK(uci::move_to_san(b, m) == "Bcxd3#"); + REQUIRE(uci::parse_san(b, "Bcxd3#") == m); } } @@ -825,15 +825,15 @@ TEST_SUITE("SAN Parser") { { auto m = Move::make(Square::SQ_F1, Square::SQ_F5); - CHECK(uci::moveToSan(b, m) == "Qfxf5+"); - REQUIRE(uci::parseSan(b, "Qfxf5+") == m); + CHECK(uci::move_to_san(b, m) == "Qfxf5+"); + REQUIRE(uci::parse_san(b, "Qfxf5+") == m); } { auto m = Move::make(Square::SQ_H5, Square::SQ_F5); - CHECK(uci::moveToSan(b, m) == "Qhxf5+"); - REQUIRE(uci::parseSan(b, "Qhxf5+") == m); + CHECK(uci::move_to_san(b, m) == "Qhxf5+"); + REQUIRE(uci::parse_san(b, "Qhxf5+") == m); } } @@ -843,15 +843,15 @@ TEST_SUITE("SAN Parser") { { auto m = Move::make(Square::SQ_B5, Square::SQ_B2); - CHECK(uci::moveToSan(b, m) == "Rb2"); - REQUIRE(uci::parseSan(b, "Rb2") == m); + CHECK(uci::move_to_san(b, m) == "Rb2"); + REQUIRE(uci::parse_san(b, "Rb2") == m); } { auto m = Move::make(Square::SQ_B5, Square::SQ_B6); - CHECK(uci::moveToSan(b, m) == "R5b6"); - REQUIRE(uci::parseSan(b, "R5b6") == m); + CHECK(uci::move_to_san(b, m) == "R5b6"); + REQUIRE(uci::parse_san(b, "R5b6") == m); } } @@ -861,8 +861,8 @@ TEST_SUITE("SAN Parser") { { auto m = Move::make(Square::SQ_E2, Square::SQ_D3); - CHECK(uci::moveToSan(b, m) == "Bxd3#"); - REQUIRE(uci::parseSan(b, "Bxd3#") == m); + CHECK(uci::move_to_san(b, m) == "Bxd3#"); + REQUIRE(uci::parse_san(b, "Bxd3#") == m); } } @@ -871,14 +871,14 @@ TEST_SUITE("SAN Parser") { Move m = Move::make(Square::SQ_C4, Square::SQ_E5); - CHECK(uci::moveToSan(b, m) == "Nxe5"); - REQUIRE(uci::parseSan(b, "Nxe5") == m); + CHECK(uci::move_to_san(b, m) == "Nxe5"); + REQUIRE(uci::parse_san(b, "Nxe5") == m); } TEST_CASE("Parse No Move") { Position b; - REQUIRE(uci::parseSan(b, "") == Move::NO_MOVE); + REQUIRE(uci::parse_san(b, "") == Move::NO_MOVE); } TEST_CASE("Should throw on ambiguous move") { @@ -886,7 +886,7 @@ TEST_SUITE("SAN Parser") { Move san = Move::NO_MOVE; - CHECK_THROWS_AS(san = uci::parseSan(b, "Nec3"), uci::AmbiguousMoveException); + CHECK_THROWS_AS(san = uci::parse_san(b, "Nec3"), uci::AmbiguousMoveException); CHECK(san == Move::NO_MOVE); } @@ -895,7 +895,7 @@ TEST_SUITE("SAN Parser") { Move san = Move::NO_MOVE; - CHECK_THROWS_WITH_AS(san = uci::parseSan(b, "Nec4"), + CHECK_THROWS_WITH_AS(san = uci::parse_san(b, "Nec4"), "illegal san: 'Nec4' in 8/8/6K1/4k3/4N3/p4r2/N3N3/8 w - - 3 82", uci::IllegalMoveException); CHECK(san == Move::NO_MOVE); @@ -906,8 +906,8 @@ TEST_SUITE("SAN Parser") { Move m = Move::make(Square::SQ_E1, Square::SQ_H1); - CHECK(uci::moveToSan(b, m) == "O-O#"); - REQUIRE(uci::parseSan(b, "O-O#") == m); + CHECK(uci::move_to_san(b, m) == "O-O#"); + REQUIRE(uci::parse_san(b, "O-O#") == m); } TEST_CASE("Check castle should have +") { @@ -915,8 +915,8 @@ TEST_SUITE("SAN Parser") { Move m = Move::make(Square::SQ_E1, Square::SQ_H1); - CHECK(uci::moveToSan(b, m) == "O-O+"); - REQUIRE(uci::parseSan(b, "O-O+") == m); + CHECK(uci::move_to_san(b, m) == "O-O+"); + REQUIRE(uci::parse_san(b, "O-O+") == m); } } @@ -925,7 +925,7 @@ TEST_SUITE("misc tests") { Position pos(Position::START_CHESS960_FEN, true); REQUIRE(pos.fen(false) == Position::START_CHESS960_FEN); REQUIRE(pos.fen() == Position::START_FEN); - pos.setFEN(Position::START_CHESS960_FEN, true, chess::MODE_SMK); + pos.set_fen(Position::START_CHESS960_FEN, true, chess::MODE_SMK); REQUIRE(pos.fen(false) == Position::START_CHESS960_FEN); REQUIRE(pos.fen() == Position::START_FEN); } diff --git a/position.cpp b/position.cpp index c1636a5..e9bc82b 100644 --- a/position.cpp +++ b/position.cpp @@ -38,6 +38,31 @@ #endif namespace chess { +namespace { + +constexpr Bitboard ep_pawn_mask_for(Square sq) { + const Rank r = rank_of(sq); + if (r != RANK_3 && r != RANK_6) return 0; + + Bitboard m = 1ULL << static_cast(sq); + if (r == RANK_6) + m >>= 8; // WHITE stm → shift down to rank 5 + else + m <<= 8; // BLACK stm → shift up to rank 4 + return ((m << 1) & ~attacks::MASK_FILE[0]) | ((m >> 1) & ~attacks::MASK_FILE[7]); +} + +constexpr std::array make_ep_pawn_masks() { + std::array table{}; + for (int i = 0; i < 64; ++i) + table[i] = ep_pawn_mask_for(static_cast(i)); + return table; +} + +constexpr auto ep_pawn_masks = make_ep_pawn_masks(); + +} // namespace + template template void _Position::doMove(const Move &move) { assert(move.is_ok() && "doMove called with invalid move"); Square from_sq = move.from_sq(), to_sq = move.to_sq(); @@ -48,8 +73,12 @@ template template void _Position template void _Position(from_sq, us); removePiece(rook_start, us); @@ -140,63 +169,53 @@ template template void _Position> 8) : (ep_mask << 8); - - // Keep adjacent files only. - ep_mask = ((ep_mask << 1) & ~attacks::MASK_FILE[0]) | ((ep_mask >> 1) & ~attacks::MASK_FILE[7]); - - // Include key if their pawns can attack it. - state().epIncluded = (ep_mask & pieces(stm)) != 0; + state().epIncluded = (ep_pawn_masks[state().enPassant] & pieces(~us)) != 0; state().hash ^= state().epIncluded ? zobrist::RandomEP[f] : 0; } } { CastlingRights clear_mask = NO_CASTLING; // Moving piece - if (moving_piecetype == KING && from_sq == state().castlingMetadata[us].king_start) { + if (moving_piecetype == KING && from_sq == castling_meta_[us].king_start) { clear_mask |= (us == WHITE ? WHITE_CASTLING : BLACK_CASTLING); } else if (moving_piecetype == ROOK) { - if (from_sq == state().castlingMetadata[us].rook_start_ks) { + if (from_sq == castling_meta_[us].rook_start_ks) { clear_mask |= (us == WHITE ? WHITE_OO : BLACK_OO); - } else if (from_sq == state().castlingMetadata[us].rook_start_qs) { + } else if (from_sq == castling_meta_[us].rook_start_qs) { clear_mask |= (us == WHITE ? WHITE_OOO : BLACK_OOO); } } // Captured piece if (target_piecetype == ROOK) { - if (to_sq == state().castlingMetadata[target_color].rook_start_ks) + if (to_sq == castling_meta_[target_color].rook_start_ks) clear_mask |= (target_color == WHITE ? WHITE_OO : BLACK_OO); - else if (to_sq == state().castlingMetadata[target_color].rook_start_qs) + else if (to_sq == castling_meta_[target_color].rook_start_qs) clear_mask |= (target_color == WHITE ? WHITE_OOO : BLACK_OOO); } - CastlingRights prev = state().castlingRights; - state().castlingRights &= ~clear_mask; - state().hash ^= zobrist::RandomCastle[prev] ^ zobrist::RandomCastle[state().castlingRights]; + if (clear_mask) { + CastlingRights prev = state().castlingRights; + state().castlingRights &= ~clear_mask; + state().hash ^= zobrist::RandomCastle[prev] ^ zobrist::RandomCastle[state().castlingRights]; + } } state().turn = ~state().turn; // Update halfmoves, fullmoves and stm state().fullMoveNumber += (state().turn == WHITE); - state().halfMoveClock = (is_capture || moving_piecetype == PAWN) ? 0 : (state().halfMoveClock + 1); + state().halfMoveClock = (is_capt || moving_piecetype == PAWN) ? 0 : (state().halfMoveClock + 1); state().pliesFromNull++; state().hash ^= zobrist::RandomTurn; + rep_hashes_.push_back(state().hash); refresh_attacks(); // DO NOT MIX REPETITIONS if constexpr (Strict) { - // Calculate the repetition info. It is the ply distance from the previous - // occurrence of the same position, negative in the 3-fold case, or zero - // if the position was not repeated. state().repetition = 0; int end = std::min(rule50_count(), state().pliesFromNull); if (end >= 4) { + Key cur_hash = hash(); for (int i = 4; i <= end; i += 2) { - if (history[history.size() - 1 - i].hash == hash()) { + if (rep_hashes_[rep_hashes_.size() - 1 - i] == cur_hash) state().repetition++; - } } } } @@ -205,6 +224,7 @@ template template void _Position void _Position::setFEN(const std::string &str, bool chess960, FENParsingMode mode) { history.clear(); + rep_hashes_.clear(); history.push_back(HistoryEntry()); _chess960 = chess960; std::fill(std::begin(pieces_list), std::end(pieces_list), PieceC::NO_PIECE); @@ -314,23 +334,23 @@ void _Position::setFEN(const std::string &str, bool chess960, FENPars return static_cast(it - pieces_list); }; - auto findRookQS = [&](Square king_sq, Color color) -> Square { + auto findRookQS = [&](Square king_sq, Color color_) -> Square { Rank r = rank_of(king_sq); for (int f = file_of(king_sq) - 1; f >= FILE_A; --f) { Square sq = make_sq(r, static_cast(f)); PieceC p = pieces_list[sq]; - if (p != PieceC::NO_PIECE && type_of(p) == ROOK && color_of(p) == color) + if (p != PieceC::NO_PIECE && type_of(p) == ROOK && color_of(p) == color_) return sq; } return SQ_NONE; }; - auto findRookKS = [&](Square king_sq, Color color) -> Square { + auto findRookKS = [&](Square king_sq, Color color_) -> Square { Rank r = rank_of(king_sq); for (int f = file_of(king_sq) + 1; f <= FILE_H; ++f) { Square sq = make_sq(r, static_cast(f)); PieceC p = pieces_list[sq]; - if (p != PieceC::NO_PIECE && type_of(p) == ROOK && color_of(p) == color) + if (p != PieceC::NO_PIECE && type_of(p) == ROOK && color_of(p) == color_) return sq; } return SQ_NONE; @@ -351,12 +371,12 @@ void _Position::setFEN(const std::string &str, bool chess960, FENPars if (color == WHITE) { state().castlingRights |= WHITE_OO; - state().castlingMetadata[WHITE].king_start = king_sq; - state().castlingMetadata[WHITE].rook_start_ks = rook_sq; + castling_meta_[WHITE].king_start = king_sq; + castling_meta_[WHITE].rook_start_ks = rook_sq; } else { state().castlingRights |= BLACK_OO; - state().castlingMetadata[BLACK].king_start = king_sq; - state().castlingMetadata[BLACK].rook_start_ks = rook_sq; + castling_meta_[BLACK].king_start = king_sq; + castling_meta_[BLACK].rook_start_ks = rook_sq; } }; @@ -366,12 +386,12 @@ void _Position::setFEN(const std::string &str, bool chess960, FENPars if (color == WHITE) { state().castlingRights |= WHITE_OOO; - state().castlingMetadata[WHITE].king_start = king_sq; - state().castlingMetadata[WHITE].rook_start_qs = rook_sq; + castling_meta_[WHITE].king_start = king_sq; + castling_meta_[WHITE].rook_start_qs = rook_sq; } else { state().castlingRights |= BLACK_OOO; - state().castlingMetadata[BLACK].king_start = king_sq; - state().castlingMetadata[BLACK].rook_start_qs = rook_sq; + castling_meta_[BLACK].king_start = king_sq; + castling_meta_[BLACK].rook_start_qs = rook_sq; } }; @@ -438,21 +458,21 @@ void _Position::setFEN(const std::string &str, bool chess960, FENPars for (Color c : { WHITE, BLACK }) { // king if (castlingRights() & (c & KING_SIDE)) { - const auto king_from = state().castlingMetadata[c].king_start; - const auto rook_from = make_sq(file_of(state().castlingMetadata[c].rook_start_ks), rank_of(king_from)); + const auto king_from = castling_meta_[c].king_start; + const auto rook_from = make_sq(file_of(castling_meta_[c].rook_start_ks), rank_of(king_from)); const auto king_to = castling_king_square(c, true); const auto rook_to = castling_rook_square(c, true); - state().castlingMetadata[c].castling_paths[true] = + castling_meta_[c].castling_paths[true] = (movegen::between(rook_from, rook_to) | movegen::between(king_from, king_to)) & ~((1ULL << king_from) | (1ULL << rook_from)); } // queen if (castlingRights() & (c & QUEEN_SIDE)) { - const auto king_from = state().castlingMetadata[c].king_start; - const auto rook_from = make_sq(file_of(state().castlingMetadata[c].rook_start_qs), rank_of(king_from)); + const auto king_from = castling_meta_[c].king_start; + const auto rook_from = make_sq(file_of(castling_meta_[c].rook_start_qs), rank_of(king_from)); const auto king_to = castling_king_square(c, false); const auto rook_to = castling_rook_square(c, false); - state().castlingMetadata[c].castling_paths[false] = + castling_meta_[c].castling_paths[false] = (movegen::between(rook_from, rook_to) | movegen::between(king_from, king_to)) & ~((1ULL << king_from) | (1ULL << rook_from)); } @@ -464,13 +484,7 @@ void _Position::setFEN(const std::string &str, bool chess960, FENPars Rank r = static_cast(enpassant[1] - '1'); Square ep_sq = make_sq(r, f); state().enPassant = ep_sq; - Bitboard ep_mask = 1ULL << ep_sq; - if (sideToMove() == WHITE) { - ep_mask >>= 8; - } else - ep_mask <<= 8; - ep_mask = ((ep_mask << 1) & ~attacks::MASK_FILE[0]) | ((ep_mask >> 1) & ~attacks::MASK_FILE[7]); - if (ep_mask & pieces(sideToMove())) { + if (ep_pawn_masks[ep_sq] & pieces(side_to_move())) { state().hash ^= zobrist::RandomEP[f]; state().epIncluded = true; } @@ -486,6 +500,7 @@ void _Position::setFEN(const std::string &str, bool chess960, FENPars state().fullMoveNumber = fullmove; refresh_attacks(); state().repetition = state().pliesFromNull = 0; + rep_hashes_.push_back(state().hash); } template std::string _Position::fen(bool xfen) const { @@ -515,28 +530,28 @@ template std::string _Position::fen(boo } // 2) Side to move - ss << ' ' << (sideToMove() == WHITE ? 'w' : 'b'); + ss << ' ' << (side_to_move() == WHITE ? 'w' : 'b'); // 3) Castling availability ss << ' '; std::string castlingStr; if (chess960()) { if (castlingRights() & WHITE_OO) - castlingStr += (xfen && state().castlingMetadata[WHITE].rook_start_ks == SQ_H1) + castlingStr += (xfen && castling_meta_[WHITE].rook_start_ks == SQ_H1) ? 'K' - : static_cast('A' + file_of(state().castlingMetadata[WHITE].rook_start_ks)); + : static_cast('A' + file_of(castling_meta_[WHITE].rook_start_ks)); if (castlingRights() & WHITE_OOO) - castlingStr += (xfen && state().castlingMetadata[WHITE].rook_start_qs == SQ_A1) + castlingStr += (xfen && castling_meta_[WHITE].rook_start_qs == SQ_A1) ? 'Q' - : static_cast('A' + file_of(state().castlingMetadata[WHITE].rook_start_qs)); + : static_cast('A' + file_of(castling_meta_[WHITE].rook_start_qs)); if (castlingRights() & BLACK_OO) - castlingStr += (xfen && state().castlingMetadata[BLACK].rook_start_ks == SQ_H8) + castlingStr += (xfen && castling_meta_[BLACK].rook_start_ks == SQ_H8) ? 'k' - : static_cast('a' + file_of(state().castlingMetadata[BLACK].rook_start_ks)); + : static_cast('a' + file_of(castling_meta_[BLACK].rook_start_ks)); if (castlingRights() & BLACK_OOO) - castlingStr += (xfen && state().castlingMetadata[BLACK].rook_start_qs == SQ_A8) + castlingStr += (xfen && castling_meta_[BLACK].rook_start_qs == SQ_A8) ? 'q' - : static_cast('a' + file_of(state().castlingMetadata[BLACK].rook_start_qs)); + : static_cast('a' + file_of(castling_meta_[BLACK].rook_start_qs)); } else { if (castlingRights() & WHITE_OO) castlingStr += 'K'; @@ -555,10 +570,10 @@ template std::string _Position::fen(boo ss << (ep == SQ_NONE ? "-" : uci::squareToString(ep)); // 5) Halfmove clock - ss << ' ' << (int)halfmoveClock(); + ss << ' ' << (int)rule50_count(); // 6) Fullmove number - ss << ' ' << (int)fullmoveNumber(); + ss << ' ' << (int)fullmove_number(); return ss.str(); } @@ -567,17 +582,17 @@ template template bool _Position() != 1) return false; - Color stm = sideToMove(); + Color stm = side_to_move(); // stm checking - bool whiteInCheck = isAttacked(kingSq(WHITE), BLACK); - bool blackInCheck = isAttacked(kingSq(BLACK), WHITE); + bool whiteInCheck = is_attacked(king_sq(WHITE), BLACK); + bool blackInCheck = is_attacked(king_sq(BLACK), WHITE); // Both kings cannot be in check simultaneously if (whiteInCheck && blackInCheck) return false; // The side to move cannot have its king currently in check from itself (nonsense) - if (isAttacked(kingSq(~stm), stm)) + if (is_attacked(king_sq(~stm), stm)) return false; if (piece_on(SQ_A1) != PieceC::WROOK && (castlingRights() & WHITE_OOO) != 0) return false; @@ -635,17 +650,17 @@ template template bool _Position CheckType _Position::givesCheck(Move move) const { const static auto getSniper = [](const _Position *p, const Square ksq, Bitboard oc) { - const auto us_occ = p->us(p->sideToMove()); + const auto us_occ = p->us(p->side_to_move()); const auto bishop = attacks::bishop(ksq, oc) & p->pieces(PieceType::BISHOP, PieceType::QUEEN) & us_occ; const auto rook = attacks::rook(ksq, oc) & p->pieces(PieceType::ROOK, PieceType::QUEEN) & us_occ; return (bishop | rook); }; - assert(color_of(at(move.from())) == sideToMove()); + assert(color_of(at(move.from())) == side_to_move()); const Square from = move.from(); const Square to = move.to(); - const Square ksq = kingSq(~sideToMove()); + const Square ksq = king_sq(~side_to_move()); const Bitboard toBB = 1ULL << (to); const PieceType pt = piece_of(at(from)); @@ -672,18 +687,18 @@ template CheckType _Position::givesChec if (Bitboard sniper = getSniper(this, ksq, oc)) { const auto sq = static_cast(pop_lsb(sniper)); - return (!(movegen::between(ksq, sq) & toBB) || move.typeOf() == Move::CASTLING) ? CheckType::DISCOVERY_CHECK + return (!(movegen::between(ksq, sq) & toBB) || move.type_of() == Move::CASTLING) ? CheckType::DISCOVERY_CHECK : CheckType::NO_CHECK; } - switch (move.typeOf()) { + switch (move.type_of()) { case Move::NORMAL: return CheckType::NO_CHECK; case Move::PROMOTION: { Bitboard attacks = 0ull; - switch (move.promotionType()) { + switch (move.promotion_type()) { case KNIGHT: attacks = attacks::knight(to); break; @@ -700,7 +715,7 @@ template CheckType _Position::givesChec break; } - return (attacks & pieces(PieceType::KING, ~sideToMove())) ? CheckType::DIRECT_CHECK : CheckType::NO_CHECK; + return (attacks & pieces(PieceType::KING, ~side_to_move())) ? CheckType::DIRECT_CHECK : CheckType::NO_CHECK; } case Move::ENPASSANT: { @@ -718,14 +733,13 @@ template CheckType _Position::givesChec return CheckType::NO_CHECK; // Prevent a compiler warning } template void _Position::refresh_attacks() { - const Color c = sideToMove(); + const Color c = side_to_move(); - Square king_sq = kingSq(c); - _bishop_pin = pinMask(c, king_sq); - _rook_pin = pinMask(c, king_sq); - _pin_mask = _bishop_pin | _rook_pin; + Square king_square = king_sq(c); + pinMasks(c, king_square, _rook_pin, _bishop_pin); + _pin_mask = _rook_pin | _bishop_pin; - _checkers = attackers(~c, king_sq); + _checkers = attackers(~c, king_square); switch (popcount(_checkers)) { case 0: @@ -734,7 +748,7 @@ template void _Position::refresh_attack case 1: { auto sq = static_cast(lsb(_checkers)); - _check_mask = 1ULL << sq | movegen::between(king_sq, sq); + _check_mask = 1ULL << sq | movegen::between(king_square, sq); break; } @@ -757,15 +771,9 @@ template uint64_t _Position::zobrist() { const File f = file_of(ep_sq); Bitboard ep_mask = (1ULL << ep_sq); - - // Shift to the rank where the opposing pawn sits - const Color stm = sideToMove(); - // Color them = ~stm; + const Color stm = side_to_move(); ep_mask = (stm == WHITE) ? (ep_mask >> 8) : (ep_mask << 8); - - // Pawns on adjacent files only ep_mask = ((ep_mask << 1) & ~attacks::MASK_FILE[0]) | ((ep_mask >> 1) & ~attacks::MASK_FILE[7]); - if (ep_mask & pieces(stm)) hash ^= zobrist::RandomEP[f]; } @@ -778,24 +786,24 @@ template Move _Position::parse_uci(std: template Move _Position::push_uci(std::string uci) { const auto mv = parse_uci(std::move(uci)); - doMove(mv); + do_move(mv); return mv; } template Square _Position::_valid_ep_square() const { if (ep_square() == SQ_NONE) return SQ_NONE; Rank ep_rank; - ep_rank = sideToMove() == WHITE ? RANK_6 : RANK_3; + ep_rank = side_to_move() == WHITE ? RANK_6 : RANK_3; const Bitboard mask = 1ULL << ep_square(); Bitboard pawn_mask = mask << 8; Bitboard org_pawn_mask = mask >> 8; - if (sideToMove() == BLACK) + if (side_to_move() == BLACK) std::swap(pawn_mask, org_pawn_mask); // rank 3 or rank 6, depending on color if (rank_of(ep_square()) != ep_rank) return SQ_NONE; // a pawn in 2 ranks behind - if (!(pieces(PAWN) & occ(~sideToMove()) & pawn_mask)) + if (!(pieces(PAWN) & occ(~side_to_move()) & pawn_mask)) return SQ_NONE; // ep_sq must be empty if (occ() & mask) @@ -847,10 +855,10 @@ template bool _Position::is_insufficien return false; } template CastlingRights _Position::clean_castling_rights() const { - const Bitboard cr_BOO = state().castlingMetadata[BLACK].rook_start_ks; - const Bitboard cr_BOOO = state().castlingMetadata[BLACK].rook_start_qs; - const Bitboard cr_WOO = state().castlingMetadata[WHITE].rook_start_ks; - const Bitboard cr_WOOO = state().castlingMetadata[WHITE].rook_start_qs; + const Bitboard cr_BOO = castling_meta_[BLACK].rook_start_ks; + const Bitboard cr_BOOO = castling_meta_[BLACK].rook_start_qs; + const Bitboard cr_WOO = castling_meta_[WHITE].rook_start_ks; + const Bitboard cr_WOOO = castling_meta_[WHITE].rook_start_qs; Bitboard castling = 0; // mappings castling |= (castlingRights() & WHITE_OO) ? cr_WOO : 0; @@ -865,9 +873,9 @@ template CastlingRights _Position::clea white_castling &= (cr_WOO | cr_WOOO); black_castling &= (cr_BOO | cr_BOOO); // king exists in e1/e8 depending on color - if (!(occ(WHITE) & pieces(KING) & (1ULL << state().castlingMetadata[WHITE].king_start))) + if (!(occ(WHITE) & pieces(KING) & (1ULL << castling_meta_[WHITE].king_start))) white_castling = 0; - if (!(occ(BLACK) & pieces(KING) & (1ULL << state().castlingMetadata[BLACK].king_start))) + if (!(occ(BLACK) & pieces(KING) & (1ULL << castling_meta_[BLACK].king_start))) black_castling = 0; castling = white_castling | black_castling; // Re-map @@ -891,7 +899,7 @@ template Move _Position::push_uci(std::string); \ template bool _Position::is_valid() const; \ template bool _Position::is_valid() const; \ template CheckType _Position::givesCheck(Move) const; \ -template bool _Position::is_insufficient_material() const; +template bool _Position::is_insufficient_material(Color c) const; // clang-format off INSTANTIATE(PolyglotPiece) INSTANTIATE(EnginePiece) diff --git a/position.h b/position.h index c879391..ebcc4fb 100644 --- a/position.h +++ b/position.h @@ -44,12 +44,10 @@ template struct alignas(64) HistoryEntry { CastlingRights castlingRights; // Castling rights bitmask Square incr_sqs[4] = { SQ_NONE, SQ_NONE, SQ_NONE, SQ_NONE }; Piece incr_pc[4] = { Piece::NO_PIECE, Piece::NO_PIECE, Piece::NO_PIECE, Piece::NO_PIECE }; - struct { - Square king_start = SQ_NONE; - Square rook_start_ks = SQ_NONE; - Square rook_start_qs = SQ_NONE; - std::array castling_paths; - } castlingMetadata[2]; + Bitboard saved_rook_pin{}; + Bitboard saved_bishop_pin{}; + Bitboard saved_checkers{}; + Bitboard saved_check_mask{}; // implementation-specific implementations goes here }; @@ -89,8 +87,9 @@ template constexpr MoveGenType operator|(MoveGenType a, M } template ::value>> class _Position { private: - // Move history stack + // Move history stack + parallel compact hash array std::vector> history; + std::vector rep_hashes_; Bitboard _rook_pin{}; Bitboard _bishop_pin{}; Bitboard _checkers{}; @@ -110,6 +109,12 @@ template castling_paths{}; + } castling_meta_[2]{}; public: static inline constexpr auto START_FEN = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"; @@ -172,7 +177,7 @@ template inline void legals(Movelist &out) const { - switch (sideToMove()) { + switch (side_to_move()) { case WHITE: legals(out); return; @@ -185,25 +190,35 @@ template void doMove(const Move &move); + template void do_move(const Move &move) { doMove(move); } template inline auto undoMove() -> std::conditional_t, void> { pieces_list[state().incr_sqs[0]] = state().incr_pc[0]; pieces_list[state().incr_sqs[1]] = state().incr_pc[1]; pieces_list[state().incr_sqs[2]] = state().incr_pc[2]; pieces_list[state().incr_sqs[3]] = state().incr_pc[3]; + rep_hashes_.pop_back(); + _rook_pin = state().saved_rook_pin; + _bishop_pin = state().saved_bishop_pin; + _checkers = state().saved_checkers; + _check_mask = state().saved_check_mask; + _pin_mask = _rook_pin | _bishop_pin; if constexpr (RetAll) { HistoryEntry state_ = state(); history.pop_back(); - refresh_attacks(); return state_; } else { history.pop_back(); - refresh_attacks(); return; } } + template inline auto undo_move() -> std::conditional_t, void> { return undoMove(); } inline void doNullMove() { history.push_back(state()); + state().saved_rook_pin = _rook_pin; + state().saved_bishop_pin = _bishop_pin; + state().saved_checkers = _checkers; + state().saved_check_mask = _check_mask; state().incr_sqs[0] = state().incr_sqs[1] = state().incr_sqs[2] = state().incr_sqs[3] = SQ_NONE; state().incr_pc[0] = state().incr_pc[1] = state().incr_pc[2] = state().incr_pc[3] = PieceC::NO_PIECE; state().hash ^= (ep_square() != SQ_NONE && state().epIncluded) ? zobrist::RandomEP[file_of(ep_square())] : 0; @@ -211,12 +226,14 @@ template [[nodiscard]] inline Bitboard pieces(Color c) const { @@ -312,6 +329,7 @@ template inline void placePiece(Square sq, Color c) { @@ -410,29 +430,30 @@ template [[nodiscard]] inline Square square(Color c) const { return static_cast(lsb(pieces(c))); } [[nodiscard]] inline Square kingSq(Color c) const { return state().kings[c]; } + [[nodiscard]] inline Square king_sq(Color c) const { return kingSq(c); } [[nodiscard]] inline Bitboard checkers() const { return _checkers; } [[nodiscard]] inline Bitboard pin_mask() const { return _pin_mask; } inline _Position(std::string fen = START_FEN, bool chess960 = false, FENParsingMode xfen = MODE_AUTO) { history.reserve(6144); + rep_hashes_.reserve(6144); setFEN(fen, chess960, xfen); } - [[nodiscard]] inline bool isCapture(Move mv) const { + [[nodiscard]] inline bool is_capture(Move mv) const { return mv.type_of() == EN_PASSANT || (mv.type_of() != CASTLING && piece_on(mv.to_sq()) != PieceC::NO_PIECE); } - [[nodiscard]] inline bool is_capture(Move mv) const { return isCapture(mv); } - [[nodiscard]] inline bool is_zeroing(Move mv) const { return isCapture(mv) || at(mv.from_sq()) == PAWN; } + [[nodiscard]] inline bool isCapture(Move mv) const { return is_capture(mv); } + [[nodiscard]] inline bool is_zeroing(Move mv) const { return is_capture(mv) || at(mv.from_sq()) == PAWN; } + [[nodiscard]] inline PieceC piece_at(Square sq) const { return piece_on(sq); } [[nodiscard]] std::string fen(bool xfen = true) const; - [[nodiscard]] inline uint8_t halfmoveClock() const { return state().halfMoveClock; } [[nodiscard]] inline uint16_t fullmoveNumber() const { return state().fullMoveNumber; } + [[nodiscard]] inline uint16_t fullmove_number() const { return state().fullMoveNumber; } [[nodiscard]] inline uint8_t rule50_count() const { return state().halfMoveClock; } [[nodiscard]] inline CastlingRights castlingRights(Color c) const { return state().castlingRights & (c == WHITE ? WHITE_CASTLING : BLACK_CASTLING); @@ -440,25 +461,20 @@ template inline T at(Square sq) const { assert(chess::is_valid(sq)); if constexpr (std::is_same_v) - return piece_of(piece_at(sq)); + return piece_of(piece_on(sq)); else if constexpr (std::is_same_v) - return color_of(piece_at(sq)); + return color_of(piece_on(sq)); else - return piece_at(sq); + return piece_on(sq); } - inline Square enpassantSq() const { return ep_square(); } CastlingRights clean_castling_rights() const; void setFEN(const std::string &str, bool chess960 = false, FENParsingMode xfen = MODE_AUTO); inline void set_fen(const std::string &str, bool chess960 = false, FENParsingMode xfen = MODE_AUTO) { setFEN(str, chess960, xfen); } - inline void setFen(const std::string &str, bool chess960 = false, FENParsingMode xfen = MODE_AUTO) { - setFEN(str, chess960, xfen); - } Move parse_uci(std::string) const; Move push_uci(std::string); Square _valid_ep_square() const; @@ -466,17 +482,13 @@ template inline int count() const { return popcount(pieces()); } template inline int count(Color c) const { return popcount(pieces(c)); } inline int count(PieceType pt, Color c) const { return popcount(pieces(pt, c)); } - inline int ply() const { return 2 * (state().fullMoveNumber - 1) + (sideToMove() == BLACK); } + inline int ply() const { return 2 * (state().fullMoveNumber - 1) + (side_to_move() == BLACK); } bool is_insufficient_material(Color c) const; - inline bool isInsufficientMaterial(Color c) const { return is_insufficient_material(c); } - inline bool hasInsufficientMaterial(Color c) const { return is_insufficient_material(c); } - inline bool has_insufficient_material(Color c) const { return is_insufficient_material(c); } inline bool is_insufficient_material() const { - return has_insufficient_material(WHITE) && has_insufficient_material(BLACK); + return is_insufficient_material(WHITE) && is_insufficient_material(BLACK); } - inline bool isInsufficientMaterial() const { return is_insufficient_material(); } - inline bool hasNonPawnMaterial(Color c) const { return bool(us(c) ^ (pieces(PAWN, KING) & us(c))); } - inline bool inCheck() const { return checkers() != 0LL; } + + inline bool hasNonPawnMaterial(Color c) const { return bool(us(c) & ~(pieces(PAWN) | pieces(KING)) & occ(c)); } inline bool is_check() const { return checkers() != 0LL; } inline bool has_castling_rights(Color c) const { return castlingRights(c) != 0; } inline bool has_kingside_castling_rights(Color c) const { return (castlingRights(c) & KING_SIDE) != 0; } @@ -512,9 +524,9 @@ template (~sideToMove()); + Bitboard bb = pieces(~side_to_move()); while (!atk && bb) { - atk |= isAttacked((Square)pop_lsb(bb), sideToMove()); + atk |= is_attacked((Square)pop_lsb(bb), side_to_move()); } return atk != 0; } @@ -533,27 +545,28 @@ template (pop_lsb(path)), occupied); + b |= attackers_mask(~side_to_move(), static_cast(pop_lsb(path)), occupied); } return b != 0; } inline bool is_checkmate() const { Movelist moves; legals(moves); - return inCheck() && !moves.size(); + return is_check() && !moves.size(); } inline bool is_stalemate() const { Movelist moves; legals(moves); - return !inCheck() && !moves.size(); + return !is_check() && !moves.size(); } // Material-only key (note: Zobrist=Zpieces^Zep^Zcastling^Zturn, we just XORs the remaining, it's trivial) inline Key material_key() const { - return hash() ^ (zobrist::RandomTurn * ~sideToMove()) ^ (zobrist::RandomCastle[castlingRights()]) ^ + return hash() ^ (zobrist::RandomTurn * ~side_to_move()) ^ (zobrist::RandomCastle[castlingRights()]) ^ (zobrist::RandomEP[ep_square() == SQ_NONE ? file_of(ep_square()) : FILE_NB]); } template bool is_valid() const; CheckType givesCheck(Move move) const; + [[nodiscard]] inline CheckType gives_check(Move move) const { return givesCheck(move); } /** * @brief Checks if the current position is a draw by 50 move rule. * Keep in mind that by the rules of chess, if the position has 50 half @@ -562,39 +575,47 @@ template * @return */ - [[nodiscard]] inline bool isHalfMoveDraw() const noexcept { return halfmoveClock() >= 100; } + [[nodiscard]] inline bool isHalfMoveDraw() const noexcept { return rule50_count() >= 100; } + [[nodiscard]] inline bool is_half_move_draw() const noexcept { return isHalfMoveDraw(); } [[nodiscard]] inline Bitboard getCastlingPath(Color c, bool isKingSide) const { - return state().castlingMetadata[c].castling_paths[isKingSide]; + return castling_meta_[c].castling_paths[isKingSide]; } - [[nodiscard]] inline auto getCastlingMetadata(Color c) const { return state().castlingMetadata[c]; } + [[nodiscard]] inline Bitboard get_castling_path(Color c, bool isKingSide) const { return getCastlingPath(c, isKingSide); } + [[nodiscard]] inline auto getCastlingMetadata(Color c) const { return castling_meta_[c]; } + [[nodiscard]] inline auto get_castling_metadata(Color c) const { return getCastlingMetadata(c); } private: - template [[nodiscard]] inline Bitboard pinMask(Color c, Square sq) const { - static_assert(pt == BISHOP || pt == ROOK, "Only bishop or rook allowed!"); + void pinMasks(Color c, Square sq, Bitboard &rook_pin, Bitboard &bishop_pin) const { Bitboard occ_opp = occ(~c); Bitboard occ_us = occ(c); - Bitboard opp_sliders; - opp_sliders = (pieces(~c) | pieces(QUEEN, ~c)) & occ_opp; + Bitboard opp_queens = pieces(QUEEN, ~c) & occ_opp; - auto pt_attacks = attacks::slider(sq, occ_opp) & opp_sliders; + Bitboard opp_bishops = (pieces(~c) | opp_queens); + Bitboard bishop_atks = attacks::slider(sq, occ_opp) & opp_bishops; - Bitboard pin = 0ull; + Bitboard opp_rooks = (pieces(~c) | opp_queens); + Bitboard rook_atks = attacks::slider(sq, occ_opp) & opp_rooks; - while (pt_attacks) { - const auto possible_pin = movegen::between(sq, Square(pop_lsb(pt_attacks))); - Bitboard tmp = possible_pin & occ_us; - bool v = tmp && (tmp & (tmp - 1)) == 0; - pin |= v ? possible_pin : 0; + rook_pin = 0; bishop_pin = 0; + while (bishop_atks) { + auto possible = movegen::between(sq, Square(pop_lsb(bishop_atks))); + Bitboard tmp = possible & occ_us; + if (tmp && (tmp & (tmp - 1)) == 0) + bishop_pin |= possible; + } + while (rook_atks) { + auto possible = movegen::between(sq, Square(pop_lsb(rook_atks))); + Bitboard tmp = possible & occ_us; + if (tmp && (tmp & (tmp - 1)) == 0) + rook_pin |= possible; } - - return pin; } void refresh_attacks(); inline const auto &state() const { return history.back(); } inline auto &state() { return history.back(); } public: - inline _Position(const _Position &other) : history(other.history), _chess960(other._chess960) { + inline _Position(const _Position &other) : history(other.history), rep_hashes_(other.rep_hashes_), _chess960(other._chess960), castling_meta_{other.castling_meta_[0], other.castling_meta_[1]} { std::copy(std::begin(other.pieces_list), std::end(other.pieces_list), std::begin(pieces_list)); refresh_attacks(); } diff --git a/printers.cpp b/printers.cpp index 75f920d..87691e4 100644 --- a/printers.cpp +++ b/printers.cpp @@ -52,7 +52,7 @@ template std::ostream &operator<<(std::ostream &os, os << " a b c d e f g h\n"; // Ensure key is printed in hex, but restores after this function - os << "\nFen: " << pos.fen() << "\nKey: " << std::hex << std::uppercase << std::setfill('0') << std::setw(16) << pos.key() + os << "\nFen: " << pos.fen() << "\nKey: " << std::hex << std::uppercase << std::setfill('0') << std::setw(16) << pos.hash() << '\n'; return os; diff --git a/tests.cpp b/tests.cpp index 3a4d970..af0f30f 100644 --- a/tests.cpp +++ b/tests.cpp @@ -22,6 +22,7 @@ #include "printers.h" #include #include +#include using namespace chess; // --------- Color assertions ---------- static_assert(color_of(PolyglotPiece::BPAWN) == BLACK, "BPAWN should be BLACK"); @@ -212,15 +213,15 @@ template uint64_t perft(_Po pos.template legals(moves); uint64_t total = 0; for (const Move &m : moves) { - pos.template doMove(m); + pos.template do_move(m); #if !IS_RELEASE { const auto pre_nm_hash_1 = pos.hash(); const auto pre_nm_fen_1 = pos.fen(); if (pos.zobrist() != pos.hash()) REQUIRE(pos.zobrist() == pos.hash()); - pos.doNullMove(); - pos.undoMove(); + pos.do_null_move(); + pos.undo_move(); if (!(pos.hash() == pre_nm_hash_1 && pos.fen() == pre_nm_fen_1 && pos.zobrist() == pre_nm_hash_1)) { REQUIRE(pos.hash() == pre_nm_hash_1); REQUIRE(pos.fen() == pre_nm_fen_1); @@ -235,8 +236,8 @@ template uint64_t perft(_Po const auto pre_nm_fen_1 = pos.fen(); if (pos.zobrist() != pos.hash()) REQUIRE(pos.zobrist() == pos.hash()); - pos.doNullMove(); - pos.undoMove(); + pos.do_null_move(); + pos.undo_move(); if (!(pos.hash() == pre_nm_hash_1 && pos.fen() == pre_nm_fen_1 && pos.zobrist() == pre_nm_hash_1)) { REQUIRE(pos.hash() == pre_nm_hash_1); REQUIRE(pos.fen() == pre_nm_fen_1); @@ -244,7 +245,7 @@ template uint64_t perft(_Po } } #endif - pos.undoMove(); + pos.undo_move(); if constexpr (EnableDiv) std::cout << m << ": " << nodes << '\n'; total += nodes; @@ -254,19 +255,46 @@ template uint64_t perft(_Po return total; } } +#if !IS_RELEASE +auto split_testcases(std::vector> &entries) { + std::vector> optimized; + + std::sort(entries.begin(), entries.end(), [](const auto &a, const auto &b) { return a.info.nodes < b.info.nodes; }); + + std::vector> bucket1, bucket2, bucket3; + for (const auto &e : entries) { + if (e.info.nodes <= 1'000'000) + bucket1.push_back(e); + else if (e.info.nodes <= 10'000'000) + bucket2.push_back(e); + else if (e.info.nodes <= 1'000'000'000) + bucket3.push_back(e); + } + + size_t n1 = std::min(bucket1.size(), size_t(1000)); + optimized.insert(optimized.end(), bucket1.begin(), bucket1.begin() + n1); + + size_t n2 = std::min(bucket2.size(), size_t(15)); + optimized.insert(optimized.end(), bucket2.begin(), bucket2.begin() + n2); + + size_t n3 = std::min(bucket3.size(), size_t(1)); + if (n3 > 0) { + optimized.insert(optimized.end(), bucket3.end() - n3, bucket3.end()); + } + + return optimized; +} +#endif template -void check_perfts(const std::vector> &entries) { +void check_perfts(std::vector> &entries) { uint64_t nodes = 0; double elapsed = 0; using namespace std::chrono; - for (auto &entry : entries) { - std::cerr << entry.input << " (chess960=false) " << entry.info.depth; #if !IS_RELEASE - if (entry.info.nodes > 1e6) { - std::cerr << "(skipped)\n"; - continue; - } + entries = split_testcases(entries); #endif + for (auto &entry : entries) { + std::cerr << entry.input << " (chess960=false) " << entry.info.depth; std::cerr << '\n'; { _Position pos(entry.input); @@ -329,11 +357,55 @@ void check_perfts(const std::vector> &entries) { double mnps = (nodes / elapsed) / 1'000'000.0; std::cout << "Speed: " << mnps << "Mnps\n"; } + +template [[nodiscard]] inline Bitboard sliderAttacks(Square sq, Bitboard occupied) noexcept { + static constexpr Direction dirs[2][4][2] = { + { EAST, EAST, EAST, WEST, WEST, WEST, WEST, EAST }, + { EAST, DIR_NONE, DIR_NONE, WEST, WEST, DIR_NONE, DIR_NONE, EAST } + }; + + Bitboard attacks = 0ull; + + File pf = file_of(sq); + Rank pr = rank_of(sq); + + for (int i = 0; i < 4; ++i) { + Direction off_f = dirs[ISROOK][i][0]; + Direction off_r = dirs[ISROOK][i][1]; + + File f = pf + off_f; + Rank r = pr + off_r; + for (; is_valid(r, f); f += off_f, r += off_r) { + const auto index = make_sq(f, r); + attacks |= 1ULL << index; + if (occupied & (1ULL << index)) + break; + } + } + + return attacks; +} +TEST_CASE("attacks") { + std::mt19937_64 gen(19937); + std::uniform_int_distribution dis; + for (Square sq = SQ_A1; sq < SQ_NONE; sq++) { + for (int i = 0; i < 100; i++) { + uint64_t bb = dis(gen) & dis(gen) & dis(gen); + REQUIRE(attacks::bishop(sq, bb) == sliderAttacks(sq, bb)); + } + } + for (Square sq = SQ_A1; sq < SQ_NONE; sq++) { + for (int i = 0; i < 100; i++) { + uint64_t bb = dis(gen) & dis(gen) & dis(gen); + REQUIRE(attacks::rook(sq, bb) == sliderAttacks(sq, bb)); + } + } +} TEST_CASE("Castling move making FEN rnbq1k1r/pp1Pbppp/2p5/8/2B5/8/PPP1NnPP/RNBQK2R w KQ - 1 8") { std::string fen = "rnbq1k1r/pp1Pbppp/2p5/8/2B5/8/PPP1NnPP/RNBQK2R w KQ - 1 8"; Position position(fen); REQUIRE(position.hash() == 0x4f874e21f78d3590); - position.doMove(Move::make(SQ_E1, SQ_H1)); + position.do_move(Move::make(SQ_E1, SQ_H1)); REQUIRE(position.hash() == position.zobrist()); REQUIRE(position.hash() == 0x31F235158B7EEE80); REQUIRE(position.fen() == "rnbq1k1r/pp1Pbppp/2p5/8/2B5/8/PPP1NnPP/RNBQ1RK1 b - - 2 8"); @@ -342,7 +414,7 @@ TEST_CASE("EP move making FEN 8/5k1K/8/8/4Pp2/8/8/8 b - e3 0 1") { std::string fen = "8/5k1K/8/8/4Pp2/8/8/8 b - e3 0 1"; Position position(fen); REQUIRE(position.hash() == 0x775d0e2acc42db8c); - position.doMove(Move::make(SQ_F4, SQ_E3)); + position.do_move(Move::make(SQ_F4, SQ_E3)); REQUIRE(position.hash() == position.zobrist()); REQUIRE(position.hash() == 0x3ec71faae73cfbed); REQUIRE(position.fen() == "8/5k1K/8/8/8/4p3/8/8 w - - 0 2"); @@ -351,7 +423,7 @@ TEST_CASE("EP move making FEN 8/5k1K/8/3pP3/8/8/8/8 w - d6 0 2") { std::string fen = "8/5k1K/8/3pP3/8/8/8/8 w - d6 0 2"; Position position(fen); REQUIRE(position.hash() == 0xbdc108e30cccd00b); - position.doMove(Move::make(SQ_E5, SQ_D6)); + position.do_move(Move::make(SQ_E5, SQ_D6)); REQUIRE(position.fen() == "8/5k1K/3P4/8/8/8/8/8 b - - 0 2"); REQUIRE(position.hash() == position.zobrist()); REQUIRE(position.hash() == 0x5c57e65793a2c8fe); @@ -360,26 +432,26 @@ TEST_CASE("Promotion FEN 8/5kP1/7K/8/8/8/8/8 w - - 0 1") { std::string fen = "8/5kP1/7K/8/8/8/8/8 w - - 0 1"; Position position(fen); REQUIRE(position.hash() == 0x3793b24e1b95a6d5); - position.doMove(Move::make(SQ_G7, SQ_G8)); + position.do_move(Move::make(SQ_G7, SQ_G8)); REQUIRE(position.fen() == "6N1/5k2/7K/8/8/8/8/8 b - - 0 1"); REQUIRE(position.hash() == position.zobrist()); REQUIRE(position.hash() == 0x6adb9bf15f32cb92); } TEST_CASE("EP replace on non-EP move") { Position position("rnbqkbnr/pppppp2/7p/6pP/8/8/PPPPPPP1/RNBQKBNR w KQkq g6 0 3"); - position.doMove(Move(SQ_E2, SQ_E4)); + position.do_move(Move(SQ_E2, SQ_E4)); REQUIRE(position.fen() == "rnbqkbnr/pppppp2/7p/6pP/4P3/8/PPPP1PP1/RNBQKBNR b KQkq e3 0 3"); } TEST_CASE("EP ignore on non-EP move") { Position position("rnbqkbnr/pppppp2/7p/6pP/8/8/PPPPPPP1/RNBQKBNR w KQkq g6 0 3"); - position.doMove(Move(SQ_E2, SQ_E3)); + position.do_move(Move(SQ_E2, SQ_E3)); REQUIRE(position.fen() == "rnbqkbnr/pppppp2/7p/6pP/8/4P3/PPPP1PP1/RNBQKBNR b KQkq - 0 3"); } TEST_CASE("Move making and unmaking") { Position position; - position.doMove(Move(SQ_E2, SQ_E4)); + position.do_move(Move(SQ_E2, SQ_E4)); REQUIRE(position.fen() == "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1"); - position.undoMove(); + position.undo_move(); REQUIRE(position.fen() == "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"); } TEST_CASE("Pin detection double push movegen") { @@ -396,9 +468,9 @@ TEST_CASE("Pin detection double push movegen") { } TEST_CASE("Move making pin update") { Position pos("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"); - pos.doMove(Move(SQ_C2, SQ_C4)); - pos.doMove(Move(SQ_A7, SQ_A5)); - pos.doMove(Move(SQ_D1, SQ_A4)); + pos.do_move(Move(SQ_C2, SQ_C4)); + pos.do_move(Move(SQ_A7, SQ_A5)); + pos.do_move(Move(SQ_D1, SQ_A4)); { Movelist out; pos.legals(out); @@ -441,46 +513,46 @@ TEST_CASE("Experienced bugs in this repo") { } { Position p; - p.doMove(Move(SQ_A2, SQ_A3)); - p.doMove(Move(SQ_B8, SQ_A6)); - p.doMove(Move(SQ_F2, SQ_F3)); - p.doMove(Move(SQ_F7, SQ_F5)); + p.do_move(Move(SQ_A2, SQ_A3)); + p.do_move(Move(SQ_B8, SQ_A6)); + p.do_move(Move(SQ_F2, SQ_F3)); + p.do_move(Move(SQ_F7, SQ_F5)); REQUIRE(p.zobrist() == p.hash()); REQUIRE(p.hash() == 4177524090105507023); } { Position p; - p.doMove(Move(SQ_A2, SQ_A3)); + p.do_move(Move(SQ_A2, SQ_A3)); REQUIRE(p.zobrist() == p.hash()); - p.doMove(Move(SQ_B8, SQ_A6)); + p.do_move(Move(SQ_B8, SQ_A6)); REQUIRE(p.zobrist() == p.hash()); - p.doMove(Move(SQ_F2, SQ_F3)); + p.do_move(Move(SQ_F2, SQ_F3)); REQUIRE(p.zobrist() == p.hash()); - p.doMove(Move(SQ_F7, SQ_F5)); + p.do_move(Move(SQ_F7, SQ_F5)); REQUIRE(p.zobrist() == p.hash()); - p.doNullMove(); + p.do_null_move(); REQUIRE(p.zobrist() == p.hash()); - p.undoMove(); + p.undo_move(); REQUIRE(p.zobrist() == p.hash()); - p.undoMove(); + p.undo_move(); REQUIRE(p.zobrist() == p.hash()); - p.undoMove(); + p.undo_move(); REQUIRE(p.zobrist() == p.hash()); - p.undoMove(); + p.undo_move(); REQUIRE(p.zobrist() == p.hash()); - p.undoMove(); + p.undo_move(); REQUIRE(p.zobrist() == p.hash()); } { Position p; - REQUIRE(p.getCastlingPath(WHITE, true) == 0x60); - REQUIRE(p.getCastlingPath(WHITE, false) == 0xe); - REQUIRE(p.getCastlingPath(BLACK, true) == 0x6000000000000000ULL); - REQUIRE(p.getCastlingPath(BLACK, false) == 0xe00000000000000ULL); + REQUIRE(p.get_castling_path(WHITE, true) == 0x60); + REQUIRE(p.get_castling_path(WHITE, false) == 0xe); + REQUIRE(p.get_castling_path(BLACK, true) == 0x6000000000000000ULL); + REQUIRE(p.get_castling_path(BLACK, false) == 0xe00000000000000ULL); } { Position p; - p.setFEN("1nbqkbnr/1ppppppp/r7/8/4P3/8/PPPP1PPP/RNBQK1NR w KQk - 0 3"); + p.set_fen("1nbqkbnr/1ppppppp/r7/8/4P3/8/PPPP1PPP/RNBQK1NR w KQk - 0 3"); REQUIRE(p.fen() == "1nbqkbnr/1ppppppp/r7/8/4P3/8/PPPP1PPP/RNBQK1NR w KQk - 0 3"); } } @@ -494,923 +566,924 @@ TEST_CASE("Captures only?") { } TEST_CASE("Perfts" * doctest::timeout(36000)) { std::vector> tests = { - { "5k2/8/8/8/3K4/8/8/8 w - - 0 1", 1, 8 }, - { "5k2/8/8/8/3K4/8/8/8 w - - 0 1", 3, 310 }, - { "5k2/8/8/8/3K4/8/8/8 w - - 0 1", 6, 95366 }, - { "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", 1, 20 }, - { "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", 2, 400 }, - { "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", 3, 8902 }, - { "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", 4, 197281 }, - { "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", 5, 4865609 }, - { "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", 6, 119060324 }, - { "rnbqkbnr/pppppppp/8/8/8/3P4/PPP1PPPP/RNBQKBNR b KQkq - 0 1", 4, 328511 }, - { "rnbqkbnr/pp1ppppp/2p5/8/8/3P4/PPP1PPPP/RNBQKBNR w KQkq - 0 2", 3, 15206 }, - { "rnbqkbnr/pp1ppppp/2p5/8/8/3P4/PPPKPPPP/RNBQ1BNR b kq - 1 2", 2, 463 }, - { "rnb1kbnr/pp1ppppp/2p5/q7/8/3P4/PPPKPPPP/RNBQ1BNR w kq - 2 3", 1, 4 }, - { "7k/8/8/8/1p6/8/PP6/6K1 w - - 0 1", 1, 8 }, - { "7k/8/8/8/1p6/8/PP6/6K1 w - - 0 1", 2, 33 }, - { "7k/8/8/8/1p6/8/PP6/6K1 w - - 0 1", 3, 270 }, - { "7k/8/8/8/1p6/P7/1P6/6K1 b - - 0 1", 2, 38 }, - { "7k/8/8/8/8/p7/1P6/6K1 w - - 0 2", 1, 8 }, - { "7k/8/8/8/8/p7/1P6/6K1 w - - 0 2", 2, 36 }, - { "7k/8/8/8/1p6/P7/1P6/6K1 b - - 0 1", 3, 234 }, - { "7k/8/8/8/8/pP6/8/6K1 b - - 0 2", 1, 4 }, - { "7k/8/8/8/1p6/8/PP6/6K1 w - - 0 1", 4, 1664 }, - { "7k/8/8/8/1p6/8/PP6/6K1 w - - 0 1", 5, 13931 }, - { "7k/8/8/8/1p6/8/PP6/6K1 w - - 0 1", 6, 94162 }, - { "R6R/3Q4/1Q4Q1/4Q3/2Q4Q/Q4Q2/pp1Q4/kBNNK1B1 w - - 0 1", 1, 216 }, - { "R6R/3Q4/1Q4Q1/4Q3/2Q4Q/Q4Q2/pp1Q4/kBNNK1B1 w - - 0 1", 2, 95 }, - { "R6R/3Q4/1Q4Q1/4Q3/2Q4Q/Q4Q2/pp1Q4/kBNNK1B1 w - - 0 1", 3, 18138 }, - { "R6R/3Q4/1Q4Q1/4Q3/2Q4Q/Q4Q2/pp1Q4/kBNNK1B1 w - - 0 1", 4, 80766 }, - { "R6R/3Q4/1Q4Q1/4Q3/2Q4Q/Q4Q2/pp1Q4/kBNNK1B1 w - - 0 1", 5, 11649711 }, - { "8/2p5/3p4/KP3k1r/2R1Pp2/6P1/8/8 b - e3 0 1", 1, 7 }, - { "8/2p5/3p4/KP3k1r/2R1Pp2/6P1/8/8 b - e3 0 1", 2, 108 }, - { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1", 1, 48 }, - { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1", 2, 2039 }, - { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1", 3, 97862 }, - { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1", 4, 4085603 }, - { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1", 5, 193690690 }, - { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/P1N2Q1p/1PPBBPPP/R3K2R b KQkq - 0 1", 4, 4627439 }, - { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/4P3/PpN2Q1p/1PPBBPPP/R3K2R w KQkq - 0 2", 3, 103849 }, - { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/4P3/PPN2Q1p/1P1BBPPP/R3K2R b KQkq - 0 2", 2, 2098 }, - { "r3k2r/p1ppqpb1/1n2pnp1/3PN3/4P3/PPNb1Q1p/1P1BBPPP/R3K2R w KQkq - 1 3", 1, 46 }, - { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/4P3/P1p2Q1p/1PPBBPPP/R3K2R w KQkq - 0 2", 3, 98073 }, - { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/4P3/P1p2Q1p/RPPBBPPP/4K2R b Kkq - 1 2", 2, 1926 }, - { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/4P3/P4Q1p/RPPpBPPP/4K2R w Kkq - 0 3", 1, 3 }, - { "8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - - 0 1", 1, 14 }, - { "8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - - 0 1", 2, 191 }, - { "8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - - 0 1", 3, 2812 }, - { "8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - - 0 1", 4, 43238 }, - { "8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - - 0 1", 5, 674624 }, - { "8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - - 0 1", 6, 11030083 }, - { "8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - - 0 1", 7, 178633661 }, - { "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/q4N2/Pp1P2PP/R2Q1RK1 w kq - 0 1", 1, 6 }, - { "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/q4N2/Pp1P2PP/R2Q1RK1 w kq - 0 1", 2, 264 }, - { "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/q4N2/Pp1P2PP/R2Q1RK1 w kq - 0 1", 3, 9467 }, - { "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/q4N2/Pp1P2PP/R2Q1RK1 w kq - 0 1", 4, 422333 }, - { "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/q4N2/Pp1P2PP/R2Q1RK1 w kq - 0 1", 5, 15833292 }, - //{ "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/q4N2/Pp1P2PP/R2Q1RK1 w kq - 0 1", 6, 706045033 }, - { "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/q4N2/Pp1P1RPP/R2Q2K1 b kq - 1 1", 4, 2703427 }, - { "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/5q2/Pp1P1RPP/R2Q2K1 w kq - 0 2", 3, 58801 }, - { "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/5q2/Pp1P1RPP/R2Q1K2 b kq - 1 2", 2, 1732 }, - { "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/5q2/P2P1RPP/Rq1Q1K2 w kq - 0 3", 1, 30 }, - { "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/8/Pp1P1RPP/R2q1K2 w kq - 0 3", 1, 2 }, - { "r2q1rk1/pP1p2pp/Q4n2/bbp1p3/Np6/1B3NBn/pPPP1PPP/R3K2R b KQ - 0 1", 1, 6 }, - { "r2q1rk1/pP1p2pp/Q4n2/bbp1p3/Np6/1B3NBn/pPPP1PPP/R3K2R b KQ - 0 1", 2, 264 }, - { "r2q1rk1/pP1p2pp/Q4n2/bbp1p3/Np6/1B3NBn/pPPP1PPP/R3K2R b KQ - 0 1", 3, 9467 }, - { "r2q1rk1/pP1p2pp/Q4n2/bbp1p3/Np6/1B3NBn/pPPP1PPP/R3K2R b KQ - 0 1", 4, 422333 }, - { "r2q1rk1/pP1p2pp/Q4n2/bbp1p3/Np6/1B3NBn/pPPP1PPP/R3K2R b KQ - 0 1", 5, 15833292 }, - //{ "r2q1rk1/pP1p2pp/Q4n2/bbp1p3/Np6/1B3NBn/pPPP1PPP/R3K2R b KQ - 0 1", 6, 706045033 } - { "rnbq1k1r/pp1Pbppp/2p5/8/2B5/8/PPP1NnPP/RNBQK2R w KQ - 1 8", 1, 44 }, - { "rnbq1k1r/pp1Pbppp/2p5/8/2B5/8/PPP1NnPP/RNBQK2R w KQ - 1 8", 2, 1486 }, - { "rnbq1k1r/pp1Pbppp/2p5/8/2B5/8/PPP1NnPP/RNBQK2R w KQ - 1 8", 3, 62379 }, - { "rnbq1k1r/pp1Pbppp/2p5/8/2B5/8/PPP1NnPP/RNBQK2R w KQ - 1 8", 4, 2103487 }, - { "rnbq1k1r/pp1Pbppp/2p5/8/2B5/8/PPP1NnPP/RNBQK2R w KQ - 1 8", 5, 89941194 }, - { "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10", 1, 46 }, - { "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10", 2, 2079 }, - { "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10", 3, 89890 }, - { "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10", 4, 3894594 }, - { "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10", 5, 164075551 }, - { "7K/5kP1/8/8/8/8/8/8 w - - 0 1", 1, 5 }, - { "7K/5kP1/8/8/8/8/8/8 w - - 0 1", 2, 18 }, - { "7K/5kP1/8/8/8/8/8/8 w - - 0 1", 3, 176 }, - { "7K/5kP1/8/8/8/8/8/8 w - - 0 1", 4, 859 }, - { "7K/5kP1/8/8/8/8/8/8 w - - 0 1", 5, 12510 }, - { "7K/5kP1/8/8/8/8/8/8 w - - 0 1", 6, 63994 }, - { "7K/5kP1/8/8/8/8/8/8 w - - 0 1", 7, 1109712 }, - { "7K/5kP1/8/8/8/8/8/8 w - - 0 1", 8, 5763773 }, - { "7K/5kP1/8/8/8/8/8/8 w - - 0 1", 9, 109424670 }, + { "5k2/8/8/8/3K4/8/8/8 w - - 0 1", 1, 8 }, + { "5k2/8/8/8/3K4/8/8/8 w - - 0 1", 3, 310 }, + { "5k2/8/8/8/3K4/8/8/8 w - - 0 1", 6, 95366 }, + { "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", 1, 20 }, + { "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", 2, 400 }, + { "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", 3, 8902 }, + { "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", 4, 197281 }, + { "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", 5, 4865609 }, + { "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", 6, 119060324 }, + { "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", 6, 119060324 }, + { "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", 7, 3195901860 }, + { "rnbqkbnr/pppppppp/8/8/8/3P4/PPP1PPPP/RNBQKBNR b KQkq - 0 1", 4, 328511 }, + { "rnbqkbnr/pp1ppppp/2p5/8/8/3P4/PPP1PPPP/RNBQKBNR w KQkq - 0 2", 3, 15206 }, + { "rnbqkbnr/pp1ppppp/2p5/8/8/3P4/PPPKPPPP/RNBQ1BNR b kq - 1 2", 2, 463 }, + { "rnb1kbnr/pp1ppppp/2p5/q7/8/3P4/PPPKPPPP/RNBQ1BNR w kq - 2 3", 1, 4 }, + { "7k/8/8/8/1p6/8/PP6/6K1 w - - 0 1", 1, 8 }, + { "7k/8/8/8/1p6/8/PP6/6K1 w - - 0 1", 2, 33 }, + { "7k/8/8/8/1p6/8/PP6/6K1 w - - 0 1", 3, 270 }, + { "7k/8/8/8/1p6/P7/1P6/6K1 b - - 0 1", 2, 38 }, + { "7k/8/8/8/8/p7/1P6/6K1 w - - 0 2", 1, 8 }, + { "7k/8/8/8/8/p7/1P6/6K1 w - - 0 2", 2, 36 }, + { "7k/8/8/8/1p6/P7/1P6/6K1 b - - 0 1", 3, 234 }, + { "7k/8/8/8/8/pP6/8/6K1 b - - 0 2", 1, 4 }, + { "7k/8/8/8/1p6/8/PP6/6K1 w - - 0 1", 4, 1664 }, + { "7k/8/8/8/1p6/8/PP6/6K1 w - - 0 1", 5, 13931 }, + { "7k/8/8/8/1p6/8/PP6/6K1 w - - 0 1", 6, 94162 }, + { "R6R/3Q4/1Q4Q1/4Q3/2Q4Q/Q4Q2/pp1Q4/kBNNK1B1 w - - 0 1", 1, 216 }, + { "R6R/3Q4/1Q4Q1/4Q3/2Q4Q/Q4Q2/pp1Q4/kBNNK1B1 w - - 0 1", 2, 95 }, + { "R6R/3Q4/1Q4Q1/4Q3/2Q4Q/Q4Q2/pp1Q4/kBNNK1B1 w - - 0 1", 3, 18138 }, + { "R6R/3Q4/1Q4Q1/4Q3/2Q4Q/Q4Q2/pp1Q4/kBNNK1B1 w - - 0 1", 4, 80766 }, + { "R6R/3Q4/1Q4Q1/4Q3/2Q4Q/Q4Q2/pp1Q4/kBNNK1B1 w - - 0 1", 5, 11649711 }, + { "8/2p5/3p4/KP3k1r/2R1Pp2/6P1/8/8 b - e3 0 1", 1, 7 }, + { "8/2p5/3p4/KP3k1r/2R1Pp2/6P1/8/8 b - e3 0 1", 2, 108 }, + { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1", 1, 48 }, + { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1", 2, 2039 }, + { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1", 3, 97862 }, + { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1", 4, 4085603 }, + { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1", 5, 193690690 }, + { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/P1N2Q1p/1PPBBPPP/R3K2R b KQkq - 0 1", 4, 4627439 }, + { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/4P3/PpN2Q1p/1PPBBPPP/R3K2R w KQkq - 0 2", 3, 103849 }, + { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/4P3/PPN2Q1p/1P1BBPPP/R3K2R b KQkq - 0 2", 2, 2098 }, + { "r3k2r/p1ppqpb1/1n2pnp1/3PN3/4P3/PPNb1Q1p/1P1BBPPP/R3K2R w KQkq - 1 3", 1, 46 }, + { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/4P3/P1p2Q1p/1PPBBPPP/R3K2R w KQkq - 0 2", 3, 98073 }, + { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/4P3/P1p2Q1p/RPPBBPPP/4K2R b Kkq - 1 2", 2, 1926 }, + { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/4P3/P4Q1p/RPPpBPPP/4K2R w Kkq - 0 3", 1, 3 }, + { "8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - - 0 1", 1, 14 }, + { "8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - - 0 1", 2, 191 }, + { "8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - - 0 1", 3, 2812 }, + { "8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - - 0 1", 4, 43238 }, + { "8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - - 0 1", 5, 674624 }, + { "8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - - 0 1", 6, 11030083 }, + { "8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - - 0 1", 7, 178633661 }, + { "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/q4N2/Pp1P2PP/R2Q1RK1 w kq - 0 1", 1, 6 }, + { "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/q4N2/Pp1P2PP/R2Q1RK1 w kq - 0 1", 2, 264 }, + { "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/q4N2/Pp1P2PP/R2Q1RK1 w kq - 0 1", 3, 9467 }, + { "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/q4N2/Pp1P2PP/R2Q1RK1 w kq - 0 1", 4, 422333 }, + { "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/q4N2/Pp1P2PP/R2Q1RK1 w kq - 0 1", 5, 15833292 }, + { "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/q4N2/Pp1P2PP/R2Q1RK1 w kq - 0 1", 6, 706045033 }, + { "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/q4N2/Pp1P1RPP/R2Q2K1 b kq - 1 1", 4, 2703427 }, + { "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/5q2/Pp1P1RPP/R2Q2K1 w kq - 0 2", 3, 58801 }, + { "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/5q2/Pp1P1RPP/R2Q1K2 b kq - 1 2", 2, 1732 }, + { "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/5q2/P2P1RPP/Rq1Q1K2 w kq - 0 3", 1, 30 }, + { "r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/8/Pp1P1RPP/R2q1K2 w kq - 0 3", 1, 2 }, + { "r2q1rk1/pP1p2pp/Q4n2/bbp1p3/Np6/1B3NBn/pPPP1PPP/R3K2R b KQ - 0 1", 1, 6 }, + { "r2q1rk1/pP1p2pp/Q4n2/bbp1p3/Np6/1B3NBn/pPPP1PPP/R3K2R b KQ - 0 1", 2, 264 }, + { "r2q1rk1/pP1p2pp/Q4n2/bbp1p3/Np6/1B3NBn/pPPP1PPP/R3K2R b KQ - 0 1", 3, 9467 }, + { "r2q1rk1/pP1p2pp/Q4n2/bbp1p3/Np6/1B3NBn/pPPP1PPP/R3K2R b KQ - 0 1", 4, 422333 }, + { "r2q1rk1/pP1p2pp/Q4n2/bbp1p3/Np6/1B3NBn/pPPP1PPP/R3K2R b KQ - 0 1", 5, 15833292 }, + { "r2q1rk1/pP1p2pp/Q4n2/bbp1p3/Np6/1B3NBn/pPPP1PPP/R3K2R b KQ - 0 1", 6, 706045033 }, + { "rnbq1k1r/pp1Pbppp/2p5/8/2B5/8/PPP1NnPP/RNBQK2R w KQ - 1 8", 1, 44 }, + { "rnbq1k1r/pp1Pbppp/2p5/8/2B5/8/PPP1NnPP/RNBQK2R w KQ - 1 8", 2, 1486 }, + { "rnbq1k1r/pp1Pbppp/2p5/8/2B5/8/PPP1NnPP/RNBQK2R w KQ - 1 8", 3, 62379 }, + { "rnbq1k1r/pp1Pbppp/2p5/8/2B5/8/PPP1NnPP/RNBQK2R w KQ - 1 8", 4, 2103487 }, + { "rnbq1k1r/pp1Pbppp/2p5/8/2B5/8/PPP1NnPP/RNBQK2R w KQ - 1 8", 5, 89941194 }, + { "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10", 1, 46 }, + { "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10", 2, 2079 }, + { "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10", 3, 89890 }, + { "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10", 4, 3894594 }, + { "r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10", 5, 164075551 }, + { "7K/5kP1/8/8/8/8/8/8 w - - 0 1", 1, 5 }, + { "7K/5kP1/8/8/8/8/8/8 w - - 0 1", 2, 18 }, + { "7K/5kP1/8/8/8/8/8/8 w - - 0 1", 3, 176 }, + { "7K/5kP1/8/8/8/8/8/8 w - - 0 1", 4, 859 }, + { "7K/5kP1/8/8/8/8/8/8 w - - 0 1", 5, 12510 }, + { "7K/5kP1/8/8/8/8/8/8 w - - 0 1", 6, 63994 }, + { "7K/5kP1/8/8/8/8/8/8 w - - 0 1", 7, 1109712 }, + { "7K/5kP1/8/8/8/8/8/8 w - - 0 1", 8, 5763773 }, + { "7K/5kP1/8/8/8/8/8/8 w - - 0 1", 9, 109424670 }, // https://www.chessprogramming.net/perfect-perft/ - { "3k4/3p4/8/K1P4r/8/8/8/8 b - - 0 1", 6, 1134888 }, - { "8/8/4k3/8/2p5/8/B2P2K1/8 w - - 0 1", 6, 1015133 }, - { "8/8/1k6/2b5/2pP4/8/5K2/8 b - d3 0 1", 6, 1440467 }, - { "5k2/8/8/8/8/8/8/4K2R w K - 0 1", 6, 661072 }, - { "3k4/8/8/8/8/8/8/R3K3 w Q - 0 1", 6, 803711 }, - { "r3k2r/1b4bq/8/8/8/8/7B/R3K2R w KQkq - 0 1", 4, 1274206 }, - { "r3k2r/8/3Q4/8/8/5q2/8/R3K2R b KQkq - 0 1", 4, 1720476 }, - { "8/8/1P2K3/8/2n5/1q6/8/5k2 b - - 0 1", 5, 1004658 }, - { "4k3/1P6/8/8/8/8/K7/8 w - - 0 1", 6, 217342 }, - { "8/P1k5/K7/8/8/8/8/8 w - - 0 1", 6, 92683 }, - { "K1k5/8/P7/8/8/8/8/8 w - - 0 1", 6, 2217 }, - { "8/k1P5/8/1K6/8/8/8/8 w - - 0 1", 7, 567584 }, - { "8/8/2k5/5q2/5n2/8/5K2/8 b - - 0 1", 4, 23527 }, + { "3k4/3p4/8/K1P4r/8/8/8/8 b - - 0 1", 6, 1134888 }, + { "8/8/4k3/8/2p5/8/B2P2K1/8 w - - 0 1", 6, 1015133 }, + { "8/8/1k6/2b5/2pP4/8/5K2/8 b - d3 0 1", 6, 1440467 }, + { "5k2/8/8/8/8/8/8/4K2R w K - 0 1", 6, 661072 }, + { "3k4/8/8/8/8/8/8/R3K3 w Q - 0 1", 6, 803711 }, + { "r3k2r/1b4bq/8/8/8/8/7B/R3K2R w KQkq - 0 1", 4, 1274206 }, + { "r3k2r/8/3Q4/8/8/5q2/8/R3K2R b KQkq - 0 1", 4, 1720476 }, + { "8/8/1P2K3/8/2n5/1q6/8/5k2 b - - 0 1", 5, 1004658 }, + { "4k3/1P6/8/8/8/8/K7/8 w - - 0 1", 6, 217342 }, + { "8/P1k5/K7/8/8/8/8/8 w - - 0 1", 6, 92683 }, + { "K1k5/8/P7/8/8/8/8/8 w - - 0 1", 6, 2217 }, + { "8/k1P5/8/1K6/8/8/8/8 w - - 0 1", 7, 567584 }, + { "8/8/2k5/5q2/5n2/8/5K2/8 b - - 0 1", 4, 23527 }, // https://github.com/SebLague/Chess-Coding-Adventure/blob/Chess-V2-Unity/Assets/Scripts/Testing/Perft/Suites/Suite%20Full.txt // converted to [fen, depth, nodes], deduped tests - { "2b1b3/1r1P4/3K3p/1p6/2p5/6k1/1P3p2/4B3 w - - 0 42", 5, 5617302 }, - { "8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - -", 6, 11030083 }, - { "r3k2r/pp3pp1/PN1pr1p1/4p1P1/4P3/3P4/P1P2PP1/R3K2R w KQkq - 4 4", 5, 15587335 }, - { "rnbq1k1r/pp1Pbppp/2p5/8/2B5/8/PPP1NnPP/RNBQK2R w KQ - 1 8", 5, 89941194 }, - { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq -", 5, 193690690 }, - { "r3k1nr/p2pp1pp/b1n1P1P1/1BK1Pp1q/8/8/2PP1PPP/6N1 w kq - 0 1", 4, 497787 }, - { "3k4/8/8/8/8/8/8/R3K3 w Q - 0 1", 7, 15594314 }, - { "2K2r2/4P3/8/8/8/8/8/3k4 w - - 0 1", 6, 3821001 }, - { "K1k5/8/P7/8/8/8/8/8 w - - 0 1", 10, 5966690 }, - { "8/8/2k5/5q2/5n2/8/5K2/8 b - - 0 1", 6, 3114998 }, - { "4k2r/1pp1n2p/6N1/K2P2r1/1P2P3/P5P1/3b3P/R7 w k - 1 8", 4, 380429 }, - { "r1bq2r1/1pppkppp/1b3n2/pP1PP3/2n5/2P5/P3QPPP/RNB1K2R w KQ a6 0 12", 5, 42761834 }, - { "4k2r/1pp1n2p/6N1/1K1P2r1/4P3/P5P1/1Pp4P/R7 w k - 0 6", 5, 10574719 }, - { "r3k2r/pppqbppp/3p1n1B/1N2p3/1nB1P3/3P3b/PPPQNPPP/R3K2R w KQkq - 11 10", 4, 3050662 }, - { "1Bb3BN/R2Pk2r/1Q5B/4q2R/2bN4/4Q1BK/1p6/1bq1R1rb w - - 0 1", 4, 6871272 }, - { "8/2k1p3/3pP3/3P2K1/8/8/8/8 w - - 0 1", 9, 7618365 }, - { "3r4/2p1p3/8/1P1P1P2/3K4/5k2/8/8 b - - 0 1", 4, 28181 }, - { "8/1p4p1/8/q1PK1P1r/3p1k2/8/4P3/4Q3 b - - 0 1", 5, 6323457 }, + { "2b1b3/1r1P4/3K3p/1p6/2p5/6k1/1P3p2/4B3 w - - 0 42", 5, 5617302 }, + { "8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - -", 6, 11030083 }, + { "r3k2r/pp3pp1/PN1pr1p1/4p1P1/4P3/3P4/P1P2PP1/R3K2R w KQkq - 4 4", 5, 15587335 }, + { "rnbq1k1r/pp1Pbppp/2p5/8/2B5/8/PPP1NnPP/RNBQK2R w KQ - 1 8", 5, 89941194 }, + { "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq -", 5, 193690690 }, + { "r3k1nr/p2pp1pp/b1n1P1P1/1BK1Pp1q/8/8/2PP1PPP/6N1 w kq - 0 1", 4, 497787 }, + { "3k4/8/8/8/8/8/8/R3K3 w Q - 0 1", 7, 15594314 }, + { "2K2r2/4P3/8/8/8/8/8/3k4 w - - 0 1", 6, 3821001 }, + { "K1k5/8/P7/8/8/8/8/8 w - - 0 1", 10, 5966690 }, + { "8/8/2k5/5q2/5n2/8/5K2/8 b - - 0 1", 6, 3114998 }, + { "4k2r/1pp1n2p/6N1/K2P2r1/1P2P3/P5P1/3b3P/R7 w k - 1 8", 4, 380429 }, + { "r1bq2r1/1pppkppp/1b3n2/pP1PP3/2n5/2P5/P3QPPP/RNB1K2R w KQ a6 0 12", 5, 42761834 }, + { "4k2r/1pp1n2p/6N1/1K1P2r1/4P3/P5P1/1Pp4P/R7 w k - 0 6", 5, 10574719 }, + { "r3k2r/pppqbppp/3p1n1B/1N2p3/1nB1P3/3P3b/PPPQNPPP/R3K2R w KQkq - 11 10", 4, 3050662 }, + { "1Bb3BN/R2Pk2r/1Q5B/4q2R/2bN4/4Q1BK/1p6/1bq1R1rb w - - 0 1", 4, 6871272 }, + { "8/2k1p3/3pP3/3P2K1/8/8/8/8 w - - 0 1", 9, 7618365 }, + { "3r4/2p1p3/8/1P1P1P2/3K4/5k2/8/8 b - - 0 1", 4, 28181 }, + { "8/1p4p1/8/q1PK1P1r/3p1k2/8/4P3/4Q3 b - - 0 1", 5, 6323457 }, // http://www.rocechess.ch/perft.html - { "4k3/8/8/8/8/8/8/4K2R w K - 0 1", 1, 15 }, - { "4k3/8/8/8/8/8/8/4K2R w K - 0 1", 2, 66 }, - { "4k3/8/8/8/8/8/8/4K2R w K - 0 1", 3, 1197 }, - { "4k3/8/8/8/8/8/8/4K2R w K - 0 1", 4, 7059 }, - { "4k3/8/8/8/8/8/8/4K2R w K - 0 1", 5, 133987 }, - { "4k3/8/8/8/8/8/8/4K2R w K - 0 1", 6, 764643 }, - { "4k3/8/8/8/8/8/8/R3K3 w Q - 0 1", 1, 16 }, - { "4k3/8/8/8/8/8/8/R3K3 w Q - 0 1", 2, 71 }, - { "4k3/8/8/8/8/8/8/R3K3 w Q - 0 1", 3, 1287 }, - { "4k3/8/8/8/8/8/8/R3K3 w Q - 0 1", 4, 7626 }, - { "4k3/8/8/8/8/8/8/R3K3 w Q - 0 1", 5, 145232 }, - { "4k3/8/8/8/8/8/8/R3K3 w Q - 0 1", 6, 846648 }, - { "4k2r/8/8/8/8/8/8/4K3 w k - 0 1", 1, 5 }, - { "4k2r/8/8/8/8/8/8/4K3 w k - 0 1", 2, 75 }, - { "4k2r/8/8/8/8/8/8/4K3 w k - 0 1", 3, 459 }, - { "4k2r/8/8/8/8/8/8/4K3 w k - 0 1", 4, 8290 }, - { "4k2r/8/8/8/8/8/8/4K3 w k - 0 1", 5, 47635 }, - { "4k2r/8/8/8/8/8/8/4K3 w k - 0 1", 6, 899442 }, - { "r3k3/8/8/8/8/8/8/4K3 w q - 0 1", 1, 5 }, - { "r3k3/8/8/8/8/8/8/4K3 w q - 0 1", 2, 80 }, - { "r3k3/8/8/8/8/8/8/4K3 w q - 0 1", 3, 493 }, - { "r3k3/8/8/8/8/8/8/4K3 w q - 0 1", 4, 8897 }, - { "r3k3/8/8/8/8/8/8/4K3 w q - 0 1", 5, 52710 }, - { "r3k3/8/8/8/8/8/8/4K3 w q - 0 1", 6, 1001523 }, - { "4k3/8/8/8/8/8/8/R3K2R w KQ - 0 1", 1, 26 }, - { "4k3/8/8/8/8/8/8/R3K2R w KQ - 0 1", 2, 112 }, - { "4k3/8/8/8/8/8/8/R3K2R w KQ - 0 1", 3, 3189 }, - { "4k3/8/8/8/8/8/8/R3K2R w KQ - 0 1", 4, 17945 }, - { "4k3/8/8/8/8/8/8/R3K2R w KQ - 0 1", 5, 532933 }, - { "4k3/8/8/8/8/8/8/R3K2R w KQ - 0 1", 6, 2788982 }, - { "r3k2r/8/8/8/8/8/8/4K3 w kq - 0 1", 1, 5 }, - { "r3k2r/8/8/8/8/8/8/4K3 w kq - 0 1", 2, 130 }, - { "r3k2r/8/8/8/8/8/8/4K3 w kq - 0 1", 3, 782 }, - { "r3k2r/8/8/8/8/8/8/4K3 w kq - 0 1", 4, 22180 }, - { "r3k2r/8/8/8/8/8/8/4K3 w kq - 0 1", 5, 118882 }, - { "r3k2r/8/8/8/8/8/8/4K3 w kq - 0 1", 6, 3517770 }, - { "8/8/8/8/8/8/6k1/4K2R w K - 0 1", 1, 12 }, - { "8/8/8/8/8/8/6k1/4K2R w K - 0 1", 2, 38 }, - { "8/8/8/8/8/8/6k1/4K2R w K - 0 1", 3, 564 }, - { "8/8/8/8/8/8/6k1/4K2R w K - 0 1", 4, 2219 }, - { "8/8/8/8/8/8/6k1/4K2R w K - 0 1", 5, 37735 }, - { "8/8/8/8/8/8/6k1/4K2R w K - 0 1", 6, 185867 }, - { "8/8/8/8/8/8/1k6/R3K3 w Q - 0 1", 1, 15 }, - { "8/8/8/8/8/8/1k6/R3K3 w Q - 0 1", 2, 65 }, - { "8/8/8/8/8/8/1k6/R3K3 w Q - 0 1", 3, 1018 }, - { "8/8/8/8/8/8/1k6/R3K3 w Q - 0 1", 4, 4573 }, - { "8/8/8/8/8/8/1k6/R3K3 w Q - 0 1", 5, 80619 }, - { "8/8/8/8/8/8/1k6/R3K3 w Q - 0 1", 6, 413018 }, - { "4k2r/6K1/8/8/8/8/8/8 w k - 0 1", 1, 3 }, - { "4k2r/6K1/8/8/8/8/8/8 w k - 0 1", 2, 32 }, - { "4k2r/6K1/8/8/8/8/8/8 w k - 0 1", 3, 134 }, - { "4k2r/6K1/8/8/8/8/8/8 w k - 0 1", 4, 2073 }, - { "4k2r/6K1/8/8/8/8/8/8 w k - 0 1", 5, 10485 }, - { "4k2r/6K1/8/8/8/8/8/8 w k - 0 1", 6, 179869 }, - { "r3k3/1K6/8/8/8/8/8/8 w q - 0 1", 1, 4 }, - { "r3k3/1K6/8/8/8/8/8/8 w q - 0 1", 2, 49 }, - { "r3k3/1K6/8/8/8/8/8/8 w q - 0 1", 3, 243 }, - { "r3k3/1K6/8/8/8/8/8/8 w q - 0 1", 4, 3991 }, - { "r3k3/1K6/8/8/8/8/8/8 w q - 0 1", 5, 20780 }, - { "r3k3/1K6/8/8/8/8/8/8 w q - 0 1", 6, 367724 }, - { "r3k2r/8/8/8/8/8/8/R3K2R w KQkq - 0 1", 1, 26 }, - { "r3k2r/8/8/8/8/8/8/R3K2R w KQkq - 0 1", 2, 568 }, - { "r3k2r/8/8/8/8/8/8/R3K2R w KQkq - 0 1", 3, 13744 }, - { "r3k2r/8/8/8/8/8/8/R3K2R w KQkq - 0 1", 4, 314346 }, - { "r3k2r/8/8/8/8/8/8/R3K2R w KQkq - 0 1", 5, 7594526 }, - { "r3k2r/8/8/8/8/8/8/R3K2R w KQkq - 0 1", 6, 179862938 }, - { "r3k2r/8/8/8/8/8/8/1R2K2R w Kkq - 0 1", 1, 25 }, - { "r3k2r/8/8/8/8/8/8/1R2K2R w Kkq - 0 1", 2, 567 }, - { "r3k2r/8/8/8/8/8/8/1R2K2R w Kkq - 0 1", 3, 14095 }, - { "r3k2r/8/8/8/8/8/8/1R2K2R w Kkq - 0 1", 4, 328965 }, - { "r3k2r/8/8/8/8/8/8/1R2K2R w Kkq - 0 1", 5, 8153719 }, - { "r3k2r/8/8/8/8/8/8/1R2K2R w Kkq - 0 1", 6, 195629489 }, - { "r3k2r/8/8/8/8/8/8/2R1K2R w Kkq - 0 1", 1, 25 }, - { "r3k2r/8/8/8/8/8/8/2R1K2R w Kkq - 0 1", 2, 548 }, - { "r3k2r/8/8/8/8/8/8/2R1K2R w Kkq - 0 1", 3, 13502 }, - { "r3k2r/8/8/8/8/8/8/2R1K2R w Kkq - 0 1", 4, 312835 }, - { "r3k2r/8/8/8/8/8/8/2R1K2R w Kkq - 0 1", 5, 7736373 }, - { "r3k2r/8/8/8/8/8/8/2R1K2R w Kkq - 0 1", 6, 184411439 }, - { "r3k2r/8/8/8/8/8/8/R3K1R1 w Qkq - 0 1", 1, 25 }, - { "r3k2r/8/8/8/8/8/8/R3K1R1 w Qkq - 0 1", 2, 547 }, - { "r3k2r/8/8/8/8/8/8/R3K1R1 w Qkq - 0 1", 3, 13579 }, - { "r3k2r/8/8/8/8/8/8/R3K1R1 w Qkq - 0 1", 4, 316214 }, - { "r3k2r/8/8/8/8/8/8/R3K1R1 w Qkq - 0 1", 5, 7878456 }, - { "r3k2r/8/8/8/8/8/8/R3K1R1 w Qkq - 0 1", 6, 189224276 }, - { "1r2k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 1, 26 }, - { "1r2k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 2, 583 }, - { "1r2k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 3, 14252 }, - { "1r2k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 4, 334705 }, - { "1r2k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 5, 8198901 }, - { "1r2k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 6, 198328929 }, - { "2r1k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 1, 25 }, - { "2r1k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 2, 560 }, - { "2r1k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 3, 13592 }, - { "2r1k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 4, 317324 }, - { "2r1k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 5, 7710115 }, - { "2r1k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 6, 185959088 }, - { "r3k1r1/8/8/8/8/8/8/R3K2R w KQq - 0 1", 1, 25 }, - { "r3k1r1/8/8/8/8/8/8/R3K2R w KQq - 0 1", 2, 560 }, - { "r3k1r1/8/8/8/8/8/8/R3K2R w KQq - 0 1", 3, 13607 }, - { "r3k1r1/8/8/8/8/8/8/R3K2R w KQq - 0 1", 4, 320792 }, - { "r3k1r1/8/8/8/8/8/8/R3K2R w KQq - 0 1", 5, 7848606 }, - { "r3k1r1/8/8/8/8/8/8/R3K2R w KQq - 0 1", 6, 190755813 }, - { "4k3/8/8/8/8/8/8/4K2R b K - 0 1", 1, 5 }, - { "4k3/8/8/8/8/8/8/4K2R b K - 0 1", 2, 75 }, - { "4k3/8/8/8/8/8/8/4K2R b K - 0 1", 3, 459 }, - { "4k3/8/8/8/8/8/8/4K2R b K - 0 1", 4, 8290 }, - { "4k3/8/8/8/8/8/8/4K2R b K - 0 1", 5, 47635 }, - { "4k3/8/8/8/8/8/8/4K2R b K - 0 1", 6, 899442 }, - { "4k3/8/8/8/8/8/8/R3K3 b Q - 0 1", 1, 5 }, - { "4k3/8/8/8/8/8/8/R3K3 b Q - 0 1", 2, 80 }, - { "4k3/8/8/8/8/8/8/R3K3 b Q - 0 1", 3, 493 }, - { "4k3/8/8/8/8/8/8/R3K3 b Q - 0 1", 4, 8897 }, - { "4k3/8/8/8/8/8/8/R3K3 b Q - 0 1", 5, 52710 }, - { "4k3/8/8/8/8/8/8/R3K3 b Q - 0 1", 6, 1001523 }, - { "4k2r/8/8/8/8/8/8/4K3 b k - 0 1", 1, 15 }, - { "4k2r/8/8/8/8/8/8/4K3 b k - 0 1", 2, 66 }, - { "4k2r/8/8/8/8/8/8/4K3 b k - 0 1", 3, 1197 }, - { "4k2r/8/8/8/8/8/8/4K3 b k - 0 1", 4, 7059 }, - { "4k2r/8/8/8/8/8/8/4K3 b k - 0 1", 5, 133987 }, - { "4k2r/8/8/8/8/8/8/4K3 b k - 0 1", 6, 764643 }, - { "r3k3/8/8/8/8/8/8/4K3 b q - 0 1", 1, 16 }, - { "r3k3/8/8/8/8/8/8/4K3 b q - 0 1", 2, 71 }, - { "r3k3/8/8/8/8/8/8/4K3 b q - 0 1", 3, 1287 }, - { "r3k3/8/8/8/8/8/8/4K3 b q - 0 1", 4, 7626 }, - { "r3k3/8/8/8/8/8/8/4K3 b q - 0 1", 5, 145232 }, - { "r3k3/8/8/8/8/8/8/4K3 b q - 0 1", 6, 846648 }, - { "4k3/8/8/8/8/8/8/R3K2R b KQ - 0 1", 1, 5 }, - { "4k3/8/8/8/8/8/8/R3K2R b KQ - 0 1", 2, 130 }, - { "4k3/8/8/8/8/8/8/R3K2R b KQ - 0 1", 3, 782 }, - { "4k3/8/8/8/8/8/8/R3K2R b KQ - 0 1", 4, 22180 }, - { "4k3/8/8/8/8/8/8/R3K2R b KQ - 0 1", 5, 118882 }, - { "4k3/8/8/8/8/8/8/R3K2R b KQ - 0 1", 6, 3517770 }, - { "r3k2r/8/8/8/8/8/8/4K3 b kq - 0 1", 1, 26 }, - { "r3k2r/8/8/8/8/8/8/4K3 b kq - 0 1", 2, 112 }, - { "r3k2r/8/8/8/8/8/8/4K3 b kq - 0 1", 3, 3189 }, - { "r3k2r/8/8/8/8/8/8/4K3 b kq - 0 1", 4, 17945 }, - { "r3k2r/8/8/8/8/8/8/4K3 b kq - 0 1", 5, 532933 }, - { "r3k2r/8/8/8/8/8/8/4K3 b kq - 0 1", 6, 2788982 }, - { "8/8/8/8/8/8/6k1/4K2R b K - 0 1", 1, 3 }, - { "8/8/8/8/8/8/6k1/4K2R b K - 0 1", 2, 32 }, - { "8/8/8/8/8/8/6k1/4K2R b K - 0 1", 3, 134 }, - { "8/8/8/8/8/8/6k1/4K2R b K - 0 1", 4, 2073 }, - { "8/8/8/8/8/8/6k1/4K2R b K - 0 1", 5, 10485 }, - { "8/8/8/8/8/8/6k1/4K2R b K - 0 1", 6, 179869 }, - { "8/8/8/8/8/8/1k6/R3K3 b Q - 0 1", 1, 4 }, - { "8/8/8/8/8/8/1k6/R3K3 b Q - 0 1", 2, 49 }, - { "8/8/8/8/8/8/1k6/R3K3 b Q - 0 1", 3, 243 }, - { "8/8/8/8/8/8/1k6/R3K3 b Q - 0 1", 4, 3991 }, - { "8/8/8/8/8/8/1k6/R3K3 b Q - 0 1", 5, 20780 }, - { "8/8/8/8/8/8/1k6/R3K3 b Q - 0 1", 6, 367724 }, - { "4k2r/6K1/8/8/8/8/8/8 b k - 0 1", 1, 12 }, - { "4k2r/6K1/8/8/8/8/8/8 b k - 0 1", 2, 38 }, - { "4k2r/6K1/8/8/8/8/8/8 b k - 0 1", 3, 564 }, - { "4k2r/6K1/8/8/8/8/8/8 b k - 0 1", 4, 2219 }, - { "4k2r/6K1/8/8/8/8/8/8 b k - 0 1", 5, 37735 }, - { "4k2r/6K1/8/8/8/8/8/8 b k - 0 1", 6, 185867 }, - { "r3k3/1K6/8/8/8/8/8/8 b q - 0 1", 1, 15 }, - { "r3k3/1K6/8/8/8/8/8/8 b q - 0 1", 2, 65 }, - { "r3k3/1K6/8/8/8/8/8/8 b q - 0 1", 3, 1018 }, - { "r3k3/1K6/8/8/8/8/8/8 b q - 0 1", 4, 4573 }, - { "r3k3/1K6/8/8/8/8/8/8 b q - 0 1", 5, 80619 }, - { "r3k3/1K6/8/8/8/8/8/8 b q - 0 1", 6, 413018 }, - { "r3k2r/8/8/8/8/8/8/R3K2R b KQkq - 0 1", 1, 26 }, - { "r3k2r/8/8/8/8/8/8/R3K2R b KQkq - 0 1", 2, 568 }, - { "r3k2r/8/8/8/8/8/8/R3K2R b KQkq - 0 1", 3, 13744 }, - { "r3k2r/8/8/8/8/8/8/R3K2R b KQkq - 0 1", 4, 314346 }, - { "r3k2r/8/8/8/8/8/8/R3K2R b KQkq - 0 1", 5, 7594526 }, - { "r3k2r/8/8/8/8/8/8/R3K2R b KQkq - 0 1", 6, 179862938 }, - { "r3k2r/8/8/8/8/8/8/1R2K2R b Kkq - 0 1", 1, 26 }, - { "r3k2r/8/8/8/8/8/8/1R2K2R b Kkq - 0 1", 2, 583 }, - { "r3k2r/8/8/8/8/8/8/1R2K2R b Kkq - 0 1", 3, 14252 }, - { "r3k2r/8/8/8/8/8/8/1R2K2R b Kkq - 0 1", 4, 334705 }, - { "r3k2r/8/8/8/8/8/8/1R2K2R b Kkq - 0 1", 5, 8198901 }, - { "r3k2r/8/8/8/8/8/8/1R2K2R b Kkq - 0 1", 6, 198328929 }, - { "r3k2r/8/8/8/8/8/8/2R1K2R b Kkq - 0 1", 1, 25 }, - { "r3k2r/8/8/8/8/8/8/2R1K2R b Kkq - 0 1", 2, 560 }, - { "r3k2r/8/8/8/8/8/8/2R1K2R b Kkq - 0 1", 3, 13592 }, - { "r3k2r/8/8/8/8/8/8/2R1K2R b Kkq - 0 1", 4, 317324 }, - { "r3k2r/8/8/8/8/8/8/2R1K2R b Kkq - 0 1", 5, 7710115 }, - { "r3k2r/8/8/8/8/8/8/2R1K2R b Kkq - 0 1", 6, 185959088 }, - { "r3k2r/8/8/8/8/8/8/R3K1R1 b Qkq - 0 1", 1, 25 }, - { "r3k2r/8/8/8/8/8/8/R3K1R1 b Qkq - 0 1", 2, 560 }, - { "r3k2r/8/8/8/8/8/8/R3K1R1 b Qkq - 0 1", 3, 13607 }, - { "r3k2r/8/8/8/8/8/8/R3K1R1 b Qkq - 0 1", 4, 320792 }, - { "r3k2r/8/8/8/8/8/8/R3K1R1 b Qkq - 0 1", 5, 7848606 }, - { "r3k2r/8/8/8/8/8/8/R3K1R1 b Qkq - 0 1", 6, 190755813 }, - { "1r2k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 1, 25 }, - { "1r2k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 2, 567 }, - { "1r2k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 3, 14095 }, - { "1r2k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 4, 328965 }, - { "1r2k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 5, 8153719 }, - { "1r2k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 6, 195629489 }, - { "2r1k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 1, 25 }, - { "2r1k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 2, 548 }, - { "2r1k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 3, 13502 }, - { "2r1k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 4, 312835 }, - { "2r1k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 5, 7736373 }, - { "2r1k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 6, 184411439 }, - { "r3k1r1/8/8/8/8/8/8/R3K2R b KQq - 0 1", 1, 25 }, - { "r3k1r1/8/8/8/8/8/8/R3K2R b KQq - 0 1", 2, 547 }, - { "r3k1r1/8/8/8/8/8/8/R3K2R b KQq - 0 1", 3, 13579 }, - { "r3k1r1/8/8/8/8/8/8/R3K2R b KQq - 0 1", 4, 316214 }, - { "r3k1r1/8/8/8/8/8/8/R3K2R b KQq - 0 1", 5, 7878456 }, - { "r3k1r1/8/8/8/8/8/8/R3K2R b KQq - 0 1", 6, 189224276 }, - { "8/1n4N1/2k5/8/8/5K2/1N4n1/8 w - - 0 1", 1, 14 }, - { "8/1n4N1/2k5/8/8/5K2/1N4n1/8 w - - 0 1", 2, 195 }, - { "8/1n4N1/2k5/8/8/5K2/1N4n1/8 w - - 0 1", 3, 2760 }, - { "8/1n4N1/2k5/8/8/5K2/1N4n1/8 w - - 0 1", 4, 38675 }, - { "8/1n4N1/2k5/8/8/5K2/1N4n1/8 w - - 0 1", 5, 570726 }, - { "8/1n4N1/2k5/8/8/5K2/1N4n1/8 w - - 0 1", 6, 8107539 }, - { "8/1k6/8/5N2/8/4n3/8/2K5 w - - 0 1", 1, 11 }, - { "8/1k6/8/5N2/8/4n3/8/2K5 w - - 0 1", 2, 156 }, - { "8/1k6/8/5N2/8/4n3/8/2K5 w - - 0 1", 3, 1636 }, - { "8/1k6/8/5N2/8/4n3/8/2K5 w - - 0 1", 4, 20534 }, - { "8/1k6/8/5N2/8/4n3/8/2K5 w - - 0 1", 5, 223507 }, - { "8/1k6/8/5N2/8/4n3/8/2K5 w - - 0 1", 6, 2594412 }, - { "8/8/4k3/3Nn3/3nN3/4K3/8/8 w - - 0 1", 1, 19 }, - { "8/8/4k3/3Nn3/3nN3/4K3/8/8 w - - 0 1", 2, 289 }, - { "8/8/4k3/3Nn3/3nN3/4K3/8/8 w - - 0 1", 3, 4442 }, - { "8/8/4k3/3Nn3/3nN3/4K3/8/8 w - - 0 1", 4, 73584 }, - { "8/8/4k3/3Nn3/3nN3/4K3/8/8 w - - 0 1", 5, 1198299 }, - { "8/8/4k3/3Nn3/3nN3/4K3/8/8 w - - 0 1", 6, 19870403 }, - { "K7/8/2n5/1n6/8/8/8/k6N w - - 0 1", 1, 3 }, - { "K7/8/2n5/1n6/8/8/8/k6N w - - 0 1", 2, 51 }, - { "K7/8/2n5/1n6/8/8/8/k6N w - - 0 1", 3, 345 }, - { "K7/8/2n5/1n6/8/8/8/k6N w - - 0 1", 4, 5301 }, - { "K7/8/2n5/1n6/8/8/8/k6N w - - 0 1", 5, 38348 }, - { "K7/8/2n5/1n6/8/8/8/k6N w - - 0 1", 6, 588695 }, - { "k7/8/2N5/1N6/8/8/8/K6n w - - 0 1", 1, 17 }, - { "k7/8/2N5/1N6/8/8/8/K6n w - - 0 1", 2, 54 }, - { "k7/8/2N5/1N6/8/8/8/K6n w - - 0 1", 3, 835 }, - { "k7/8/2N5/1N6/8/8/8/K6n w - - 0 1", 4, 5910 }, - { "k7/8/2N5/1N6/8/8/8/K6n w - - 0 1", 5, 92250 }, - { "k7/8/2N5/1N6/8/8/8/K6n w - - 0 1", 6, 688780 }, - { "8/1n4N1/2k5/8/8/5K2/1N4n1/8 b - - 0 1", 1, 15 }, - { "8/1n4N1/2k5/8/8/5K2/1N4n1/8 b - - 0 1", 2, 193 }, - { "8/1n4N1/2k5/8/8/5K2/1N4n1/8 b - - 0 1", 3, 2816 }, - { "8/1n4N1/2k5/8/8/5K2/1N4n1/8 b - - 0 1", 4, 40039 }, - { "8/1n4N1/2k5/8/8/5K2/1N4n1/8 b - - 0 1", 5, 582642 }, - { "8/1n4N1/2k5/8/8/5K2/1N4n1/8 b - - 0 1", 6, 8503277 }, - { "8/1k6/8/5N2/8/4n3/8/2K5 b - - 0 1", 1, 16 }, - { "8/1k6/8/5N2/8/4n3/8/2K5 b - - 0 1", 2, 180 }, - { "8/1k6/8/5N2/8/4n3/8/2K5 b - - 0 1", 3, 2290 }, - { "8/1k6/8/5N2/8/4n3/8/2K5 b - - 0 1", 4, 24640 }, - { "8/1k6/8/5N2/8/4n3/8/2K5 b - - 0 1", 5, 288141 }, - { "8/1k6/8/5N2/8/4n3/8/2K5 b - - 0 1", 6, 3147566 }, - { "8/8/3K4/3Nn3/3nN3/4k3/8/8 b - - 0 1", 1, 4 }, - { "8/8/3K4/3Nn3/3nN3/4k3/8/8 b - - 0 1", 2, 68 }, - { "8/8/3K4/3Nn3/3nN3/4k3/8/8 b - - 0 1", 3, 1118 }, - { "8/8/3K4/3Nn3/3nN3/4k3/8/8 b - - 0 1", 4, 16199 }, - { "8/8/3K4/3Nn3/3nN3/4k3/8/8 b - - 0 1", 5, 281190 }, - { "8/8/3K4/3Nn3/3nN3/4k3/8/8 b - - 0 1", 6, 4405103 }, - { "K7/8/2n5/1n6/8/8/8/k6N b - - 0 1", 1, 17 }, - { "K7/8/2n5/1n6/8/8/8/k6N b - - 0 1", 2, 54 }, - { "K7/8/2n5/1n6/8/8/8/k6N b - - 0 1", 3, 835 }, - { "K7/8/2n5/1n6/8/8/8/k6N b - - 0 1", 4, 5910 }, - { "K7/8/2n5/1n6/8/8/8/k6N b - - 0 1", 5, 92250 }, - { "K7/8/2n5/1n6/8/8/8/k6N b - - 0 1", 6, 688780 }, - { "k7/8/2N5/1N6/8/8/8/K6n b - - 0 1", 1, 3 }, - { "k7/8/2N5/1N6/8/8/8/K6n b - - 0 1", 2, 51 }, - { "k7/8/2N5/1N6/8/8/8/K6n b - - 0 1", 3, 345 }, - { "k7/8/2N5/1N6/8/8/8/K6n b - - 0 1", 4, 5301 }, - { "k7/8/2N5/1N6/8/8/8/K6n b - - 0 1", 5, 38348 }, - { "k7/8/2N5/1N6/8/8/8/K6n b - - 0 1", 6, 588695 }, - { "B6b/8/8/8/2K5/4k3/8/b6B w - - 0 1", 1, 17 }, - { "B6b/8/8/8/2K5/4k3/8/b6B w - - 0 1", 2, 278 }, - { "B6b/8/8/8/2K5/4k3/8/b6B w - - 0 1", 3, 4607 }, - { "B6b/8/8/8/2K5/4k3/8/b6B w - - 0 1", 4, 76778 }, - { "B6b/8/8/8/2K5/4k3/8/b6B w - - 0 1", 5, 1320507 }, - { "B6b/8/8/8/2K5/4k3/8/b6B w - - 0 1", 6, 22823890 }, - { "8/8/1B6/7b/7k/8/2B1b3/7K w - - 0 1", 1, 21 }, - { "8/8/1B6/7b/7k/8/2B1b3/7K w - - 0 1", 2, 316 }, - { "8/8/1B6/7b/7k/8/2B1b3/7K w - - 0 1", 3, 5744 }, - { "8/8/1B6/7b/7k/8/2B1b3/7K w - - 0 1", 4, 93338 }, - { "8/8/1B6/7b/7k/8/2B1b3/7K w - - 0 1", 5, 1713368 }, - { "8/8/1B6/7b/7k/8/2B1b3/7K w - - 0 1", 6, 28861171 }, - { "k7/B7/1B6/1B6/8/8/8/K6b w - - 0 1", 1, 21 }, - { "k7/B7/1B6/1B6/8/8/8/K6b w - - 0 1", 2, 144 }, - { "k7/B7/1B6/1B6/8/8/8/K6b w - - 0 1", 3, 3242 }, - { "k7/B7/1B6/1B6/8/8/8/K6b w - - 0 1", 4, 32955 }, - { "k7/B7/1B6/1B6/8/8/8/K6b w - - 0 1", 5, 787524 }, - { "k7/B7/1B6/1B6/8/8/8/K6b w - - 0 1", 6, 7881673 }, - { "K7/b7/1b6/1b6/8/8/8/k6B w - - 0 1", 1, 7 }, - { "K7/b7/1b6/1b6/8/8/8/k6B w - - 0 1", 2, 143 }, - { "K7/b7/1b6/1b6/8/8/8/k6B w - - 0 1", 3, 1416 }, - { "K7/b7/1b6/1b6/8/8/8/k6B w - - 0 1", 4, 31787 }, - { "K7/b7/1b6/1b6/8/8/8/k6B w - - 0 1", 5, 310862 }, - { "K7/b7/1b6/1b6/8/8/8/k6B w - - 0 1", 6, 7382896 }, - { "B6b/8/8/8/2K5/5k2/8/b6B b - - 0 1", 1, 6 }, - { "B6b/8/8/8/2K5/5k2/8/b6B b - - 0 1", 2, 106 }, - { "B6b/8/8/8/2K5/5k2/8/b6B b - - 0 1", 3, 1829 }, - { "B6b/8/8/8/2K5/5k2/8/b6B b - - 0 1", 4, 31151 }, - { "B6b/8/8/8/2K5/5k2/8/b6B b - - 0 1", 5, 530585 }, - { "B6b/8/8/8/2K5/5k2/8/b6B b - - 0 1", 6, 9250746 }, - { "8/8/1B6/7b/7k/8/2B1b3/7K b - - 0 1", 1, 17 }, - { "8/8/1B6/7b/7k/8/2B1b3/7K b - - 0 1", 2, 309 }, - { "8/8/1B6/7b/7k/8/2B1b3/7K b - - 0 1", 3, 5133 }, - { "8/8/1B6/7b/7k/8/2B1b3/7K b - - 0 1", 4, 93603 }, - { "8/8/1B6/7b/7k/8/2B1b3/7K b - - 0 1", 5, 1591064 }, - { "8/8/1B6/7b/7k/8/2B1b3/7K b - - 0 1", 6, 29027891 }, - { "k7/B7/1B6/1B6/8/8/8/K6b b - - 0 1", 1, 7 }, - { "k7/B7/1B6/1B6/8/8/8/K6b b - - 0 1", 2, 143 }, - { "k7/B7/1B6/1B6/8/8/8/K6b b - - 0 1", 3, 1416 }, - { "k7/B7/1B6/1B6/8/8/8/K6b b - - 0 1", 4, 31787 }, - { "k7/B7/1B6/1B6/8/8/8/K6b b - - 0 1", 5, 310862 }, - { "k7/B7/1B6/1B6/8/8/8/K6b b - - 0 1", 6, 7382896 }, - { "K7/b7/1b6/1b6/8/8/8/k6B b - - 0 1", 1, 21 }, - { "K7/b7/1b6/1b6/8/8/8/k6B b - - 0 1", 2, 144 }, - { "K7/b7/1b6/1b6/8/8/8/k6B b - - 0 1", 3, 3242 }, - { "K7/b7/1b6/1b6/8/8/8/k6B b - - 0 1", 4, 32955 }, - { "K7/b7/1b6/1b6/8/8/8/k6B b - - 0 1", 5, 787524 }, - { "K7/b7/1b6/1b6/8/8/8/k6B b - - 0 1", 6, 7881673 }, - { "7k/RR6/8/8/8/8/rr6/7K w - - 0 1", 1, 19 }, - { "7k/RR6/8/8/8/8/rr6/7K w - - 0 1", 2, 275 }, - { "7k/RR6/8/8/8/8/rr6/7K w - - 0 1", 3, 5300 }, - { "7k/RR6/8/8/8/8/rr6/7K w - - 0 1", 4, 104342 }, - { "7k/RR6/8/8/8/8/rr6/7K w - - 0 1", 5, 2161211 }, - { "7k/RR6/8/8/8/8/rr6/7K w - - 0 1", 6, 44956585 }, - { "R6r/8/8/2K5/5k2/8/8/r6R w - - 0 1", 1, 36 }, - { "R6r/8/8/2K5/5k2/8/8/r6R w - - 0 1", 2, 1027 }, - { "R6r/8/8/2K5/5k2/8/8/r6R w - - 0 1", 3, 29215 }, - { "R6r/8/8/2K5/5k2/8/8/r6R w - - 0 1", 4, 771461 }, - { "R6r/8/8/2K5/5k2/8/8/r6R w - - 0 1", 5, 20506480 }, - { "R6r/8/8/2K5/5k2/8/8/r6R w - - 0 1", 6, 525169084 }, - { "7k/RR6/8/8/8/8/rr6/7K b - - 0 1", 1, 19 }, - { "7k/RR6/8/8/8/8/rr6/7K b - - 0 1", 2, 275 }, - { "7k/RR6/8/8/8/8/rr6/7K b - - 0 1", 3, 5300 }, - { "7k/RR6/8/8/8/8/rr6/7K b - - 0 1", 4, 104342 }, - { "7k/RR6/8/8/8/8/rr6/7K b - - 0 1", 5, 2161211 }, - { "7k/RR6/8/8/8/8/rr6/7K b - - 0 1", 6, 44956585 }, - { "R6r/8/8/2K5/5k2/8/8/r6R b - - 0 1", 1, 36 }, - { "R6r/8/8/2K5/5k2/8/8/r6R b - - 0 1", 2, 1027 }, - { "R6r/8/8/2K5/5k2/8/8/r6R b - - 0 1", 3, 29227 }, - { "R6r/8/8/2K5/5k2/8/8/r6R b - - 0 1", 4, 771368 }, - { "R6r/8/8/2K5/5k2/8/8/r6R b - - 0 1", 5, 20521342 }, - { "R6r/8/8/2K5/5k2/8/8/r6R b - - 0 1", 6, 524966748 }, - { "6kq/8/8/8/8/8/8/7K w - - 0 1", 1, 2 }, - { "6kq/8/8/8/8/8/8/7K w - - 0 1", 2, 36 }, - { "6kq/8/8/8/8/8/8/7K w - - 0 1", 3, 143 }, - { "6kq/8/8/8/8/8/8/7K w - - 0 1", 4, 3637 }, - { "6kq/8/8/8/8/8/8/7K w - - 0 1", 5, 14893 }, - { "6kq/8/8/8/8/8/8/7K w - - 0 1", 6, 391507 }, - { "6KQ/8/8/8/8/8/8/7k b - - 0 1", 1, 2 }, - { "6KQ/8/8/8/8/8/8/7k b - - 0 1", 2, 36 }, - { "6KQ/8/8/8/8/8/8/7k b - - 0 1", 3, 143 }, - { "6KQ/8/8/8/8/8/8/7k b - - 0 1", 4, 3637 }, - { "6KQ/8/8/8/8/8/8/7k b - - 0 1", 5, 14893 }, - { "6KQ/8/8/8/8/8/8/7k b - - 0 1", 6, 391507 }, - { "K7/8/8/3Q4/4q3/8/8/7k w - - 0 1", 1, 6 }, - { "K7/8/8/3Q4/4q3/8/8/7k w - - 0 1", 2, 35 }, - { "K7/8/8/3Q4/4q3/8/8/7k w - - 0 1", 3, 495 }, - { "K7/8/8/3Q4/4q3/8/8/7k w - - 0 1", 4, 8349 }, - { "K7/8/8/3Q4/4q3/8/8/7k w - - 0 1", 5, 166741 }, - { "K7/8/8/3Q4/4q3/8/8/7k w - - 0 1", 6, 3370175 }, - { "6qk/8/8/8/8/8/8/7K b - - 0 1", 1, 22 }, - { "6qk/8/8/8/8/8/8/7K b - - 0 1", 2, 43 }, - { "6qk/8/8/8/8/8/8/7K b - - 0 1", 3, 1015 }, - { "6qk/8/8/8/8/8/8/7K b - - 0 1", 4, 4167 }, - { "6qk/8/8/8/8/8/8/7K b - - 0 1", 5, 105749 }, - { "6qk/8/8/8/8/8/8/7K b - - 0 1", 6, 419369 }, - { "6KQ/8/8/8/8/8/8/7k b - - 0 1", 1, 2 }, - { "6KQ/8/8/8/8/8/8/7k b - - 0 1", 2, 36 }, - { "6KQ/8/8/8/8/8/8/7k b - - 0 1", 3, 143 }, - { "6KQ/8/8/8/8/8/8/7k b - - 0 1", 4, 3637 }, - { "6KQ/8/8/8/8/8/8/7k b - - 0 1", 5, 14893 }, - { "6KQ/8/8/8/8/8/8/7k b - - 0 1", 6, 391507 }, - { "K7/8/8/3Q4/4q3/8/8/7k b - - 0 1", 1, 6 }, - { "K7/8/8/3Q4/4q3/8/8/7k b - - 0 1", 2, 35 }, - { "K7/8/8/3Q4/4q3/8/8/7k b - - 0 1", 3, 495 }, - { "K7/8/8/3Q4/4q3/8/8/7k b - - 0 1", 4, 8349 }, - { "K7/8/8/3Q4/4q3/8/8/7k b - - 0 1", 5, 166741 }, - { "K7/8/8/3Q4/4q3/8/8/7k b - - 0 1", 6, 3370175 }, - { "8/8/8/8/8/K7/P7/k7 w - - 0 1", 1, 3 }, - { "8/8/8/8/8/K7/P7/k7 w - - 0 1", 2, 7 }, - { "8/8/8/8/8/K7/P7/k7 w - - 0 1", 3, 43 }, - { "8/8/8/8/8/K7/P7/k7 w - - 0 1", 4, 199 }, - { "8/8/8/8/8/K7/P7/k7 w - - 0 1", 5, 1347 }, - { "8/8/8/8/8/K7/P7/k7 w - - 0 1", 6, 6249 }, - { "8/8/8/8/8/7K/7P/7k w - - 0 1", 1, 3 }, - { "8/8/8/8/8/7K/7P/7k w - - 0 1", 2, 7 }, - { "8/8/8/8/8/7K/7P/7k w - - 0 1", 3, 43 }, - { "8/8/8/8/8/7K/7P/7k w - - 0 1", 4, 199 }, - { "8/8/8/8/8/7K/7P/7k w - - 0 1", 5, 1347 }, - { "8/8/8/8/8/7K/7P/7k w - - 0 1", 6, 6249 }, - { "K7/p7/k7/8/8/8/8/8 w - - 0 1", 1, 1 }, - { "K7/p7/k7/8/8/8/8/8 w - - 0 1", 2, 3 }, - { "K7/p7/k7/8/8/8/8/8 w - - 0 1", 3, 12 }, - { "K7/p7/k7/8/8/8/8/8 w - - 0 1", 4, 80 }, - { "K7/p7/k7/8/8/8/8/8 w - - 0 1", 5, 342 }, - { "K7/p7/k7/8/8/8/8/8 w - - 0 1", 6, 2343 }, - { "7K/7p/7k/8/8/8/8/8 w - - 0 1", 1, 1 }, - { "7K/7p/7k/8/8/8/8/8 w - - 0 1", 2, 3 }, - { "7K/7p/7k/8/8/8/8/8 w - - 0 1", 3, 12 }, - { "7K/7p/7k/8/8/8/8/8 w - - 0 1", 4, 80 }, - { "7K/7p/7k/8/8/8/8/8 w - - 0 1", 5, 342 }, - { "7K/7p/7k/8/8/8/8/8 w - - 0 1", 6, 2343 }, - { "8/2k1p3/3pP3/3P2K1/8/8/8/8 w - - 0 1", 1, 7 }, - { "8/2k1p3/3pP3/3P2K1/8/8/8/8 w - - 0 1", 2, 35 }, - { "8/2k1p3/3pP3/3P2K1/8/8/8/8 w - - 0 1", 3, 210 }, - { "8/2k1p3/3pP3/3P2K1/8/8/8/8 w - - 0 1", 4, 1091 }, - { "8/2k1p3/3pP3/3P2K1/8/8/8/8 w - - 0 1", 5, 7028 }, - { "8/2k1p3/3pP3/3P2K1/8/8/8/8 w - - 0 1", 6, 34834 }, - { "8/8/8/8/8/K7/P7/k7 b - - 0 1", 1, 1 }, - { "8/8/8/8/8/K7/P7/k7 b - - 0 1", 2, 3 }, - { "8/8/8/8/8/K7/P7/k7 b - - 0 1", 3, 12 }, - { "8/8/8/8/8/K7/P7/k7 b - - 0 1", 4, 80 }, - { "8/8/8/8/8/K7/P7/k7 b - - 0 1", 5, 342 }, - { "8/8/8/8/8/K7/P7/k7 b - - 0 1", 6, 2343 }, - { "8/8/8/8/8/7K/7P/7k b - - 0 1", 1, 1 }, - { "8/8/8/8/8/7K/7P/7k b - - 0 1", 2, 3 }, - { "8/8/8/8/8/7K/7P/7k b - - 0 1", 3, 12 }, - { "8/8/8/8/8/7K/7P/7k b - - 0 1", 4, 80 }, - { "8/8/8/8/8/7K/7P/7k b - - 0 1", 5, 342 }, - { "8/8/8/8/8/7K/7P/7k b - - 0 1", 6, 2343 }, - { "K7/p7/k7/8/8/8/8/8 b - - 0 1", 1, 3 }, - { "K7/p7/k7/8/8/8/8/8 b - - 0 1", 2, 7 }, - { "K7/p7/k7/8/8/8/8/8 b - - 0 1", 3, 43 }, - { "K7/p7/k7/8/8/8/8/8 b - - 0 1", 4, 199 }, - { "K7/p7/k7/8/8/8/8/8 b - - 0 1", 5, 1347 }, - { "K7/p7/k7/8/8/8/8/8 b - - 0 1", 6, 6249 }, - { "7K/7p/7k/8/8/8/8/8 b - - 0 1", 1, 3 }, - { "7K/7p/7k/8/8/8/8/8 b - - 0 1", 2, 7 }, - { "7K/7p/7k/8/8/8/8/8 b - - 0 1", 3, 43 }, - { "7K/7p/7k/8/8/8/8/8 b - - 0 1", 4, 199 }, - { "7K/7p/7k/8/8/8/8/8 b - - 0 1", 5, 1347 }, - { "7K/7p/7k/8/8/8/8/8 b - - 0 1", 6, 6249 }, - { "8/2k1p3/3pP3/3P2K1/8/8/8/8 b - - 0 1", 1, 5 }, - { "8/2k1p3/3pP3/3P2K1/8/8/8/8 b - - 0 1", 2, 35 }, - { "8/2k1p3/3pP3/3P2K1/8/8/8/8 b - - 0 1", 3, 182 }, - { "8/2k1p3/3pP3/3P2K1/8/8/8/8 b - - 0 1", 4, 1091 }, - { "8/2k1p3/3pP3/3P2K1/8/8/8/8 b - - 0 1", 5, 5408 }, - { "8/2k1p3/3pP3/3P2K1/8/8/8/8 b - - 0 1", 6, 34822 }, - { "8/8/8/8/8/4k3/4P3/4K3 w - - 0 1", 1, 2 }, - { "8/8/8/8/8/4k3/4P3/4K3 w - - 0 1", 2, 8 }, - { "8/8/8/8/8/4k3/4P3/4K3 w - - 0 1", 3, 44 }, - { "8/8/8/8/8/4k3/4P3/4K3 w - - 0 1", 4, 282 }, - { "8/8/8/8/8/4k3/4P3/4K3 w - - 0 1", 5, 1814 }, - { "8/8/8/8/8/4k3/4P3/4K3 w - - 0 1", 6, 11848 }, - { "4k3/4p3/4K3/8/8/8/8/8 b - - 0 1", 1, 2 }, - { "4k3/4p3/4K3/8/8/8/8/8 b - - 0 1", 2, 8 }, - { "4k3/4p3/4K3/8/8/8/8/8 b - - 0 1", 3, 44 }, - { "4k3/4p3/4K3/8/8/8/8/8 b - - 0 1", 4, 282 }, - { "4k3/4p3/4K3/8/8/8/8/8 b - - 0 1", 5, 1814 }, - { "4k3/4p3/4K3/8/8/8/8/8 b - - 0 1", 6, 11848 }, - { "8/8/7k/7p/7P/7K/8/8 w - - 0 1", 1, 3 }, - { "8/8/7k/7p/7P/7K/8/8 w - - 0 1", 2, 9 }, - { "8/8/7k/7p/7P/7K/8/8 w - - 0 1", 3, 57 }, - { "8/8/7k/7p/7P/7K/8/8 w - - 0 1", 4, 360 }, - { "8/8/7k/7p/7P/7K/8/8 w - - 0 1", 5, 1969 }, - { "8/8/7k/7p/7P/7K/8/8 w - - 0 1", 6, 10724 }, - { "8/8/k7/p7/P7/K7/8/8 w - - 0 1", 1, 3 }, - { "8/8/k7/p7/P7/K7/8/8 w - - 0 1", 2, 9 }, - { "8/8/k7/p7/P7/K7/8/8 w - - 0 1", 3, 57 }, - { "8/8/k7/p7/P7/K7/8/8 w - - 0 1", 4, 360 }, - { "8/8/k7/p7/P7/K7/8/8 w - - 0 1", 5, 1969 }, - { "8/8/k7/p7/P7/K7/8/8 w - - 0 1", 6, 10724 }, - { "8/8/3k4/3p4/3P4/3K4/8/8 w - - 0 1", 1, 5 }, - { "8/8/3k4/3p4/3P4/3K4/8/8 w - - 0 1", 2, 25 }, - { "8/8/3k4/3p4/3P4/3K4/8/8 w - - 0 1", 3, 180 }, - { "8/8/3k4/3p4/3P4/3K4/8/8 w - - 0 1", 4, 1294 }, - { "8/8/3k4/3p4/3P4/3K4/8/8 w - - 0 1", 5, 8296 }, - { "8/8/3k4/3p4/3P4/3K4/8/8 w - - 0 1", 6, 53138 }, - { "8/3k4/3p4/8/3P4/3K4/8/8 w - - 0 1", 1, 8 }, - { "8/3k4/3p4/8/3P4/3K4/8/8 w - - 0 1", 2, 61 }, - { "8/3k4/3p4/8/3P4/3K4/8/8 w - - 0 1", 3, 483 }, - { "8/3k4/3p4/8/3P4/3K4/8/8 w - - 0 1", 4, 3213 }, - { "8/3k4/3p4/8/3P4/3K4/8/8 w - - 0 1", 5, 23599 }, - { "8/3k4/3p4/8/3P4/3K4/8/8 w - - 0 1", 6, 157093 }, - { "8/8/3k4/3p4/8/3P4/3K4/8 w - - 0 1", 1, 8 }, - { "8/8/3k4/3p4/8/3P4/3K4/8 w - - 0 1", 2, 61 }, - { "8/8/3k4/3p4/8/3P4/3K4/8 w - - 0 1", 3, 411 }, - { "8/8/3k4/3p4/8/3P4/3K4/8 w - - 0 1", 4, 3213 }, - { "8/8/3k4/3p4/8/3P4/3K4/8 w - - 0 1", 5, 21637 }, - { "8/8/3k4/3p4/8/3P4/3K4/8 w - - 0 1", 6, 158065 }, - { "k7/8/3p4/8/3P4/8/8/7K w - - 0 1", 1, 4 }, - { "k7/8/3p4/8/3P4/8/8/7K w - - 0 1", 2, 15 }, - { "k7/8/3p4/8/3P4/8/8/7K w - - 0 1", 3, 90 }, - { "k7/8/3p4/8/3P4/8/8/7K w - - 0 1", 4, 534 }, - { "k7/8/3p4/8/3P4/8/8/7K w - - 0 1", 5, 3450 }, - { "k7/8/3p4/8/3P4/8/8/7K w - - 0 1", 6, 20960 }, - { "8/8/7k/7p/7P/7K/8/8 b - - 0 1", 1, 3 }, - { "8/8/7k/7p/7P/7K/8/8 b - - 0 1", 2, 9 }, - { "8/8/7k/7p/7P/7K/8/8 b - - 0 1", 3, 57 }, - { "8/8/7k/7p/7P/7K/8/8 b - - 0 1", 4, 360 }, - { "8/8/7k/7p/7P/7K/8/8 b - - 0 1", 5, 1969 }, - { "8/8/7k/7p/7P/7K/8/8 b - - 0 1", 6, 10724 }, - { "8/8/k7/p7/P7/K7/8/8 b - - 0 1", 1, 3 }, - { "8/8/k7/p7/P7/K7/8/8 b - - 0 1", 2, 9 }, - { "8/8/k7/p7/P7/K7/8/8 b - - 0 1", 3, 57 }, - { "8/8/k7/p7/P7/K7/8/8 b - - 0 1", 4, 360 }, - { "8/8/k7/p7/P7/K7/8/8 b - - 0 1", 5, 1969 }, - { "8/8/k7/p7/P7/K7/8/8 b - - 0 1", 6, 10724 }, - { "8/8/3k4/3p4/3P4/3K4/8/8 b - - 0 1", 1, 5 }, - { "8/8/3k4/3p4/3P4/3K4/8/8 b - - 0 1", 2, 25 }, - { "8/8/3k4/3p4/3P4/3K4/8/8 b - - 0 1", 3, 180 }, - { "8/8/3k4/3p4/3P4/3K4/8/8 b - - 0 1", 4, 1294 }, - { "8/8/3k4/3p4/3P4/3K4/8/8 b - - 0 1", 5, 8296 }, - { "8/8/3k4/3p4/3P4/3K4/8/8 b - - 0 1", 6, 53138 }, - { "8/3k4/3p4/8/3P4/3K4/8/8 b - - 0 1", 1, 8 }, - { "8/3k4/3p4/8/3P4/3K4/8/8 b - - 0 1", 2, 61 }, - { "8/3k4/3p4/8/3P4/3K4/8/8 b - - 0 1", 3, 411 }, - { "8/3k4/3p4/8/3P4/3K4/8/8 b - - 0 1", 4, 3213 }, - { "8/3k4/3p4/8/3P4/3K4/8/8 b - - 0 1", 5, 21637 }, - { "8/3k4/3p4/8/3P4/3K4/8/8 b - - 0 1", 6, 158065 }, - { "8/8/3k4/3p4/8/3P4/3K4/8 b - - 0 1", 1, 8 }, - { "8/8/3k4/3p4/8/3P4/3K4/8 b - - 0 1", 2, 61 }, - { "8/8/3k4/3p4/8/3P4/3K4/8 b - - 0 1", 3, 483 }, - { "8/8/3k4/3p4/8/3P4/3K4/8 b - - 0 1", 4, 3213 }, - { "8/8/3k4/3p4/8/3P4/3K4/8 b - - 0 1", 5, 23599 }, - { "8/8/3k4/3p4/8/3P4/3K4/8 b - - 0 1", 6, 157093 }, - { "k7/8/3p4/8/3P4/8/8/7K b - - 0 1", 1, 4 }, - { "k7/8/3p4/8/3P4/8/8/7K b - - 0 1", 2, 15 }, - { "k7/8/3p4/8/3P4/8/8/7K b - - 0 1", 3, 89 }, - { "k7/8/3p4/8/3P4/8/8/7K b - - 0 1", 4, 537 }, - { "k7/8/3p4/8/3P4/8/8/7K b - - 0 1", 5, 3309 }, - { "k7/8/3p4/8/3P4/8/8/7K b - - 0 1", 6, 21104 }, - { "7k/3p4/8/8/3P4/8/8/K7 w - - 0 1", 1, 4 }, - { "7k/3p4/8/8/3P4/8/8/K7 w - - 0 1", 2, 19 }, - { "7k/3p4/8/8/3P4/8/8/K7 w - - 0 1", 3, 117 }, - { "7k/3p4/8/8/3P4/8/8/K7 w - - 0 1", 4, 720 }, - { "7k/3p4/8/8/3P4/8/8/K7 w - - 0 1", 5, 4661 }, - { "7k/3p4/8/8/3P4/8/8/K7 w - - 0 1", 6, 32191 }, - { "7k/8/8/3p4/8/8/3P4/K7 w - - 0 1", 1, 5 }, - { "7k/8/8/3p4/8/8/3P4/K7 w - - 0 1", 2, 19 }, - { "7k/8/8/3p4/8/8/3P4/K7 w - - 0 1", 3, 116 }, - { "7k/8/8/3p4/8/8/3P4/K7 w - - 0 1", 4, 716 }, - { "7k/8/8/3p4/8/8/3P4/K7 w - - 0 1", 5, 4786 }, - { "7k/8/8/3p4/8/8/3P4/K7 w - - 0 1", 6, 30980 }, - { "k7/8/8/7p/6P1/8/8/K7 w - - 0 1", 1, 5 }, - { "k7/8/8/7p/6P1/8/8/K7 w - - 0 1", 2, 22 }, - { "k7/8/8/7p/6P1/8/8/K7 w - - 0 1", 3, 139 }, - { "k7/8/8/7p/6P1/8/8/K7 w - - 0 1", 4, 877 }, - { "k7/8/8/7p/6P1/8/8/K7 w - - 0 1", 5, 6112 }, - { "k7/8/8/7p/6P1/8/8/K7 w - - 0 1", 6, 41874 }, - { "k7/8/7p/8/8/6P1/8/K7 w - - 0 1", 1, 4 }, - { "k7/8/7p/8/8/6P1/8/K7 w - - 0 1", 2, 16 }, - { "k7/8/7p/8/8/6P1/8/K7 w - - 0 1", 3, 101 }, - { "k7/8/7p/8/8/6P1/8/K7 w - - 0 1", 4, 637 }, - { "k7/8/7p/8/8/6P1/8/K7 w - - 0 1", 5, 4354 }, - { "k7/8/7p/8/8/6P1/8/K7 w - - 0 1", 6, 29679 }, - { "k7/8/8/6p1/7P/8/8/K7 w - - 0 1", 1, 5 }, - { "k7/8/8/6p1/7P/8/8/K7 w - - 0 1", 2, 22 }, - { "k7/8/8/6p1/7P/8/8/K7 w - - 0 1", 3, 139 }, - { "k7/8/8/6p1/7P/8/8/K7 w - - 0 1", 4, 877 }, - { "k7/8/8/6p1/7P/8/8/K7 w - - 0 1", 5, 6112 }, - { "k7/8/8/6p1/7P/8/8/K7 w - - 0 1", 6, 41874 }, - { "k7/8/6p1/8/8/7P/8/K7 w - - 0 1", 1, 4 }, - { "k7/8/6p1/8/8/7P/8/K7 w - - 0 1", 2, 16 }, - { "k7/8/6p1/8/8/7P/8/K7 w - - 0 1", 3, 101 }, - { "k7/8/6p1/8/8/7P/8/K7 w - - 0 1", 4, 637 }, - { "k7/8/6p1/8/8/7P/8/K7 w - - 0 1", 5, 4354 }, - { "k7/8/6p1/8/8/7P/8/K7 w - - 0 1", 6, 29679 }, - { "k7/8/8/3p4/4p3/8/8/7K w - - 0 1", 1, 3 }, - { "k7/8/8/3p4/4p3/8/8/7K w - - 0 1", 2, 15 }, - { "k7/8/8/3p4/4p3/8/8/7K w - - 0 1", 3, 84 }, - { "k7/8/8/3p4/4p3/8/8/7K w - - 0 1", 4, 573 }, - { "k7/8/8/3p4/4p3/8/8/7K w - - 0 1", 5, 3013 }, - { "k7/8/8/3p4/4p3/8/8/7K w - - 0 1", 6, 22886 }, - { "k7/8/3p4/8/8/4P3/8/7K w - - 0 1", 1, 4 }, - { "k7/8/3p4/8/8/4P3/8/7K w - - 0 1", 2, 16 }, - { "k7/8/3p4/8/8/4P3/8/7K w - - 0 1", 3, 101 }, - { "k7/8/3p4/8/8/4P3/8/7K w - - 0 1", 4, 637 }, - { "k7/8/3p4/8/8/4P3/8/7K w - - 0 1", 5, 4271 }, - { "k7/8/3p4/8/8/4P3/8/7K w - - 0 1", 6, 28662 }, - { "7k/3p4/8/8/3P4/8/8/K7 b - - 0 1", 1, 5 }, - { "7k/3p4/8/8/3P4/8/8/K7 b - - 0 1", 2, 19 }, - { "7k/3p4/8/8/3P4/8/8/K7 b - - 0 1", 3, 117 }, - { "7k/3p4/8/8/3P4/8/8/K7 b - - 0 1", 4, 720 }, - { "7k/3p4/8/8/3P4/8/8/K7 b - - 0 1", 5, 5014 }, - { "7k/3p4/8/8/3P4/8/8/K7 b - - 0 1", 6, 32167 }, - { "7k/8/8/3p4/8/8/3P4/K7 b - - 0 1", 1, 4 }, - { "7k/8/8/3p4/8/8/3P4/K7 b - - 0 1", 2, 19 }, - { "7k/8/8/3p4/8/8/3P4/K7 b - - 0 1", 3, 117 }, - { "7k/8/8/3p4/8/8/3P4/K7 b - - 0 1", 4, 712 }, - { "7k/8/8/3p4/8/8/3P4/K7 b - - 0 1", 5, 4658 }, - { "7k/8/8/3p4/8/8/3P4/K7 b - - 0 1", 6, 30749 }, - { "k7/8/8/7p/6P1/8/8/K7 b - - 0 1", 1, 5 }, - { "k7/8/8/7p/6P1/8/8/K7 b - - 0 1", 2, 22 }, - { "k7/8/8/7p/6P1/8/8/K7 b - - 0 1", 3, 139 }, - { "k7/8/8/7p/6P1/8/8/K7 b - - 0 1", 4, 877 }, - { "k7/8/8/7p/6P1/8/8/K7 b - - 0 1", 5, 6112 }, - { "k7/8/8/7p/6P1/8/8/K7 b - - 0 1", 6, 41874 }, - { "k7/8/7p/8/8/6P1/8/K7 b - - 0 1", 1, 4 }, - { "k7/8/7p/8/8/6P1/8/K7 b - - 0 1", 2, 16 }, - { "k7/8/7p/8/8/6P1/8/K7 b - - 0 1", 3, 101 }, - { "k7/8/7p/8/8/6P1/8/K7 b - - 0 1", 4, 637 }, - { "k7/8/7p/8/8/6P1/8/K7 b - - 0 1", 5, 4354 }, - { "k7/8/7p/8/8/6P1/8/K7 b - - 0 1", 6, 29679 }, - { "k7/8/8/6p1/7P/8/8/K7 b - - 0 1", 1, 5 }, - { "k7/8/8/6p1/7P/8/8/K7 b - - 0 1", 2, 22 }, - { "k7/8/8/6p1/7P/8/8/K7 b - - 0 1", 3, 139 }, - { "k7/8/8/6p1/7P/8/8/K7 b - - 0 1", 4, 877 }, - { "k7/8/8/6p1/7P/8/8/K7 b - - 0 1", 5, 6112 }, - { "k7/8/8/6p1/7P/8/8/K7 b - - 0 1", 6, 41874 }, - { "k7/8/6p1/8/8/7P/8/K7 b - - 0 1", 1, 4 }, - { "k7/8/6p1/8/8/7P/8/K7 b - - 0 1", 2, 16 }, - { "k7/8/6p1/8/8/7P/8/K7 b - - 0 1", 3, 101 }, - { "k7/8/6p1/8/8/7P/8/K7 b - - 0 1", 4, 637 }, - { "k7/8/6p1/8/8/7P/8/K7 b - - 0 1", 5, 4354 }, - { "k7/8/6p1/8/8/7P/8/K7 b - - 0 1", 6, 29679 }, - { "k7/8/8/3p4/4p3/8/8/7K b - - 0 1", 1, 5 }, - { "k7/8/8/3p4/4p3/8/8/7K b - - 0 1", 2, 15 }, - { "k7/8/8/3p4/4p3/8/8/7K b - - 0 1", 3, 102 }, - { "k7/8/8/3p4/4p3/8/8/7K b - - 0 1", 4, 569 }, - { "k7/8/8/3p4/4p3/8/8/7K b - - 0 1", 5, 4337 }, - { "k7/8/8/3p4/4p3/8/8/7K b - - 0 1", 6, 22579 }, - { "k7/8/3p4/8/8/4P3/8/7K b - - 0 1", 1, 4 }, - { "k7/8/3p4/8/8/4P3/8/7K b - - 0 1", 2, 16 }, - { "k7/8/3p4/8/8/4P3/8/7K b - - 0 1", 3, 101 }, - { "k7/8/3p4/8/8/4P3/8/7K b - - 0 1", 4, 637 }, - { "k7/8/3p4/8/8/4P3/8/7K b - - 0 1", 5, 4271 }, - { "k7/8/3p4/8/8/4P3/8/7K b - - 0 1", 6, 28662 }, - { "7k/8/8/p7/1P6/8/8/7K w - - 0 1", 1, 5 }, - { "7k/8/8/p7/1P6/8/8/7K w - - 0 1", 2, 22 }, - { "7k/8/8/p7/1P6/8/8/7K w - - 0 1", 3, 139 }, - { "7k/8/8/p7/1P6/8/8/7K w - - 0 1", 4, 877 }, - { "7k/8/8/p7/1P6/8/8/7K w - - 0 1", 5, 6112 }, - { "7k/8/8/p7/1P6/8/8/7K w - - 0 1", 6, 41874 }, - { "7k/8/p7/8/8/1P6/8/7K w - - 0 1", 1, 4 }, - { "7k/8/p7/8/8/1P6/8/7K w - - 0 1", 2, 16 }, - { "7k/8/p7/8/8/1P6/8/7K w - - 0 1", 3, 101 }, - { "7k/8/p7/8/8/1P6/8/7K w - - 0 1", 4, 637 }, - { "7k/8/p7/8/8/1P6/8/7K w - - 0 1", 5, 4354 }, - { "7k/8/p7/8/8/1P6/8/7K w - - 0 1", 6, 29679 }, - { "7k/8/8/1p6/P7/8/8/7K w - - 0 1", 1, 5 }, - { "7k/8/8/1p6/P7/8/8/7K w - - 0 1", 2, 22 }, - { "7k/8/8/1p6/P7/8/8/7K w - - 0 1", 3, 139 }, - { "7k/8/8/1p6/P7/8/8/7K w - - 0 1", 4, 877 }, - { "7k/8/8/1p6/P7/8/8/7K w - - 0 1", 5, 6112 }, - { "7k/8/8/1p6/P7/8/8/7K w - - 0 1", 6, 41874 }, - { "7k/8/1p6/8/8/P7/8/7K w - - 0 1", 1, 4 }, - { "7k/8/1p6/8/8/P7/8/7K w - - 0 1", 2, 16 }, - { "7k/8/1p6/8/8/P7/8/7K w - - 0 1", 3, 101 }, - { "7k/8/1p6/8/8/P7/8/7K w - - 0 1", 4, 637 }, - { "7k/8/1p6/8/8/P7/8/7K w - - 0 1", 5, 4354 }, - { "7k/8/1p6/8/8/P7/8/7K w - - 0 1", 6, 29679 }, - { "k7/7p/8/8/8/8/6P1/K7 w - - 0 1", 1, 5 }, - { "k7/7p/8/8/8/8/6P1/K7 w - - 0 1", 2, 25 }, - { "k7/7p/8/8/8/8/6P1/K7 w - - 0 1", 3, 161 }, - { "k7/7p/8/8/8/8/6P1/K7 w - - 0 1", 4, 1035 }, - { "k7/7p/8/8/8/8/6P1/K7 w - - 0 1", 5, 7574 }, - { "k7/7p/8/8/8/8/6P1/K7 w - - 0 1", 6, 55338 }, - { "k7/6p1/8/8/8/8/7P/K7 w - - 0 1", 1, 5 }, - { "k7/6p1/8/8/8/8/7P/K7 w - - 0 1", 2, 25 }, - { "k7/6p1/8/8/8/8/7P/K7 w - - 0 1", 3, 161 }, - { "k7/6p1/8/8/8/8/7P/K7 w - - 0 1", 4, 1035 }, - { "k7/6p1/8/8/8/8/7P/K7 w - - 0 1", 5, 7574 }, - { "k7/6p1/8/8/8/8/7P/K7 w - - 0 1", 6, 55338 }, - { "3k4/3pp3/8/8/8/8/3PP3/3K4 w - - 0 1", 1, 7 }, - { "3k4/3pp3/8/8/8/8/3PP3/3K4 w - - 0 1", 2, 49 }, - { "3k4/3pp3/8/8/8/8/3PP3/3K4 w - - 0 1", 3, 378 }, - { "3k4/3pp3/8/8/8/8/3PP3/3K4 w - - 0 1", 4, 2902 }, - { "3k4/3pp3/8/8/8/8/3PP3/3K4 w - - 0 1", 5, 24122 }, - { "3k4/3pp3/8/8/8/8/3PP3/3K4 w - - 0 1", 6, 199002 }, - { "7k/8/8/p7/1P6/8/8/7K b - - 0 1", 1, 5 }, - { "7k/8/8/p7/1P6/8/8/7K b - - 0 1", 2, 22 }, - { "7k/8/8/p7/1P6/8/8/7K b - - 0 1", 3, 139 }, - { "7k/8/8/p7/1P6/8/8/7K b - - 0 1", 4, 877 }, - { "7k/8/8/p7/1P6/8/8/7K b - - 0 1", 5, 6112 }, - { "7k/8/8/p7/1P6/8/8/7K b - - 0 1", 6, 41874 }, - { "7k/8/p7/8/8/1P6/8/7K b - - 0 1", 1, 4 }, - { "7k/8/p7/8/8/1P6/8/7K b - - 0 1", 2, 16 }, - { "7k/8/p7/8/8/1P6/8/7K b - - 0 1", 3, 101 }, - { "7k/8/p7/8/8/1P6/8/7K b - - 0 1", 4, 637 }, - { "7k/8/p7/8/8/1P6/8/7K b - - 0 1", 5, 4354 }, - { "7k/8/p7/8/8/1P6/8/7K b - - 0 1", 6, 29679 }, - { "7k/8/8/1p6/P7/8/8/7K b - - 0 1", 1, 5 }, - { "7k/8/8/1p6/P7/8/8/7K b - - 0 1", 2, 22 }, - { "7k/8/8/1p6/P7/8/8/7K b - - 0 1", 3, 139 }, - { "7k/8/8/1p6/P7/8/8/7K b - - 0 1", 4, 877 }, - { "7k/8/8/1p6/P7/8/8/7K b - - 0 1", 5, 6112 }, - { "7k/8/8/1p6/P7/8/8/7K b - - 0 1", 6, 41874 }, - { "7k/8/1p6/8/8/P7/8/7K b - - 0 1", 1, 4 }, - { "7k/8/1p6/8/8/P7/8/7K b - - 0 1", 2, 16 }, - { "7k/8/1p6/8/8/P7/8/7K b - - 0 1", 3, 101 }, - { "7k/8/1p6/8/8/P7/8/7K b - - 0 1", 4, 637 }, - { "7k/8/1p6/8/8/P7/8/7K b - - 0 1", 5, 4354 }, - { "7k/8/1p6/8/8/P7/8/7K b - - 0 1", 6, 29679 }, - { "k7/7p/8/8/8/8/6P1/K7 b - - 0 1", 1, 5 }, - { "k7/7p/8/8/8/8/6P1/K7 b - - 0 1", 2, 25 }, - { "k7/7p/8/8/8/8/6P1/K7 b - - 0 1", 3, 161 }, - { "k7/7p/8/8/8/8/6P1/K7 b - - 0 1", 4, 1035 }, - { "k7/7p/8/8/8/8/6P1/K7 b - - 0 1", 5, 7574 }, - { "k7/7p/8/8/8/8/6P1/K7 b - - 0 1", 6, 55338 }, - { "k7/6p1/8/8/8/8/7P/K7 b - - 0 1", 1, 5 }, - { "k7/6p1/8/8/8/8/7P/K7 b - - 0 1", 2, 25 }, - { "k7/6p1/8/8/8/8/7P/K7 b - - 0 1", 3, 161 }, - { "k7/6p1/8/8/8/8/7P/K7 b - - 0 1", 4, 1035 }, - { "k7/6p1/8/8/8/8/7P/K7 b - - 0 1", 5, 7574 }, - { "k7/6p1/8/8/8/8/7P/K7 b - - 0 1", 6, 55338 }, - { "3k4/3pp3/8/8/8/8/3PP3/3K4 b - - 0 1", 1, 7 }, - { "3k4/3pp3/8/8/8/8/3PP3/3K4 b - - 0 1", 2, 49 }, - { "3k4/3pp3/8/8/8/8/3PP3/3K4 b - - 0 1", 3, 378 }, - { "3k4/3pp3/8/8/8/8/3PP3/3K4 b - - 0 1", 4, 2902 }, - { "3k4/3pp3/8/8/8/8/3PP3/3K4 b - - 0 1", 5, 24122 }, - { "3k4/3pp3/8/8/8/8/3PP3/3K4 b - - 0 1", 6, 199002 }, - { "8/Pk6/8/8/8/8/6Kp/8 w - - 0 1", 1, 11 }, - { "8/Pk6/8/8/8/8/6Kp/8 w - - 0 1", 2, 97 }, - { "8/Pk6/8/8/8/8/6Kp/8 w - - 0 1", 3, 887 }, - { "8/Pk6/8/8/8/8/6Kp/8 w - - 0 1", 4, 8048 }, - { "8/Pk6/8/8/8/8/6Kp/8 w - - 0 1", 5, 90606 }, - { "8/Pk6/8/8/8/8/6Kp/8 w - - 0 1", 6, 1030499 }, - { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N w - - 0 1", 1, 24 }, - { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N w - - 0 1", 2, 421 }, - { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N w - - 0 1", 3, 7421 }, - { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N w - - 0 1", 4, 124608 }, - { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N w - - 0 1", 5, 2193768 }, - { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N w - - 0 1", 6, 37665329 }, - { "8/PPPk4/8/8/8/8/4Kppp/8 w - - 0 1", 1, 18 }, - { "8/PPPk4/8/8/8/8/4Kppp/8 w - - 0 1", 2, 270 }, - { "8/PPPk4/8/8/8/8/4Kppp/8 w - - 0 1", 3, 4699 }, - { "8/PPPk4/8/8/8/8/4Kppp/8 w - - 0 1", 4, 79355 }, - { "8/PPPk4/8/8/8/8/4Kppp/8 w - - 0 1", 5, 1533145 }, - { "8/PPPk4/8/8/8/8/4Kppp/8 w - - 0 1", 6, 28859283 }, - { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N w - - 0 1", 1, 24 }, - { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N w - - 0 1", 2, 496 }, - { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N w - - 0 1", 3, 9483 }, - { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N w - - 0 1", 4, 182838 }, - { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N w - - 0 1", 5, 3605103 }, - { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N w - - 0 1", 6, 71179139 }, - { "8/Pk6/8/8/8/8/6Kp/8 b - - 0 1", 1, 11 }, - { "8/Pk6/8/8/8/8/6Kp/8 b - - 0 1", 2, 97 }, - { "8/Pk6/8/8/8/8/6Kp/8 b - - 0 1", 3, 887 }, - { "8/Pk6/8/8/8/8/6Kp/8 b - - 0 1", 4, 8048 }, - { "8/Pk6/8/8/8/8/6Kp/8 b - - 0 1", 5, 90606 }, - { "8/Pk6/8/8/8/8/6Kp/8 b - - 0 1", 6, 1030499 }, - { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N b - - 0 1", 1, 24 }, - { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N b - - 0 1", 2, 421 }, - { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N b - - 0 1", 3, 7421 }, - { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N b - - 0 1", 4, 124608 }, - { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N b - - 0 1", 5, 2193768 }, - { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N b - - 0 1", 6, 37665329 }, - { "8/PPPk4/8/8/8/8/4Kppp/8 b - - 0 1", 1, 18 }, - { "8/PPPk4/8/8/8/8/4Kppp/8 b - - 0 1", 2, 270 }, - { "8/PPPk4/8/8/8/8/4Kppp/8 b - - 0 1", 3, 4699 }, - { "8/PPPk4/8/8/8/8/4Kppp/8 b - - 0 1", 4, 79355 }, - { "8/PPPk4/8/8/8/8/4Kppp/8 b - - 0 1", 5, 1533145 }, - { "8/PPPk4/8/8/8/8/4Kppp/8 b - - 0 1", 6, 28859283 }, - { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N b - - 0 1", 1, 24 }, - { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N b - - 0 1", 2, 496 }, - { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N b - - 0 1", 3, 9483 }, - { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N b - - 0 1", 4, 182838 }, - { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N b - - 0 1", 5, 3605103 }, - { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N b - - 0 1", 6, 71179139 }, - { "6k1/2nNrq2/bb1P2NR/P2bqqN1/qpKQ3n/2Rn2B1/B1r1N3/1Q1Nb3 w - - 0 1", 5, 0 }, // checkmate - { "K7/3n3R/1r4k1/8/8/8/2p5/8 w - - 0 1", 5, 1056215 }, - { "1Qn2n1k/P1K2P2/1pr2nrP/1p2Q1b1/bPP2B2/p2B1q1N/2Rpp1pn/Q3Q1N1 w - - 0 1", 1, 2 }, - { "1Qn2n1k/P1K2P2/1pr2nrP/1p2Q1b1/bPP2B2/p2B1q1N/2Rpp1pn/Q3Q1N1 w - - 0 1", 5, 11921325 }, - { "8/7K/8/8/8/5R2/8/k7 b - - 0 1", 1, 3 }, - { "8/7K/8/8/8/5R2/8/k7 b - - 0 1", 2, 57 }, - { "8/7K/8/8/8/5R2/8/k7 b - - 0 1", 3, 261 }, - { "8/7K/8/8/8/5R2/8/k7 b - - 0 1", 4, 4897 }, - { "8/7K/8/8/8/5R2/8/k7 b - - 0 1", 5, 22176 }, - { "8/7K/8/8/8/5R2/8/k7 b - - 0 1", 6, 413723 }, - { "8/7K/8/8/8/5R2/8/k7 b - - 0 1", 7, 2109569 }, - { "8/7K/8/8/8/5R2/8/k7 b - - 0 1", 8, 39470570 }, - { "8/5K1p/r7/6q1/2p5/5qk1/8/8 w - - 0 1", 1, 1 }, - { "8/5K1p/r7/6q1/2p5/5qk1/8/8 w - - 0 1", 5, 17218 }, - { "3n2r1/2k2B1q/3B2Q1/N1n1P3/1r1R1NQ1/2brB1r1/PQB5/bK6 b - - 0 1", 1, 1 }, - { "3n2r1/2k2B1q/3B2Q1/N1n1P3/1r1R1NQ1/2brB1r1/PQB5/bK6 b - - 0 1", 5, 7037862 }, - { "4q2R/BQ1Np2k/4pn2/bK1N4/4p3/1n6/8/8 b - - 0 1", 1, 4 }, - { "4q2R/BQ1Np2k/4pn2/bK1N4/4p3/1n6/8/8 b - - 0 1", 5, 3945793 }, - { "1K6/6N1/5Q2/5p2/4Pk2/8/8/8 b - - 0 1", 1, 5 }, - { "1K6/6N1/5Q2/5p2/4Pk2/8/8/8 b - - 0 1", 5, 188155 }, - { "1K6/6N1/5Q2/5p2/4Pk2/8/8/8 b - - 0 1", 6, 5537444 }, - { "1K6/6N1/5Q2/5p2/4Pk2/8/8/8 b - - 0 1", 7, 33107724 }, - { "k2bR1B1/NR3B2/2BR4/1N1p1bN1/N3b3/7r/B2n1KN1/2Q5 w - - 0 1", 1, 64 }, - { "k2bR1B1/NR3B2/2BR4/1N1p1bN1/N3b3/7r/B2n1KN1/2Q5 w - - 0 1", 4, 2641743 }, - { "4B3/8/5K2/8/8/3k4/8/5N2 b - - 0 1", 1, 6 }, - { "4B3/8/5K2/8/8/3k4/8/5N2 b - - 0 1", 5, 71831 }, - { "4B3/8/5K2/8/8/3k4/8/5N2 b - - 0 1", 6, 1376826 }, - { "3q3B/3Q4/1k1N4/5Q2/6Q1/1B2N2Q/K4bB1/2q2N2 b - - 0 1", 1, 35 }, - { "3q3B/3Q4/1k1N4/5Q2/6Q1/1B2N2Q/K4bB1/2q2N2 b - - 0 1", 4, 5855605 }, - { "8/1K6/8/8/6n1/1k6/8/8 w - - 0 1", 1, 8 }, - { "8/1K6/8/8/6n1/1k6/8/8 w - - 0 1", 5, 50950 }, - { "8/1K6/8/8/6n1/1k6/8/8 w - - 0 1", 7, 3844295 }, - { "8/1K6/8/8/6n1/1k6/8/8 w - - 0 1", 8, 47694794 }, - { "8/5qk1/8/2Kb2r1/8/1b5r/2n5/1b6 b - - 0 1", 1, 63 }, - { "8/5qk1/8/2Kb2r1/8/1b5r/2n5/1b6 b - - 0 1", 2, 168 }, - { "8/5qk1/8/2Kb2r1/8/1b5r/2n5/1b6 b - - 0 1", 3, 10739 }, - { "8/5qk1/8/2Kb2r1/8/1b5r/2n5/1b6 b - - 0 1", 4, 28349 }, - { "8/5qk1/8/2Kb2r1/8/1b5r/2n5/1b6 b - - 0 1", 5, 1804208 }, - { "8/5qk1/8/2Kb2r1/8/1b5r/2n5/1b6 b - - 0 1", 6, 5073106 }, - { "2b5/2p5/8/8/5B1k/q7/2K5/8 w - - 0 1", 1, 13 }, - { "2b5/2p5/8/8/5B1k/q7/2K5/8 w - - 0 1", 2, 376 }, - { "2b5/2p5/8/8/5B1k/q7/2K5/8 w - - 0 1", 3, 3875 }, - { "2b5/2p5/8/8/5B1k/q7/2K5/8 w - - 0 1", 4, 112556 }, - { "2b5/2p5/8/8/5B1k/q7/2K5/8 w - - 0 1", 5, 1189238 }, - { "2K2q1q/2n4n/3qb3/1r2qq2/5n2/k4n2/r5Q1/1q6 w - - 0 1", 1, 0 }, // checkmate - // Pins (i noticed an desync of position.h that leaves pins unchanged) - { "8/1Q1pkp1Q/3ppp2/8/1Q2Q2Q/4K3/8/8 w - - 0 1", 5, 6990511 }, - { "8/3pkp2/3ppp2/8/1Q6/4K3/8/8 w - - 0 1", 5, 617665 }, - { "7k/4p3/8/2KP3r/8/8/8/8 b - - 0 1", 5, 197176 }, - { "rnbqkbnr/1p2pppp/p7/2Pp4/8/8/PPPKPPPP/RNBQ1BNR w kq d6 0 4", 1, 25 }, - { "rnbqkbnr/1p2pppp/p7/2Pp4/8/8/PPPKPPPP/RNBQ1BNR w kq d6 0 4", 2, 701 }, - { "rnbqkbnr/1p2pppp/p7/2Pp4/8/8/PPPKPPPP/RNBQ1BNR w kq d6 0 4", 3, 17762 } + { "4k3/8/8/8/8/8/8/4K2R w K - 0 1", 1, 15 }, + { "4k3/8/8/8/8/8/8/4K2R w K - 0 1", 2, 66 }, + { "4k3/8/8/8/8/8/8/4K2R w K - 0 1", 3, 1197 }, + { "4k3/8/8/8/8/8/8/4K2R w K - 0 1", 4, 7059 }, + { "4k3/8/8/8/8/8/8/4K2R w K - 0 1", 5, 133987 }, + { "4k3/8/8/8/8/8/8/4K2R w K - 0 1", 6, 764643 }, + { "4k3/8/8/8/8/8/8/R3K3 w Q - 0 1", 1, 16 }, + { "4k3/8/8/8/8/8/8/R3K3 w Q - 0 1", 2, 71 }, + { "4k3/8/8/8/8/8/8/R3K3 w Q - 0 1", 3, 1287 }, + { "4k3/8/8/8/8/8/8/R3K3 w Q - 0 1", 4, 7626 }, + { "4k3/8/8/8/8/8/8/R3K3 w Q - 0 1", 5, 145232 }, + { "4k3/8/8/8/8/8/8/R3K3 w Q - 0 1", 6, 846648 }, + { "4k2r/8/8/8/8/8/8/4K3 w k - 0 1", 1, 5 }, + { "4k2r/8/8/8/8/8/8/4K3 w k - 0 1", 2, 75 }, + { "4k2r/8/8/8/8/8/8/4K3 w k - 0 1", 3, 459 }, + { "4k2r/8/8/8/8/8/8/4K3 w k - 0 1", 4, 8290 }, + { "4k2r/8/8/8/8/8/8/4K3 w k - 0 1", 5, 47635 }, + { "4k2r/8/8/8/8/8/8/4K3 w k - 0 1", 6, 899442 }, + { "r3k3/8/8/8/8/8/8/4K3 w q - 0 1", 1, 5 }, + { "r3k3/8/8/8/8/8/8/4K3 w q - 0 1", 2, 80 }, + { "r3k3/8/8/8/8/8/8/4K3 w q - 0 1", 3, 493 }, + { "r3k3/8/8/8/8/8/8/4K3 w q - 0 1", 4, 8897 }, + { "r3k3/8/8/8/8/8/8/4K3 w q - 0 1", 5, 52710 }, + { "r3k3/8/8/8/8/8/8/4K3 w q - 0 1", 6, 1001523 }, + { "4k3/8/8/8/8/8/8/R3K2R w KQ - 0 1", 1, 26 }, + { "4k3/8/8/8/8/8/8/R3K2R w KQ - 0 1", 2, 112 }, + { "4k3/8/8/8/8/8/8/R3K2R w KQ - 0 1", 3, 3189 }, + { "4k3/8/8/8/8/8/8/R3K2R w KQ - 0 1", 4, 17945 }, + { "4k3/8/8/8/8/8/8/R3K2R w KQ - 0 1", 5, 532933 }, + { "4k3/8/8/8/8/8/8/R3K2R w KQ - 0 1", 6, 2788982 }, + { "r3k2r/8/8/8/8/8/8/4K3 w kq - 0 1", 1, 5 }, + { "r3k2r/8/8/8/8/8/8/4K3 w kq - 0 1", 2, 130 }, + { "r3k2r/8/8/8/8/8/8/4K3 w kq - 0 1", 3, 782 }, + { "r3k2r/8/8/8/8/8/8/4K3 w kq - 0 1", 4, 22180 }, + { "r3k2r/8/8/8/8/8/8/4K3 w kq - 0 1", 5, 118882 }, + { "r3k2r/8/8/8/8/8/8/4K3 w kq - 0 1", 6, 3517770 }, + { "8/8/8/8/8/8/6k1/4K2R w K - 0 1", 1, 12 }, + { "8/8/8/8/8/8/6k1/4K2R w K - 0 1", 2, 38 }, + { "8/8/8/8/8/8/6k1/4K2R w K - 0 1", 3, 564 }, + { "8/8/8/8/8/8/6k1/4K2R w K - 0 1", 4, 2219 }, + { "8/8/8/8/8/8/6k1/4K2R w K - 0 1", 5, 37735 }, + { "8/8/8/8/8/8/6k1/4K2R w K - 0 1", 6, 185867 }, + { "8/8/8/8/8/8/1k6/R3K3 w Q - 0 1", 1, 15 }, + { "8/8/8/8/8/8/1k6/R3K3 w Q - 0 1", 2, 65 }, + { "8/8/8/8/8/8/1k6/R3K3 w Q - 0 1", 3, 1018 }, + { "8/8/8/8/8/8/1k6/R3K3 w Q - 0 1", 4, 4573 }, + { "8/8/8/8/8/8/1k6/R3K3 w Q - 0 1", 5, 80619 }, + { "8/8/8/8/8/8/1k6/R3K3 w Q - 0 1", 6, 413018 }, + { "4k2r/6K1/8/8/8/8/8/8 w k - 0 1", 1, 3 }, + { "4k2r/6K1/8/8/8/8/8/8 w k - 0 1", 2, 32 }, + { "4k2r/6K1/8/8/8/8/8/8 w k - 0 1", 3, 134 }, + { "4k2r/6K1/8/8/8/8/8/8 w k - 0 1", 4, 2073 }, + { "4k2r/6K1/8/8/8/8/8/8 w k - 0 1", 5, 10485 }, + { "4k2r/6K1/8/8/8/8/8/8 w k - 0 1", 6, 179869 }, + { "r3k3/1K6/8/8/8/8/8/8 w q - 0 1", 1, 4 }, + { "r3k3/1K6/8/8/8/8/8/8 w q - 0 1", 2, 49 }, + { "r3k3/1K6/8/8/8/8/8/8 w q - 0 1", 3, 243 }, + { "r3k3/1K6/8/8/8/8/8/8 w q - 0 1", 4, 3991 }, + { "r3k3/1K6/8/8/8/8/8/8 w q - 0 1", 5, 20780 }, + { "r3k3/1K6/8/8/8/8/8/8 w q - 0 1", 6, 367724 }, + { "r3k2r/8/8/8/8/8/8/R3K2R w KQkq - 0 1", 1, 26 }, + { "r3k2r/8/8/8/8/8/8/R3K2R w KQkq - 0 1", 2, 568 }, + { "r3k2r/8/8/8/8/8/8/R3K2R w KQkq - 0 1", 3, 13744 }, + { "r3k2r/8/8/8/8/8/8/R3K2R w KQkq - 0 1", 4, 314346 }, + { "r3k2r/8/8/8/8/8/8/R3K2R w KQkq - 0 1", 5, 7594526 }, + { "r3k2r/8/8/8/8/8/8/R3K2R w KQkq - 0 1", 6, 179862938 }, + { "r3k2r/8/8/8/8/8/8/1R2K2R w Kkq - 0 1", 1, 25 }, + { "r3k2r/8/8/8/8/8/8/1R2K2R w Kkq - 0 1", 2, 567 }, + { "r3k2r/8/8/8/8/8/8/1R2K2R w Kkq - 0 1", 3, 14095 }, + { "r3k2r/8/8/8/8/8/8/1R2K2R w Kkq - 0 1", 4, 328965 }, + { "r3k2r/8/8/8/8/8/8/1R2K2R w Kkq - 0 1", 5, 8153719 }, + { "r3k2r/8/8/8/8/8/8/1R2K2R w Kkq - 0 1", 6, 195629489 }, + { "r3k2r/8/8/8/8/8/8/2R1K2R w Kkq - 0 1", 1, 25 }, + { "r3k2r/8/8/8/8/8/8/2R1K2R w Kkq - 0 1", 2, 548 }, + { "r3k2r/8/8/8/8/8/8/2R1K2R w Kkq - 0 1", 3, 13502 }, + { "r3k2r/8/8/8/8/8/8/2R1K2R w Kkq - 0 1", 4, 312835 }, + { "r3k2r/8/8/8/8/8/8/2R1K2R w Kkq - 0 1", 5, 7736373 }, + { "r3k2r/8/8/8/8/8/8/2R1K2R w Kkq - 0 1", 6, 184411439 }, + { "r3k2r/8/8/8/8/8/8/R3K1R1 w Qkq - 0 1", 1, 25 }, + { "r3k2r/8/8/8/8/8/8/R3K1R1 w Qkq - 0 1", 2, 547 }, + { "r3k2r/8/8/8/8/8/8/R3K1R1 w Qkq - 0 1", 3, 13579 }, + { "r3k2r/8/8/8/8/8/8/R3K1R1 w Qkq - 0 1", 4, 316214 }, + { "r3k2r/8/8/8/8/8/8/R3K1R1 w Qkq - 0 1", 5, 7878456 }, + { "r3k2r/8/8/8/8/8/8/R3K1R1 w Qkq - 0 1", 6, 189224276 }, + { "1r2k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 1, 26 }, + { "1r2k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 2, 583 }, + { "1r2k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 3, 14252 }, + { "1r2k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 4, 334705 }, + { "1r2k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 5, 8198901 }, + { "1r2k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 6, 198328929 }, + { "2r1k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 1, 25 }, + { "2r1k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 2, 560 }, + { "2r1k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 3, 13592 }, + { "2r1k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 4, 317324 }, + { "2r1k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 5, 7710115 }, + { "2r1k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1", 6, 185959088 }, + { "r3k1r1/8/8/8/8/8/8/R3K2R w KQq - 0 1", 1, 25 }, + { "r3k1r1/8/8/8/8/8/8/R3K2R w KQq - 0 1", 2, 560 }, + { "r3k1r1/8/8/8/8/8/8/R3K2R w KQq - 0 1", 3, 13607 }, + { "r3k1r1/8/8/8/8/8/8/R3K2R w KQq - 0 1", 4, 320792 }, + { "r3k1r1/8/8/8/8/8/8/R3K2R w KQq - 0 1", 5, 7848606 }, + { "r3k1r1/8/8/8/8/8/8/R3K2R w KQq - 0 1", 6, 190755813 }, + { "4k3/8/8/8/8/8/8/4K2R b K - 0 1", 1, 5 }, + { "4k3/8/8/8/8/8/8/4K2R b K - 0 1", 2, 75 }, + { "4k3/8/8/8/8/8/8/4K2R b K - 0 1", 3, 459 }, + { "4k3/8/8/8/8/8/8/4K2R b K - 0 1", 4, 8290 }, + { "4k3/8/8/8/8/8/8/4K2R b K - 0 1", 5, 47635 }, + { "4k3/8/8/8/8/8/8/4K2R b K - 0 1", 6, 899442 }, + { "4k3/8/8/8/8/8/8/R3K3 b Q - 0 1", 1, 5 }, + { "4k3/8/8/8/8/8/8/R3K3 b Q - 0 1", 2, 80 }, + { "4k3/8/8/8/8/8/8/R3K3 b Q - 0 1", 3, 493 }, + { "4k3/8/8/8/8/8/8/R3K3 b Q - 0 1", 4, 8897 }, + { "4k3/8/8/8/8/8/8/R3K3 b Q - 0 1", 5, 52710 }, + { "4k3/8/8/8/8/8/8/R3K3 b Q - 0 1", 6, 1001523 }, + { "4k2r/8/8/8/8/8/8/4K3 b k - 0 1", 1, 15 }, + { "4k2r/8/8/8/8/8/8/4K3 b k - 0 1", 2, 66 }, + { "4k2r/8/8/8/8/8/8/4K3 b k - 0 1", 3, 1197 }, + { "4k2r/8/8/8/8/8/8/4K3 b k - 0 1", 4, 7059 }, + { "4k2r/8/8/8/8/8/8/4K3 b k - 0 1", 5, 133987 }, + { "4k2r/8/8/8/8/8/8/4K3 b k - 0 1", 6, 764643 }, + { "r3k3/8/8/8/8/8/8/4K3 b q - 0 1", 1, 16 }, + { "r3k3/8/8/8/8/8/8/4K3 b q - 0 1", 2, 71 }, + { "r3k3/8/8/8/8/8/8/4K3 b q - 0 1", 3, 1287 }, + { "r3k3/8/8/8/8/8/8/4K3 b q - 0 1", 4, 7626 }, + { "r3k3/8/8/8/8/8/8/4K3 b q - 0 1", 5, 145232 }, + { "r3k3/8/8/8/8/8/8/4K3 b q - 0 1", 6, 846648 }, + { "4k3/8/8/8/8/8/8/R3K2R b KQ - 0 1", 1, 5 }, + { "4k3/8/8/8/8/8/8/R3K2R b KQ - 0 1", 2, 130 }, + { "4k3/8/8/8/8/8/8/R3K2R b KQ - 0 1", 3, 782 }, + { "4k3/8/8/8/8/8/8/R3K2R b KQ - 0 1", 4, 22180 }, + { "4k3/8/8/8/8/8/8/R3K2R b KQ - 0 1", 5, 118882 }, + { "4k3/8/8/8/8/8/8/R3K2R b KQ - 0 1", 6, 3517770 }, + { "r3k2r/8/8/8/8/8/8/4K3 b kq - 0 1", 1, 26 }, + { "r3k2r/8/8/8/8/8/8/4K3 b kq - 0 1", 2, 112 }, + { "r3k2r/8/8/8/8/8/8/4K3 b kq - 0 1", 3, 3189 }, + { "r3k2r/8/8/8/8/8/8/4K3 b kq - 0 1", 4, 17945 }, + { "r3k2r/8/8/8/8/8/8/4K3 b kq - 0 1", 5, 532933 }, + { "r3k2r/8/8/8/8/8/8/4K3 b kq - 0 1", 6, 2788982 }, + { "8/8/8/8/8/8/6k1/4K2R b K - 0 1", 1, 3 }, + { "8/8/8/8/8/8/6k1/4K2R b K - 0 1", 2, 32 }, + { "8/8/8/8/8/8/6k1/4K2R b K - 0 1", 3, 134 }, + { "8/8/8/8/8/8/6k1/4K2R b K - 0 1", 4, 2073 }, + { "8/8/8/8/8/8/6k1/4K2R b K - 0 1", 5, 10485 }, + { "8/8/8/8/8/8/6k1/4K2R b K - 0 1", 6, 179869 }, + { "8/8/8/8/8/8/1k6/R3K3 b Q - 0 1", 1, 4 }, + { "8/8/8/8/8/8/1k6/R3K3 b Q - 0 1", 2, 49 }, + { "8/8/8/8/8/8/1k6/R3K3 b Q - 0 1", 3, 243 }, + { "8/8/8/8/8/8/1k6/R3K3 b Q - 0 1", 4, 3991 }, + { "8/8/8/8/8/8/1k6/R3K3 b Q - 0 1", 5, 20780 }, + { "8/8/8/8/8/8/1k6/R3K3 b Q - 0 1", 6, 367724 }, + { "4k2r/6K1/8/8/8/8/8/8 b k - 0 1", 1, 12 }, + { "4k2r/6K1/8/8/8/8/8/8 b k - 0 1", 2, 38 }, + { "4k2r/6K1/8/8/8/8/8/8 b k - 0 1", 3, 564 }, + { "4k2r/6K1/8/8/8/8/8/8 b k - 0 1", 4, 2219 }, + { "4k2r/6K1/8/8/8/8/8/8 b k - 0 1", 5, 37735 }, + { "4k2r/6K1/8/8/8/8/8/8 b k - 0 1", 6, 185867 }, + { "r3k3/1K6/8/8/8/8/8/8 b q - 0 1", 1, 15 }, + { "r3k3/1K6/8/8/8/8/8/8 b q - 0 1", 2, 65 }, + { "r3k3/1K6/8/8/8/8/8/8 b q - 0 1", 3, 1018 }, + { "r3k3/1K6/8/8/8/8/8/8 b q - 0 1", 4, 4573 }, + { "r3k3/1K6/8/8/8/8/8/8 b q - 0 1", 5, 80619 }, + { "r3k3/1K6/8/8/8/8/8/8 b q - 0 1", 6, 413018 }, + { "r3k2r/8/8/8/8/8/8/R3K2R b KQkq - 0 1", 1, 26 }, + { "r3k2r/8/8/8/8/8/8/R3K2R b KQkq - 0 1", 2, 568 }, + { "r3k2r/8/8/8/8/8/8/R3K2R b KQkq - 0 1", 3, 13744 }, + { "r3k2r/8/8/8/8/8/8/R3K2R b KQkq - 0 1", 4, 314346 }, + { "r3k2r/8/8/8/8/8/8/R3K2R b KQkq - 0 1", 5, 7594526 }, + { "r3k2r/8/8/8/8/8/8/R3K2R b KQkq - 0 1", 6, 179862938 }, + { "r3k2r/8/8/8/8/8/8/1R2K2R b Kkq - 0 1", 1, 26 }, + { "r3k2r/8/8/8/8/8/8/1R2K2R b Kkq - 0 1", 2, 583 }, + { "r3k2r/8/8/8/8/8/8/1R2K2R b Kkq - 0 1", 3, 14252 }, + { "r3k2r/8/8/8/8/8/8/1R2K2R b Kkq - 0 1", 4, 334705 }, + { "r3k2r/8/8/8/8/8/8/1R2K2R b Kkq - 0 1", 5, 8198901 }, + { "r3k2r/8/8/8/8/8/8/1R2K2R b Kkq - 0 1", 6, 198328929 }, + { "r3k2r/8/8/8/8/8/8/2R1K2R b Kkq - 0 1", 1, 25 }, + { "r3k2r/8/8/8/8/8/8/2R1K2R b Kkq - 0 1", 2, 560 }, + { "r3k2r/8/8/8/8/8/8/2R1K2R b Kkq - 0 1", 3, 13592 }, + { "r3k2r/8/8/8/8/8/8/2R1K2R b Kkq - 0 1", 4, 317324 }, + { "r3k2r/8/8/8/8/8/8/2R1K2R b Kkq - 0 1", 5, 7710115 }, + { "r3k2r/8/8/8/8/8/8/2R1K2R b Kkq - 0 1", 6, 185959088 }, + { "r3k2r/8/8/8/8/8/8/R3K1R1 b Qkq - 0 1", 1, 25 }, + { "r3k2r/8/8/8/8/8/8/R3K1R1 b Qkq - 0 1", 2, 560 }, + { "r3k2r/8/8/8/8/8/8/R3K1R1 b Qkq - 0 1", 3, 13607 }, + { "r3k2r/8/8/8/8/8/8/R3K1R1 b Qkq - 0 1", 4, 320792 }, + { "r3k2r/8/8/8/8/8/8/R3K1R1 b Qkq - 0 1", 5, 7848606 }, + { "r3k2r/8/8/8/8/8/8/R3K1R1 b Qkq - 0 1", 6, 190755813 }, + { "1r2k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 1, 25 }, + { "1r2k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 2, 567 }, + { "1r2k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 3, 14095 }, + { "1r2k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 4, 328965 }, + { "1r2k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 5, 8153719 }, + { "1r2k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 6, 195629489 }, + { "2r1k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 1, 25 }, + { "2r1k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 2, 548 }, + { "2r1k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 3, 13502 }, + { "2r1k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 4, 312835 }, + { "2r1k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 5, 7736373 }, + { "2r1k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1", 6, 184411439 }, + { "r3k1r1/8/8/8/8/8/8/R3K2R b KQq - 0 1", 1, 25 }, + { "r3k1r1/8/8/8/8/8/8/R3K2R b KQq - 0 1", 2, 547 }, + { "r3k1r1/8/8/8/8/8/8/R3K2R b KQq - 0 1", 3, 13579 }, + { "r3k1r1/8/8/8/8/8/8/R3K2R b KQq - 0 1", 4, 316214 }, + { "r3k1r1/8/8/8/8/8/8/R3K2R b KQq - 0 1", 5, 7878456 }, + { "r3k1r1/8/8/8/8/8/8/R3K2R b KQq - 0 1", 6, 189224276 }, + { "8/1n4N1/2k5/8/8/5K2/1N4n1/8 w - - 0 1", 1, 14 }, + { "8/1n4N1/2k5/8/8/5K2/1N4n1/8 w - - 0 1", 2, 195 }, + { "8/1n4N1/2k5/8/8/5K2/1N4n1/8 w - - 0 1", 3, 2760 }, + { "8/1n4N1/2k5/8/8/5K2/1N4n1/8 w - - 0 1", 4, 38675 }, + { "8/1n4N1/2k5/8/8/5K2/1N4n1/8 w - - 0 1", 5, 570726 }, + { "8/1n4N1/2k5/8/8/5K2/1N4n1/8 w - - 0 1", 6, 8107539 }, + { "8/1k6/8/5N2/8/4n3/8/2K5 w - - 0 1", 1, 11 }, + { "8/1k6/8/5N2/8/4n3/8/2K5 w - - 0 1", 2, 156 }, + { "8/1k6/8/5N2/8/4n3/8/2K5 w - - 0 1", 3, 1636 }, + { "8/1k6/8/5N2/8/4n3/8/2K5 w - - 0 1", 4, 20534 }, + { "8/1k6/8/5N2/8/4n3/8/2K5 w - - 0 1", 5, 223507 }, + { "8/1k6/8/5N2/8/4n3/8/2K5 w - - 0 1", 6, 2594412 }, + { "8/8/4k3/3Nn3/3nN3/4K3/8/8 w - - 0 1", 1, 19 }, + { "8/8/4k3/3Nn3/3nN3/4K3/8/8 w - - 0 1", 2, 289 }, + { "8/8/4k3/3Nn3/3nN3/4K3/8/8 w - - 0 1", 3, 4442 }, + { "8/8/4k3/3Nn3/3nN3/4K3/8/8 w - - 0 1", 4, 73584 }, + { "8/8/4k3/3Nn3/3nN3/4K3/8/8 w - - 0 1", 5, 1198299 }, + { "8/8/4k3/3Nn3/3nN3/4K3/8/8 w - - 0 1", 6, 19870403 }, + { "K7/8/2n5/1n6/8/8/8/k6N w - - 0 1", 1, 3 }, + { "K7/8/2n5/1n6/8/8/8/k6N w - - 0 1", 2, 51 }, + { "K7/8/2n5/1n6/8/8/8/k6N w - - 0 1", 3, 345 }, + { "K7/8/2n5/1n6/8/8/8/k6N w - - 0 1", 4, 5301 }, + { "K7/8/2n5/1n6/8/8/8/k6N w - - 0 1", 5, 38348 }, + { "K7/8/2n5/1n6/8/8/8/k6N w - - 0 1", 6, 588695 }, + { "k7/8/2N5/1N6/8/8/8/K6n w - - 0 1", 1, 17 }, + { "k7/8/2N5/1N6/8/8/8/K6n w - - 0 1", 2, 54 }, + { "k7/8/2N5/1N6/8/8/8/K6n w - - 0 1", 3, 835 }, + { "k7/8/2N5/1N6/8/8/8/K6n w - - 0 1", 4, 5910 }, + { "k7/8/2N5/1N6/8/8/8/K6n w - - 0 1", 5, 92250 }, + { "k7/8/2N5/1N6/8/8/8/K6n w - - 0 1", 6, 688780 }, + { "8/1n4N1/2k5/8/8/5K2/1N4n1/8 b - - 0 1", 1, 15 }, + { "8/1n4N1/2k5/8/8/5K2/1N4n1/8 b - - 0 1", 2, 193 }, + { "8/1n4N1/2k5/8/8/5K2/1N4n1/8 b - - 0 1", 3, 2816 }, + { "8/1n4N1/2k5/8/8/5K2/1N4n1/8 b - - 0 1", 4, 40039 }, + { "8/1n4N1/2k5/8/8/5K2/1N4n1/8 b - - 0 1", 5, 582642 }, + { "8/1n4N1/2k5/8/8/5K2/1N4n1/8 b - - 0 1", 6, 8503277 }, + { "8/1k6/8/5N2/8/4n3/8/2K5 b - - 0 1", 1, 16 }, + { "8/1k6/8/5N2/8/4n3/8/2K5 b - - 0 1", 2, 180 }, + { "8/1k6/8/5N2/8/4n3/8/2K5 b - - 0 1", 3, 2290 }, + { "8/1k6/8/5N2/8/4n3/8/2K5 b - - 0 1", 4, 24640 }, + { "8/1k6/8/5N2/8/4n3/8/2K5 b - - 0 1", 5, 288141 }, + { "8/1k6/8/5N2/8/4n3/8/2K5 b - - 0 1", 6, 3147566 }, + { "8/8/3K4/3Nn3/3nN3/4k3/8/8 b - - 0 1", 1, 4 }, + { "8/8/3K4/3Nn3/3nN3/4k3/8/8 b - - 0 1", 2, 68 }, + { "8/8/3K4/3Nn3/3nN3/4k3/8/8 b - - 0 1", 3, 1118 }, + { "8/8/3K4/3Nn3/3nN3/4k3/8/8 b - - 0 1", 4, 16199 }, + { "8/8/3K4/3Nn3/3nN3/4k3/8/8 b - - 0 1", 5, 281190 }, + { "8/8/3K4/3Nn3/3nN3/4k3/8/8 b - - 0 1", 6, 4405103 }, + { "K7/8/2n5/1n6/8/8/8/k6N b - - 0 1", 1, 17 }, + { "K7/8/2n5/1n6/8/8/8/k6N b - - 0 1", 2, 54 }, + { "K7/8/2n5/1n6/8/8/8/k6N b - - 0 1", 3, 835 }, + { "K7/8/2n5/1n6/8/8/8/k6N b - - 0 1", 4, 5910 }, + { "K7/8/2n5/1n6/8/8/8/k6N b - - 0 1", 5, 92250 }, + { "K7/8/2n5/1n6/8/8/8/k6N b - - 0 1", 6, 688780 }, + { "k7/8/2N5/1N6/8/8/8/K6n b - - 0 1", 1, 3 }, + { "k7/8/2N5/1N6/8/8/8/K6n b - - 0 1", 2, 51 }, + { "k7/8/2N5/1N6/8/8/8/K6n b - - 0 1", 3, 345 }, + { "k7/8/2N5/1N6/8/8/8/K6n b - - 0 1", 4, 5301 }, + { "k7/8/2N5/1N6/8/8/8/K6n b - - 0 1", 5, 38348 }, + { "k7/8/2N5/1N6/8/8/8/K6n b - - 0 1", 6, 588695 }, + { "B6b/8/8/8/2K5/4k3/8/b6B w - - 0 1", 1, 17 }, + { "B6b/8/8/8/2K5/4k3/8/b6B w - - 0 1", 2, 278 }, + { "B6b/8/8/8/2K5/4k3/8/b6B w - - 0 1", 3, 4607 }, + { "B6b/8/8/8/2K5/4k3/8/b6B w - - 0 1", 4, 76778 }, + { "B6b/8/8/8/2K5/4k3/8/b6B w - - 0 1", 5, 1320507 }, + { "B6b/8/8/8/2K5/4k3/8/b6B w - - 0 1", 6, 22823890 }, + { "8/8/1B6/7b/7k/8/2B1b3/7K w - - 0 1", 1, 21 }, + { "8/8/1B6/7b/7k/8/2B1b3/7K w - - 0 1", 2, 316 }, + { "8/8/1B6/7b/7k/8/2B1b3/7K w - - 0 1", 3, 5744 }, + { "8/8/1B6/7b/7k/8/2B1b3/7K w - - 0 1", 4, 93338 }, + { "8/8/1B6/7b/7k/8/2B1b3/7K w - - 0 1", 5, 1713368 }, + { "8/8/1B6/7b/7k/8/2B1b3/7K w - - 0 1", 6, 28861171 }, + { "k7/B7/1B6/1B6/8/8/8/K6b w - - 0 1", 1, 21 }, + { "k7/B7/1B6/1B6/8/8/8/K6b w - - 0 1", 2, 144 }, + { "k7/B7/1B6/1B6/8/8/8/K6b w - - 0 1", 3, 3242 }, + { "k7/B7/1B6/1B6/8/8/8/K6b w - - 0 1", 4, 32955 }, + { "k7/B7/1B6/1B6/8/8/8/K6b w - - 0 1", 5, 787524 }, + { "k7/B7/1B6/1B6/8/8/8/K6b w - - 0 1", 6, 7881673 }, + { "K7/b7/1b6/1b6/8/8/8/k6B w - - 0 1", 1, 7 }, + { "K7/b7/1b6/1b6/8/8/8/k6B w - - 0 1", 2, 143 }, + { "K7/b7/1b6/1b6/8/8/8/k6B w - - 0 1", 3, 1416 }, + { "K7/b7/1b6/1b6/8/8/8/k6B w - - 0 1", 4, 31787 }, + { "K7/b7/1b6/1b6/8/8/8/k6B w - - 0 1", 5, 310862 }, + { "K7/b7/1b6/1b6/8/8/8/k6B w - - 0 1", 6, 7382896 }, + { "B6b/8/8/8/2K5/5k2/8/b6B b - - 0 1", 1, 6 }, + { "B6b/8/8/8/2K5/5k2/8/b6B b - - 0 1", 2, 106 }, + { "B6b/8/8/8/2K5/5k2/8/b6B b - - 0 1", 3, 1829 }, + { "B6b/8/8/8/2K5/5k2/8/b6B b - - 0 1", 4, 31151 }, + { "B6b/8/8/8/2K5/5k2/8/b6B b - - 0 1", 5, 530585 }, + { "B6b/8/8/8/2K5/5k2/8/b6B b - - 0 1", 6, 9250746 }, + { "8/8/1B6/7b/7k/8/2B1b3/7K b - - 0 1", 1, 17 }, + { "8/8/1B6/7b/7k/8/2B1b3/7K b - - 0 1", 2, 309 }, + { "8/8/1B6/7b/7k/8/2B1b3/7K b - - 0 1", 3, 5133 }, + { "8/8/1B6/7b/7k/8/2B1b3/7K b - - 0 1", 4, 93603 }, + { "8/8/1B6/7b/7k/8/2B1b3/7K b - - 0 1", 5, 1591064 }, + { "8/8/1B6/7b/7k/8/2B1b3/7K b - - 0 1", 6, 29027891 }, + { "k7/B7/1B6/1B6/8/8/8/K6b b - - 0 1", 1, 7 }, + { "k7/B7/1B6/1B6/8/8/8/K6b b - - 0 1", 2, 143 }, + { "k7/B7/1B6/1B6/8/8/8/K6b b - - 0 1", 3, 1416 }, + { "k7/B7/1B6/1B6/8/8/8/K6b b - - 0 1", 4, 31787 }, + { "k7/B7/1B6/1B6/8/8/8/K6b b - - 0 1", 5, 310862 }, + { "k7/B7/1B6/1B6/8/8/8/K6b b - - 0 1", 6, 7382896 }, + { "K7/b7/1b6/1b6/8/8/8/k6B b - - 0 1", 1, 21 }, + { "K7/b7/1b6/1b6/8/8/8/k6B b - - 0 1", 2, 144 }, + { "K7/b7/1b6/1b6/8/8/8/k6B b - - 0 1", 3, 3242 }, + { "K7/b7/1b6/1b6/8/8/8/k6B b - - 0 1", 4, 32955 }, + { "K7/b7/1b6/1b6/8/8/8/k6B b - - 0 1", 5, 787524 }, + { "K7/b7/1b6/1b6/8/8/8/k6B b - - 0 1", 6, 7881673 }, + { "7k/RR6/8/8/8/8/rr6/7K w - - 0 1", 1, 19 }, + { "7k/RR6/8/8/8/8/rr6/7K w - - 0 1", 2, 275 }, + { "7k/RR6/8/8/8/8/rr6/7K w - - 0 1", 3, 5300 }, + { "7k/RR6/8/8/8/8/rr6/7K w - - 0 1", 4, 104342 }, + { "7k/RR6/8/8/8/8/rr6/7K w - - 0 1", 5, 2161211 }, + { "7k/RR6/8/8/8/8/rr6/7K w - - 0 1", 6, 44956585 }, + { "R6r/8/8/2K5/5k2/8/8/r6R w - - 0 1", 1, 36 }, + { "R6r/8/8/2K5/5k2/8/8/r6R w - - 0 1", 2, 1027 }, + { "R6r/8/8/2K5/5k2/8/8/r6R w - - 0 1", 3, 29215 }, + { "R6r/8/8/2K5/5k2/8/8/r6R w - - 0 1", 4, 771461 }, + { "R6r/8/8/2K5/5k2/8/8/r6R w - - 0 1", 5, 20506480 }, + { "R6r/8/8/2K5/5k2/8/8/r6R w - - 0 1", 6, 525169084 }, + { "7k/RR6/8/8/8/8/rr6/7K b - - 0 1", 1, 19 }, + { "7k/RR6/8/8/8/8/rr6/7K b - - 0 1", 2, 275 }, + { "7k/RR6/8/8/8/8/rr6/7K b - - 0 1", 3, 5300 }, + { "7k/RR6/8/8/8/8/rr6/7K b - - 0 1", 4, 104342 }, + { "7k/RR6/8/8/8/8/rr6/7K b - - 0 1", 5, 2161211 }, + { "7k/RR6/8/8/8/8/rr6/7K b - - 0 1", 6, 44956585 }, + { "R6r/8/8/2K5/5k2/8/8/r6R b - - 0 1", 1, 36 }, + { "R6r/8/8/2K5/5k2/8/8/r6R b - - 0 1", 2, 1027 }, + { "R6r/8/8/2K5/5k2/8/8/r6R b - - 0 1", 3, 29227 }, + { "R6r/8/8/2K5/5k2/8/8/r6R b - - 0 1", 4, 771368 }, + { "R6r/8/8/2K5/5k2/8/8/r6R b - - 0 1", 5, 20521342 }, + { "R6r/8/8/2K5/5k2/8/8/r6R b - - 0 1", 6, 524966748 }, + { "6kq/8/8/8/8/8/8/7K w - - 0 1", 1, 2 }, + { "6kq/8/8/8/8/8/8/7K w - - 0 1", 2, 36 }, + { "6kq/8/8/8/8/8/8/7K w - - 0 1", 3, 143 }, + { "6kq/8/8/8/8/8/8/7K w - - 0 1", 4, 3637 }, + { "6kq/8/8/8/8/8/8/7K w - - 0 1", 5, 14893 }, + { "6kq/8/8/8/8/8/8/7K w - - 0 1", 6, 391507 }, + { "6KQ/8/8/8/8/8/8/7k b - - 0 1", 1, 2 }, + { "6KQ/8/8/8/8/8/8/7k b - - 0 1", 2, 36 }, + { "6KQ/8/8/8/8/8/8/7k b - - 0 1", 3, 143 }, + { "6KQ/8/8/8/8/8/8/7k b - - 0 1", 4, 3637 }, + { "6KQ/8/8/8/8/8/8/7k b - - 0 1", 5, 14893 }, + { "6KQ/8/8/8/8/8/8/7k b - - 0 1", 6, 391507 }, + { "K7/8/8/3Q4/4q3/8/8/7k w - - 0 1", 1, 6 }, + { "K7/8/8/3Q4/4q3/8/8/7k w - - 0 1", 2, 35 }, + { "K7/8/8/3Q4/4q3/8/8/7k w - - 0 1", 3, 495 }, + { "K7/8/8/3Q4/4q3/8/8/7k w - - 0 1", 4, 8349 }, + { "K7/8/8/3Q4/4q3/8/8/7k w - - 0 1", 5, 166741 }, + { "K7/8/8/3Q4/4q3/8/8/7k w - - 0 1", 6, 3370175 }, + { "6qk/8/8/8/8/8/8/7K b - - 0 1", 1, 22 }, + { "6qk/8/8/8/8/8/8/7K b - - 0 1", 2, 43 }, + { "6qk/8/8/8/8/8/8/7K b - - 0 1", 3, 1015 }, + { "6qk/8/8/8/8/8/8/7K b - - 0 1", 4, 4167 }, + { "6qk/8/8/8/8/8/8/7K b - - 0 1", 5, 105749 }, + { "6qk/8/8/8/8/8/8/7K b - - 0 1", 6, 419369 }, + { "6KQ/8/8/8/8/8/8/7k b - - 0 1", 1, 2 }, + { "6KQ/8/8/8/8/8/8/7k b - - 0 1", 2, 36 }, + { "6KQ/8/8/8/8/8/8/7k b - - 0 1", 3, 143 }, + { "6KQ/8/8/8/8/8/8/7k b - - 0 1", 4, 3637 }, + { "6KQ/8/8/8/8/8/8/7k b - - 0 1", 5, 14893 }, + { "6KQ/8/8/8/8/8/8/7k b - - 0 1", 6, 391507 }, + { "K7/8/8/3Q4/4q3/8/8/7k b - - 0 1", 1, 6 }, + { "K7/8/8/3Q4/4q3/8/8/7k b - - 0 1", 2, 35 }, + { "K7/8/8/3Q4/4q3/8/8/7k b - - 0 1", 3, 495 }, + { "K7/8/8/3Q4/4q3/8/8/7k b - - 0 1", 4, 8349 }, + { "K7/8/8/3Q4/4q3/8/8/7k b - - 0 1", 5, 166741 }, + { "K7/8/8/3Q4/4q3/8/8/7k b - - 0 1", 6, 3370175 }, + { "8/8/8/8/8/K7/P7/k7 w - - 0 1", 1, 3 }, + { "8/8/8/8/8/K7/P7/k7 w - - 0 1", 2, 7 }, + { "8/8/8/8/8/K7/P7/k7 w - - 0 1", 3, 43 }, + { "8/8/8/8/8/K7/P7/k7 w - - 0 1", 4, 199 }, + { "8/8/8/8/8/K7/P7/k7 w - - 0 1", 5, 1347 }, + { "8/8/8/8/8/K7/P7/k7 w - - 0 1", 6, 6249 }, + { "8/8/8/8/8/7K/7P/7k w - - 0 1", 1, 3 }, + { "8/8/8/8/8/7K/7P/7k w - - 0 1", 2, 7 }, + { "8/8/8/8/8/7K/7P/7k w - - 0 1", 3, 43 }, + { "8/8/8/8/8/7K/7P/7k w - - 0 1", 4, 199 }, + { "8/8/8/8/8/7K/7P/7k w - - 0 1", 5, 1347 }, + { "8/8/8/8/8/7K/7P/7k w - - 0 1", 6, 6249 }, + { "K7/p7/k7/8/8/8/8/8 w - - 0 1", 1, 1 }, + { "K7/p7/k7/8/8/8/8/8 w - - 0 1", 2, 3 }, + { "K7/p7/k7/8/8/8/8/8 w - - 0 1", 3, 12 }, + { "K7/p7/k7/8/8/8/8/8 w - - 0 1", 4, 80 }, + { "K7/p7/k7/8/8/8/8/8 w - - 0 1", 5, 342 }, + { "K7/p7/k7/8/8/8/8/8 w - - 0 1", 6, 2343 }, + { "7K/7p/7k/8/8/8/8/8 w - - 0 1", 1, 1 }, + { "7K/7p/7k/8/8/8/8/8 w - - 0 1", 2, 3 }, + { "7K/7p/7k/8/8/8/8/8 w - - 0 1", 3, 12 }, + { "7K/7p/7k/8/8/8/8/8 w - - 0 1", 4, 80 }, + { "7K/7p/7k/8/8/8/8/8 w - - 0 1", 5, 342 }, + { "7K/7p/7k/8/8/8/8/8 w - - 0 1", 6, 2343 }, + { "8/2k1p3/3pP3/3P2K1/8/8/8/8 w - - 0 1", 1, 7 }, + { "8/2k1p3/3pP3/3P2K1/8/8/8/8 w - - 0 1", 2, 35 }, + { "8/2k1p3/3pP3/3P2K1/8/8/8/8 w - - 0 1", 3, 210 }, + { "8/2k1p3/3pP3/3P2K1/8/8/8/8 w - - 0 1", 4, 1091 }, + { "8/2k1p3/3pP3/3P2K1/8/8/8/8 w - - 0 1", 5, 7028 }, + { "8/2k1p3/3pP3/3P2K1/8/8/8/8 w - - 0 1", 6, 34834 }, + { "8/8/8/8/8/K7/P7/k7 b - - 0 1", 1, 1 }, + { "8/8/8/8/8/K7/P7/k7 b - - 0 1", 2, 3 }, + { "8/8/8/8/8/K7/P7/k7 b - - 0 1", 3, 12 }, + { "8/8/8/8/8/K7/P7/k7 b - - 0 1", 4, 80 }, + { "8/8/8/8/8/K7/P7/k7 b - - 0 1", 5, 342 }, + { "8/8/8/8/8/K7/P7/k7 b - - 0 1", 6, 2343 }, + { "8/8/8/8/8/7K/7P/7k b - - 0 1", 1, 1 }, + { "8/8/8/8/8/7K/7P/7k b - - 0 1", 2, 3 }, + { "8/8/8/8/8/7K/7P/7k b - - 0 1", 3, 12 }, + { "8/8/8/8/8/7K/7P/7k b - - 0 1", 4, 80 }, + { "8/8/8/8/8/7K/7P/7k b - - 0 1", 5, 342 }, + { "8/8/8/8/8/7K/7P/7k b - - 0 1", 6, 2343 }, + { "K7/p7/k7/8/8/8/8/8 b - - 0 1", 1, 3 }, + { "K7/p7/k7/8/8/8/8/8 b - - 0 1", 2, 7 }, + { "K7/p7/k7/8/8/8/8/8 b - - 0 1", 3, 43 }, + { "K7/p7/k7/8/8/8/8/8 b - - 0 1", 4, 199 }, + { "K7/p7/k7/8/8/8/8/8 b - - 0 1", 5, 1347 }, + { "K7/p7/k7/8/8/8/8/8 b - - 0 1", 6, 6249 }, + { "7K/7p/7k/8/8/8/8/8 b - - 0 1", 1, 3 }, + { "7K/7p/7k/8/8/8/8/8 b - - 0 1", 2, 7 }, + { "7K/7p/7k/8/8/8/8/8 b - - 0 1", 3, 43 }, + { "7K/7p/7k/8/8/8/8/8 b - - 0 1", 4, 199 }, + { "7K/7p/7k/8/8/8/8/8 b - - 0 1", 5, 1347 }, + { "7K/7p/7k/8/8/8/8/8 b - - 0 1", 6, 6249 }, + { "8/2k1p3/3pP3/3P2K1/8/8/8/8 b - - 0 1", 1, 5 }, + { "8/2k1p3/3pP3/3P2K1/8/8/8/8 b - - 0 1", 2, 35 }, + { "8/2k1p3/3pP3/3P2K1/8/8/8/8 b - - 0 1", 3, 182 }, + { "8/2k1p3/3pP3/3P2K1/8/8/8/8 b - - 0 1", 4, 1091 }, + { "8/2k1p3/3pP3/3P2K1/8/8/8/8 b - - 0 1", 5, 5408 }, + { "8/2k1p3/3pP3/3P2K1/8/8/8/8 b - - 0 1", 6, 34822 }, + { "8/8/8/8/8/4k3/4P3/4K3 w - - 0 1", 1, 2 }, + { "8/8/8/8/8/4k3/4P3/4K3 w - - 0 1", 2, 8 }, + { "8/8/8/8/8/4k3/4P3/4K3 w - - 0 1", 3, 44 }, + { "8/8/8/8/8/4k3/4P3/4K3 w - - 0 1", 4, 282 }, + { "8/8/8/8/8/4k3/4P3/4K3 w - - 0 1", 5, 1814 }, + { "8/8/8/8/8/4k3/4P3/4K3 w - - 0 1", 6, 11848 }, + { "4k3/4p3/4K3/8/8/8/8/8 b - - 0 1", 1, 2 }, + { "4k3/4p3/4K3/8/8/8/8/8 b - - 0 1", 2, 8 }, + { "4k3/4p3/4K3/8/8/8/8/8 b - - 0 1", 3, 44 }, + { "4k3/4p3/4K3/8/8/8/8/8 b - - 0 1", 4, 282 }, + { "4k3/4p3/4K3/8/8/8/8/8 b - - 0 1", 5, 1814 }, + { "4k3/4p3/4K3/8/8/8/8/8 b - - 0 1", 6, 11848 }, + { "8/8/7k/7p/7P/7K/8/8 w - - 0 1", 1, 3 }, + { "8/8/7k/7p/7P/7K/8/8 w - - 0 1", 2, 9 }, + { "8/8/7k/7p/7P/7K/8/8 w - - 0 1", 3, 57 }, + { "8/8/7k/7p/7P/7K/8/8 w - - 0 1", 4, 360 }, + { "8/8/7k/7p/7P/7K/8/8 w - - 0 1", 5, 1969 }, + { "8/8/7k/7p/7P/7K/8/8 w - - 0 1", 6, 10724 }, + { "8/8/k7/p7/P7/K7/8/8 w - - 0 1", 1, 3 }, + { "8/8/k7/p7/P7/K7/8/8 w - - 0 1", 2, 9 }, + { "8/8/k7/p7/P7/K7/8/8 w - - 0 1", 3, 57 }, + { "8/8/k7/p7/P7/K7/8/8 w - - 0 1", 4, 360 }, + { "8/8/k7/p7/P7/K7/8/8 w - - 0 1", 5, 1969 }, + { "8/8/k7/p7/P7/K7/8/8 w - - 0 1", 6, 10724 }, + { "8/8/3k4/3p4/3P4/3K4/8/8 w - - 0 1", 1, 5 }, + { "8/8/3k4/3p4/3P4/3K4/8/8 w - - 0 1", 2, 25 }, + { "8/8/3k4/3p4/3P4/3K4/8/8 w - - 0 1", 3, 180 }, + { "8/8/3k4/3p4/3P4/3K4/8/8 w - - 0 1", 4, 1294 }, + { "8/8/3k4/3p4/3P4/3K4/8/8 w - - 0 1", 5, 8296 }, + { "8/8/3k4/3p4/3P4/3K4/8/8 w - - 0 1", 6, 53138 }, + { "8/3k4/3p4/8/3P4/3K4/8/8 w - - 0 1", 1, 8 }, + { "8/3k4/3p4/8/3P4/3K4/8/8 w - - 0 1", 2, 61 }, + { "8/3k4/3p4/8/3P4/3K4/8/8 w - - 0 1", 3, 483 }, + { "8/3k4/3p4/8/3P4/3K4/8/8 w - - 0 1", 4, 3213 }, + { "8/3k4/3p4/8/3P4/3K4/8/8 w - - 0 1", 5, 23599 }, + { "8/3k4/3p4/8/3P4/3K4/8/8 w - - 0 1", 6, 157093 }, + { "8/8/3k4/3p4/8/3P4/3K4/8 w - - 0 1", 1, 8 }, + { "8/8/3k4/3p4/8/3P4/3K4/8 w - - 0 1", 2, 61 }, + { "8/8/3k4/3p4/8/3P4/3K4/8 w - - 0 1", 3, 411 }, + { "8/8/3k4/3p4/8/3P4/3K4/8 w - - 0 1", 4, 3213 }, + { "8/8/3k4/3p4/8/3P4/3K4/8 w - - 0 1", 5, 21637 }, + { "8/8/3k4/3p4/8/3P4/3K4/8 w - - 0 1", 6, 158065 }, + { "k7/8/3p4/8/3P4/8/8/7K w - - 0 1", 1, 4 }, + { "k7/8/3p4/8/3P4/8/8/7K w - - 0 1", 2, 15 }, + { "k7/8/3p4/8/3P4/8/8/7K w - - 0 1", 3, 90 }, + { "k7/8/3p4/8/3P4/8/8/7K w - - 0 1", 4, 534 }, + { "k7/8/3p4/8/3P4/8/8/7K w - - 0 1", 5, 3450 }, + { "k7/8/3p4/8/3P4/8/8/7K w - - 0 1", 6, 20960 }, + { "8/8/7k/7p/7P/7K/8/8 b - - 0 1", 1, 3 }, + { "8/8/7k/7p/7P/7K/8/8 b - - 0 1", 2, 9 }, + { "8/8/7k/7p/7P/7K/8/8 b - - 0 1", 3, 57 }, + { "8/8/7k/7p/7P/7K/8/8 b - - 0 1", 4, 360 }, + { "8/8/7k/7p/7P/7K/8/8 b - - 0 1", 5, 1969 }, + { "8/8/7k/7p/7P/7K/8/8 b - - 0 1", 6, 10724 }, + { "8/8/k7/p7/P7/K7/8/8 b - - 0 1", 1, 3 }, + { "8/8/k7/p7/P7/K7/8/8 b - - 0 1", 2, 9 }, + { "8/8/k7/p7/P7/K7/8/8 b - - 0 1", 3, 57 }, + { "8/8/k7/p7/P7/K7/8/8 b - - 0 1", 4, 360 }, + { "8/8/k7/p7/P7/K7/8/8 b - - 0 1", 5, 1969 }, + { "8/8/k7/p7/P7/K7/8/8 b - - 0 1", 6, 10724 }, + { "8/8/3k4/3p4/3P4/3K4/8/8 b - - 0 1", 1, 5 }, + { "8/8/3k4/3p4/3P4/3K4/8/8 b - - 0 1", 2, 25 }, + { "8/8/3k4/3p4/3P4/3K4/8/8 b - - 0 1", 3, 180 }, + { "8/8/3k4/3p4/3P4/3K4/8/8 b - - 0 1", 4, 1294 }, + { "8/8/3k4/3p4/3P4/3K4/8/8 b - - 0 1", 5, 8296 }, + { "8/8/3k4/3p4/3P4/3K4/8/8 b - - 0 1", 6, 53138 }, + { "8/3k4/3p4/8/3P4/3K4/8/8 b - - 0 1", 1, 8 }, + { "8/3k4/3p4/8/3P4/3K4/8/8 b - - 0 1", 2, 61 }, + { "8/3k4/3p4/8/3P4/3K4/8/8 b - - 0 1", 3, 411 }, + { "8/3k4/3p4/8/3P4/3K4/8/8 b - - 0 1", 4, 3213 }, + { "8/3k4/3p4/8/3P4/3K4/8/8 b - - 0 1", 5, 21637 }, + { "8/3k4/3p4/8/3P4/3K4/8/8 b - - 0 1", 6, 158065 }, + { "8/8/3k4/3p4/8/3P4/3K4/8 b - - 0 1", 1, 8 }, + { "8/8/3k4/3p4/8/3P4/3K4/8 b - - 0 1", 2, 61 }, + { "8/8/3k4/3p4/8/3P4/3K4/8 b - - 0 1", 3, 483 }, + { "8/8/3k4/3p4/8/3P4/3K4/8 b - - 0 1", 4, 3213 }, + { "8/8/3k4/3p4/8/3P4/3K4/8 b - - 0 1", 5, 23599 }, + { "8/8/3k4/3p4/8/3P4/3K4/8 b - - 0 1", 6, 157093 }, + { "k7/8/3p4/8/3P4/8/8/7K b - - 0 1", 1, 4 }, + { "k7/8/3p4/8/3P4/8/8/7K b - - 0 1", 2, 15 }, + { "k7/8/3p4/8/3P4/8/8/7K b - - 0 1", 3, 89 }, + { "k7/8/3p4/8/3P4/8/8/7K b - - 0 1", 4, 537 }, + { "k7/8/3p4/8/3P4/8/8/7K b - - 0 1", 5, 3309 }, + { "k7/8/3p4/8/3P4/8/8/7K b - - 0 1", 6, 21104 }, + { "7k/3p4/8/8/3P4/8/8/K7 w - - 0 1", 1, 4 }, + { "7k/3p4/8/8/3P4/8/8/K7 w - - 0 1", 2, 19 }, + { "7k/3p4/8/8/3P4/8/8/K7 w - - 0 1", 3, 117 }, + { "7k/3p4/8/8/3P4/8/8/K7 w - - 0 1", 4, 720 }, + { "7k/3p4/8/8/3P4/8/8/K7 w - - 0 1", 5, 4661 }, + { "7k/3p4/8/8/3P4/8/8/K7 w - - 0 1", 6, 32191 }, + { "7k/8/8/3p4/8/8/3P4/K7 w - - 0 1", 1, 5 }, + { "7k/8/8/3p4/8/8/3P4/K7 w - - 0 1", 2, 19 }, + { "7k/8/8/3p4/8/8/3P4/K7 w - - 0 1", 3, 116 }, + { "7k/8/8/3p4/8/8/3P4/K7 w - - 0 1", 4, 716 }, + { "7k/8/8/3p4/8/8/3P4/K7 w - - 0 1", 5, 4786 }, + { "7k/8/8/3p4/8/8/3P4/K7 w - - 0 1", 6, 30980 }, + { "k7/8/8/7p/6P1/8/8/K7 w - - 0 1", 1, 5 }, + { "k7/8/8/7p/6P1/8/8/K7 w - - 0 1", 2, 22 }, + { "k7/8/8/7p/6P1/8/8/K7 w - - 0 1", 3, 139 }, + { "k7/8/8/7p/6P1/8/8/K7 w - - 0 1", 4, 877 }, + { "k7/8/8/7p/6P1/8/8/K7 w - - 0 1", 5, 6112 }, + { "k7/8/8/7p/6P1/8/8/K7 w - - 0 1", 6, 41874 }, + { "k7/8/7p/8/8/6P1/8/K7 w - - 0 1", 1, 4 }, + { "k7/8/7p/8/8/6P1/8/K7 w - - 0 1", 2, 16 }, + { "k7/8/7p/8/8/6P1/8/K7 w - - 0 1", 3, 101 }, + { "k7/8/7p/8/8/6P1/8/K7 w - - 0 1", 4, 637 }, + { "k7/8/7p/8/8/6P1/8/K7 w - - 0 1", 5, 4354 }, + { "k7/8/7p/8/8/6P1/8/K7 w - - 0 1", 6, 29679 }, + { "k7/8/8/6p1/7P/8/8/K7 w - - 0 1", 1, 5 }, + { "k7/8/8/6p1/7P/8/8/K7 w - - 0 1", 2, 22 }, + { "k7/8/8/6p1/7P/8/8/K7 w - - 0 1", 3, 139 }, + { "k7/8/8/6p1/7P/8/8/K7 w - - 0 1", 4, 877 }, + { "k7/8/8/6p1/7P/8/8/K7 w - - 0 1", 5, 6112 }, + { "k7/8/8/6p1/7P/8/8/K7 w - - 0 1", 6, 41874 }, + { "k7/8/6p1/8/8/7P/8/K7 w - - 0 1", 1, 4 }, + { "k7/8/6p1/8/8/7P/8/K7 w - - 0 1", 2, 16 }, + { "k7/8/6p1/8/8/7P/8/K7 w - - 0 1", 3, 101 }, + { "k7/8/6p1/8/8/7P/8/K7 w - - 0 1", 4, 637 }, + { "k7/8/6p1/8/8/7P/8/K7 w - - 0 1", 5, 4354 }, + { "k7/8/6p1/8/8/7P/8/K7 w - - 0 1", 6, 29679 }, + { "k7/8/8/3p4/4p3/8/8/7K w - - 0 1", 1, 3 }, + { "k7/8/8/3p4/4p3/8/8/7K w - - 0 1", 2, 15 }, + { "k7/8/8/3p4/4p3/8/8/7K w - - 0 1", 3, 84 }, + { "k7/8/8/3p4/4p3/8/8/7K w - - 0 1", 4, 573 }, + { "k7/8/8/3p4/4p3/8/8/7K w - - 0 1", 5, 3013 }, + { "k7/8/8/3p4/4p3/8/8/7K w - - 0 1", 6, 22886 }, + { "k7/8/3p4/8/8/4P3/8/7K w - - 0 1", 1, 4 }, + { "k7/8/3p4/8/8/4P3/8/7K w - - 0 1", 2, 16 }, + { "k7/8/3p4/8/8/4P3/8/7K w - - 0 1", 3, 101 }, + { "k7/8/3p4/8/8/4P3/8/7K w - - 0 1", 4, 637 }, + { "k7/8/3p4/8/8/4P3/8/7K w - - 0 1", 5, 4271 }, + { "k7/8/3p4/8/8/4P3/8/7K w - - 0 1", 6, 28662 }, + { "7k/3p4/8/8/3P4/8/8/K7 b - - 0 1", 1, 5 }, + { "7k/3p4/8/8/3P4/8/8/K7 b - - 0 1", 2, 19 }, + { "7k/3p4/8/8/3P4/8/8/K7 b - - 0 1", 3, 117 }, + { "7k/3p4/8/8/3P4/8/8/K7 b - - 0 1", 4, 720 }, + { "7k/3p4/8/8/3P4/8/8/K7 b - - 0 1", 5, 5014 }, + { "7k/3p4/8/8/3P4/8/8/K7 b - - 0 1", 6, 32167 }, + { "7k/8/8/3p4/8/8/3P4/K7 b - - 0 1", 1, 4 }, + { "7k/8/8/3p4/8/8/3P4/K7 b - - 0 1", 2, 19 }, + { "7k/8/8/3p4/8/8/3P4/K7 b - - 0 1", 3, 117 }, + { "7k/8/8/3p4/8/8/3P4/K7 b - - 0 1", 4, 712 }, + { "7k/8/8/3p4/8/8/3P4/K7 b - - 0 1", 5, 4658 }, + { "7k/8/8/3p4/8/8/3P4/K7 b - - 0 1", 6, 30749 }, + { "k7/8/8/7p/6P1/8/8/K7 b - - 0 1", 1, 5 }, + { "k7/8/8/7p/6P1/8/8/K7 b - - 0 1", 2, 22 }, + { "k7/8/8/7p/6P1/8/8/K7 b - - 0 1", 3, 139 }, + { "k7/8/8/7p/6P1/8/8/K7 b - - 0 1", 4, 877 }, + { "k7/8/8/7p/6P1/8/8/K7 b - - 0 1", 5, 6112 }, + { "k7/8/8/7p/6P1/8/8/K7 b - - 0 1", 6, 41874 }, + { "k7/8/7p/8/8/6P1/8/K7 b - - 0 1", 1, 4 }, + { "k7/8/7p/8/8/6P1/8/K7 b - - 0 1", 2, 16 }, + { "k7/8/7p/8/8/6P1/8/K7 b - - 0 1", 3, 101 }, + { "k7/8/7p/8/8/6P1/8/K7 b - - 0 1", 4, 637 }, + { "k7/8/7p/8/8/6P1/8/K7 b - - 0 1", 5, 4354 }, + { "k7/8/7p/8/8/6P1/8/K7 b - - 0 1", 6, 29679 }, + { "k7/8/8/6p1/7P/8/8/K7 b - - 0 1", 1, 5 }, + { "k7/8/8/6p1/7P/8/8/K7 b - - 0 1", 2, 22 }, + { "k7/8/8/6p1/7P/8/8/K7 b - - 0 1", 3, 139 }, + { "k7/8/8/6p1/7P/8/8/K7 b - - 0 1", 4, 877 }, + { "k7/8/8/6p1/7P/8/8/K7 b - - 0 1", 5, 6112 }, + { "k7/8/8/6p1/7P/8/8/K7 b - - 0 1", 6, 41874 }, + { "k7/8/6p1/8/8/7P/8/K7 b - - 0 1", 1, 4 }, + { "k7/8/6p1/8/8/7P/8/K7 b - - 0 1", 2, 16 }, + { "k7/8/6p1/8/8/7P/8/K7 b - - 0 1", 3, 101 }, + { "k7/8/6p1/8/8/7P/8/K7 b - - 0 1", 4, 637 }, + { "k7/8/6p1/8/8/7P/8/K7 b - - 0 1", 5, 4354 }, + { "k7/8/6p1/8/8/7P/8/K7 b - - 0 1", 6, 29679 }, + { "k7/8/8/3p4/4p3/8/8/7K b - - 0 1", 1, 5 }, + { "k7/8/8/3p4/4p3/8/8/7K b - - 0 1", 2, 15 }, + { "k7/8/8/3p4/4p3/8/8/7K b - - 0 1", 3, 102 }, + { "k7/8/8/3p4/4p3/8/8/7K b - - 0 1", 4, 569 }, + { "k7/8/8/3p4/4p3/8/8/7K b - - 0 1", 5, 4337 }, + { "k7/8/8/3p4/4p3/8/8/7K b - - 0 1", 6, 22579 }, + { "k7/8/3p4/8/8/4P3/8/7K b - - 0 1", 1, 4 }, + { "k7/8/3p4/8/8/4P3/8/7K b - - 0 1", 2, 16 }, + { "k7/8/3p4/8/8/4P3/8/7K b - - 0 1", 3, 101 }, + { "k7/8/3p4/8/8/4P3/8/7K b - - 0 1", 4, 637 }, + { "k7/8/3p4/8/8/4P3/8/7K b - - 0 1", 5, 4271 }, + { "k7/8/3p4/8/8/4P3/8/7K b - - 0 1", 6, 28662 }, + { "7k/8/8/p7/1P6/8/8/7K w - - 0 1", 1, 5 }, + { "7k/8/8/p7/1P6/8/8/7K w - - 0 1", 2, 22 }, + { "7k/8/8/p7/1P6/8/8/7K w - - 0 1", 3, 139 }, + { "7k/8/8/p7/1P6/8/8/7K w - - 0 1", 4, 877 }, + { "7k/8/8/p7/1P6/8/8/7K w - - 0 1", 5, 6112 }, + { "7k/8/8/p7/1P6/8/8/7K w - - 0 1", 6, 41874 }, + { "7k/8/p7/8/8/1P6/8/7K w - - 0 1", 1, 4 }, + { "7k/8/p7/8/8/1P6/8/7K w - - 0 1", 2, 16 }, + { "7k/8/p7/8/8/1P6/8/7K w - - 0 1", 3, 101 }, + { "7k/8/p7/8/8/1P6/8/7K w - - 0 1", 4, 637 }, + { "7k/8/p7/8/8/1P6/8/7K w - - 0 1", 5, 4354 }, + { "7k/8/p7/8/8/1P6/8/7K w - - 0 1", 6, 29679 }, + { "7k/8/8/1p6/P7/8/8/7K w - - 0 1", 1, 5 }, + { "7k/8/8/1p6/P7/8/8/7K w - - 0 1", 2, 22 }, + { "7k/8/8/1p6/P7/8/8/7K w - - 0 1", 3, 139 }, + { "7k/8/8/1p6/P7/8/8/7K w - - 0 1", 4, 877 }, + { "7k/8/8/1p6/P7/8/8/7K w - - 0 1", 5, 6112 }, + { "7k/8/8/1p6/P7/8/8/7K w - - 0 1", 6, 41874 }, + { "7k/8/1p6/8/8/P7/8/7K w - - 0 1", 1, 4 }, + { "7k/8/1p6/8/8/P7/8/7K w - - 0 1", 2, 16 }, + { "7k/8/1p6/8/8/P7/8/7K w - - 0 1", 3, 101 }, + { "7k/8/1p6/8/8/P7/8/7K w - - 0 1", 4, 637 }, + { "7k/8/1p6/8/8/P7/8/7K w - - 0 1", 5, 4354 }, + { "7k/8/1p6/8/8/P7/8/7K w - - 0 1", 6, 29679 }, + { "k7/7p/8/8/8/8/6P1/K7 w - - 0 1", 1, 5 }, + { "k7/7p/8/8/8/8/6P1/K7 w - - 0 1", 2, 25 }, + { "k7/7p/8/8/8/8/6P1/K7 w - - 0 1", 3, 161 }, + { "k7/7p/8/8/8/8/6P1/K7 w - - 0 1", 4, 1035 }, + { "k7/7p/8/8/8/8/6P1/K7 w - - 0 1", 5, 7574 }, + { "k7/7p/8/8/8/8/6P1/K7 w - - 0 1", 6, 55338 }, + { "k7/6p1/8/8/8/8/7P/K7 w - - 0 1", 1, 5 }, + { "k7/6p1/8/8/8/8/7P/K7 w - - 0 1", 2, 25 }, + { "k7/6p1/8/8/8/8/7P/K7 w - - 0 1", 3, 161 }, + { "k7/6p1/8/8/8/8/7P/K7 w - - 0 1", 4, 1035 }, + { "k7/6p1/8/8/8/8/7P/K7 w - - 0 1", 5, 7574 }, + { "k7/6p1/8/8/8/8/7P/K7 w - - 0 1", 6, 55338 }, + { "3k4/3pp3/8/8/8/8/3PP3/3K4 w - - 0 1", 1, 7 }, + { "3k4/3pp3/8/8/8/8/3PP3/3K4 w - - 0 1", 2, 49 }, + { "3k4/3pp3/8/8/8/8/3PP3/3K4 w - - 0 1", 3, 378 }, + { "3k4/3pp3/8/8/8/8/3PP3/3K4 w - - 0 1", 4, 2902 }, + { "3k4/3pp3/8/8/8/8/3PP3/3K4 w - - 0 1", 5, 24122 }, + { "3k4/3pp3/8/8/8/8/3PP3/3K4 w - - 0 1", 6, 199002 }, + { "7k/8/8/p7/1P6/8/8/7K b - - 0 1", 1, 5 }, + { "7k/8/8/p7/1P6/8/8/7K b - - 0 1", 2, 22 }, + { "7k/8/8/p7/1P6/8/8/7K b - - 0 1", 3, 139 }, + { "7k/8/8/p7/1P6/8/8/7K b - - 0 1", 4, 877 }, + { "7k/8/8/p7/1P6/8/8/7K b - - 0 1", 5, 6112 }, + { "7k/8/8/p7/1P6/8/8/7K b - - 0 1", 6, 41874 }, + { "7k/8/p7/8/8/1P6/8/7K b - - 0 1", 1, 4 }, + { "7k/8/p7/8/8/1P6/8/7K b - - 0 1", 2, 16 }, + { "7k/8/p7/8/8/1P6/8/7K b - - 0 1", 3, 101 }, + { "7k/8/p7/8/8/1P6/8/7K b - - 0 1", 4, 637 }, + { "7k/8/p7/8/8/1P6/8/7K b - - 0 1", 5, 4354 }, + { "7k/8/p7/8/8/1P6/8/7K b - - 0 1", 6, 29679 }, + { "7k/8/8/1p6/P7/8/8/7K b - - 0 1", 1, 5 }, + { "7k/8/8/1p6/P7/8/8/7K b - - 0 1", 2, 22 }, + { "7k/8/8/1p6/P7/8/8/7K b - - 0 1", 3, 139 }, + { "7k/8/8/1p6/P7/8/8/7K b - - 0 1", 4, 877 }, + { "7k/8/8/1p6/P7/8/8/7K b - - 0 1", 5, 6112 }, + { "7k/8/8/1p6/P7/8/8/7K b - - 0 1", 6, 41874 }, + { "7k/8/1p6/8/8/P7/8/7K b - - 0 1", 1, 4 }, + { "7k/8/1p6/8/8/P7/8/7K b - - 0 1", 2, 16 }, + { "7k/8/1p6/8/8/P7/8/7K b - - 0 1", 3, 101 }, + { "7k/8/1p6/8/8/P7/8/7K b - - 0 1", 4, 637 }, + { "7k/8/1p6/8/8/P7/8/7K b - - 0 1", 5, 4354 }, + { "7k/8/1p6/8/8/P7/8/7K b - - 0 1", 6, 29679 }, + { "k7/7p/8/8/8/8/6P1/K7 b - - 0 1", 1, 5 }, + { "k7/7p/8/8/8/8/6P1/K7 b - - 0 1", 2, 25 }, + { "k7/7p/8/8/8/8/6P1/K7 b - - 0 1", 3, 161 }, + { "k7/7p/8/8/8/8/6P1/K7 b - - 0 1", 4, 1035 }, + { "k7/7p/8/8/8/8/6P1/K7 b - - 0 1", 5, 7574 }, + { "k7/7p/8/8/8/8/6P1/K7 b - - 0 1", 6, 55338 }, + { "k7/6p1/8/8/8/8/7P/K7 b - - 0 1", 1, 5 }, + { "k7/6p1/8/8/8/8/7P/K7 b - - 0 1", 2, 25 }, + { "k7/6p1/8/8/8/8/7P/K7 b - - 0 1", 3, 161 }, + { "k7/6p1/8/8/8/8/7P/K7 b - - 0 1", 4, 1035 }, + { "k7/6p1/8/8/8/8/7P/K7 b - - 0 1", 5, 7574 }, + { "k7/6p1/8/8/8/8/7P/K7 b - - 0 1", 6, 55338 }, + { "3k4/3pp3/8/8/8/8/3PP3/3K4 b - - 0 1", 1, 7 }, + { "3k4/3pp3/8/8/8/8/3PP3/3K4 b - - 0 1", 2, 49 }, + { "3k4/3pp3/8/8/8/8/3PP3/3K4 b - - 0 1", 3, 378 }, + { "3k4/3pp3/8/8/8/8/3PP3/3K4 b - - 0 1", 4, 2902 }, + { "3k4/3pp3/8/8/8/8/3PP3/3K4 b - - 0 1", 5, 24122 }, + { "3k4/3pp3/8/8/8/8/3PP3/3K4 b - - 0 1", 6, 199002 }, + { "8/Pk6/8/8/8/8/6Kp/8 w - - 0 1", 1, 11 }, + { "8/Pk6/8/8/8/8/6Kp/8 w - - 0 1", 2, 97 }, + { "8/Pk6/8/8/8/8/6Kp/8 w - - 0 1", 3, 887 }, + { "8/Pk6/8/8/8/8/6Kp/8 w - - 0 1", 4, 8048 }, + { "8/Pk6/8/8/8/8/6Kp/8 w - - 0 1", 5, 90606 }, + { "8/Pk6/8/8/8/8/6Kp/8 w - - 0 1", 6, 1030499 }, + { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N w - - 0 1", 1, 24 }, + { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N w - - 0 1", 2, 421 }, + { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N w - - 0 1", 3, 7421 }, + { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N w - - 0 1", 4, 124608 }, + { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N w - - 0 1", 5, 2193768 }, + { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N w - - 0 1", 6, 37665329 }, + { "8/PPPk4/8/8/8/8/4Kppp/8 w - - 0 1", 1, 18 }, + { "8/PPPk4/8/8/8/8/4Kppp/8 w - - 0 1", 2, 270 }, + { "8/PPPk4/8/8/8/8/4Kppp/8 w - - 0 1", 3, 4699 }, + { "8/PPPk4/8/8/8/8/4Kppp/8 w - - 0 1", 4, 79355 }, + { "8/PPPk4/8/8/8/8/4Kppp/8 w - - 0 1", 5, 1533145 }, + { "8/PPPk4/8/8/8/8/4Kppp/8 w - - 0 1", 6, 28859283 }, + { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N w - - 0 1", 1, 24 }, + { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N w - - 0 1", 2, 496 }, + { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N w - - 0 1", 3, 9483 }, + { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N w - - 0 1", 4, 182838 }, + { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N w - - 0 1", 5, 3605103 }, + { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N w - - 0 1", 6, 71179139 }, + { "8/Pk6/8/8/8/8/6Kp/8 b - - 0 1", 1, 11 }, + { "8/Pk6/8/8/8/8/6Kp/8 b - - 0 1", 2, 97 }, + { "8/Pk6/8/8/8/8/6Kp/8 b - - 0 1", 3, 887 }, + { "8/Pk6/8/8/8/8/6Kp/8 b - - 0 1", 4, 8048 }, + { "8/Pk6/8/8/8/8/6Kp/8 b - - 0 1", 5, 90606 }, + { "8/Pk6/8/8/8/8/6Kp/8 b - - 0 1", 6, 1030499 }, + { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N b - - 0 1", 1, 24 }, + { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N b - - 0 1", 2, 421 }, + { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N b - - 0 1", 3, 7421 }, + { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N b - - 0 1", 4, 124608 }, + { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N b - - 0 1", 5, 2193768 }, + { "n1n5/1Pk5/8/8/8/8/5Kp1/5N1N b - - 0 1", 6, 37665329 }, + { "8/PPPk4/8/8/8/8/4Kppp/8 b - - 0 1", 1, 18 }, + { "8/PPPk4/8/8/8/8/4Kppp/8 b - - 0 1", 2, 270 }, + { "8/PPPk4/8/8/8/8/4Kppp/8 b - - 0 1", 3, 4699 }, + { "8/PPPk4/8/8/8/8/4Kppp/8 b - - 0 1", 4, 79355 }, + { "8/PPPk4/8/8/8/8/4Kppp/8 b - - 0 1", 5, 1533145 }, + { "8/PPPk4/8/8/8/8/4Kppp/8 b - - 0 1", 6, 28859283 }, + { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N b - - 0 1", 1, 24 }, + { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N b - - 0 1", 2, 496 }, + { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N b - - 0 1", 3, 9483 }, + { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N b - - 0 1", 4, 182838 }, + { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N b - - 0 1", 5, 3605103 }, + { "n1n5/PPPk4/8/8/8/8/4Kppp/5N1N b - - 0 1", 6, 71179139 }, + { "6k1/2nNrq2/bb1P2NR/P2bqqN1/qpKQ3n/2Rn2B1/B1r1N3/1Q1Nb3 w - - 0 1", 5, 0 }, // checkmate + { "K7/3n3R/1r4k1/8/8/8/2p5/8 w - - 0 1", 5, 1056215 }, + { "1Qn2n1k/P1K2P2/1pr2nrP/1p2Q1b1/bPP2B2/p2B1q1N/2Rpp1pn/Q3Q1N1 w - - 0 1", 1, 2 }, + { "1Qn2n1k/P1K2P2/1pr2nrP/1p2Q1b1/bPP2B2/p2B1q1N/2Rpp1pn/Q3Q1N1 w - - 0 1", 5, 11921325 }, + { "8/7K/8/8/8/5R2/8/k7 b - - 0 1", 1, 3 }, + { "8/7K/8/8/8/5R2/8/k7 b - - 0 1", 2, 57 }, + { "8/7K/8/8/8/5R2/8/k7 b - - 0 1", 3, 261 }, + { "8/7K/8/8/8/5R2/8/k7 b - - 0 1", 4, 4897 }, + { "8/7K/8/8/8/5R2/8/k7 b - - 0 1", 5, 22176 }, + { "8/7K/8/8/8/5R2/8/k7 b - - 0 1", 6, 413723 }, + { "8/7K/8/8/8/5R2/8/k7 b - - 0 1", 7, 2109569 }, + { "8/7K/8/8/8/5R2/8/k7 b - - 0 1", 8, 39470570 }, + { "8/5K1p/r7/6q1/2p5/5qk1/8/8 w - - 0 1", 1, 1 }, + { "8/5K1p/r7/6q1/2p5/5qk1/8/8 w - - 0 1", 5, 17218 }, + { "3n2r1/2k2B1q/3B2Q1/N1n1P3/1r1R1NQ1/2brB1r1/PQB5/bK6 b - - 0 1", 1, 1 }, + { "3n2r1/2k2B1q/3B2Q1/N1n1P3/1r1R1NQ1/2brB1r1/PQB5/bK6 b - - 0 1", 5, 7037862 }, + { "4q2R/BQ1Np2k/4pn2/bK1N4/4p3/1n6/8/8 b - - 0 1", 1, 4 }, + { "4q2R/BQ1Np2k/4pn2/bK1N4/4p3/1n6/8/8 b - - 0 1", 5, 3945793 }, + { "1K6/6N1/5Q2/5p2/4Pk2/8/8/8 b - - 0 1", 1, 5 }, + { "1K6/6N1/5Q2/5p2/4Pk2/8/8/8 b - - 0 1", 5, 188155 }, + { "1K6/6N1/5Q2/5p2/4Pk2/8/8/8 b - - 0 1", 6, 5537444 }, + { "1K6/6N1/5Q2/5p2/4Pk2/8/8/8 b - - 0 1", 7, 33107724 }, + { "k2bR1B1/NR3B2/2BR4/1N1p1bN1/N3b3/7r/B2n1KN1/2Q5 w - - 0 1", 1, 64 }, + { "k2bR1B1/NR3B2/2BR4/1N1p1bN1/N3b3/7r/B2n1KN1/2Q5 w - - 0 1", 4, 2641743 }, + { "4B3/8/5K2/8/8/3k4/8/5N2 b - - 0 1", 1, 6 }, + { "4B3/8/5K2/8/8/3k4/8/5N2 b - - 0 1", 5, 71831 }, + { "4B3/8/5K2/8/8/3k4/8/5N2 b - - 0 1", 6, 1376826 }, + { "3q3B/3Q4/1k1N4/5Q2/6Q1/1B2N2Q/K4bB1/2q2N2 b - - 0 1", 1, 35 }, + { "3q3B/3Q4/1k1N4/5Q2/6Q1/1B2N2Q/K4bB1/2q2N2 b - - 0 1", 4, 5855605 }, + { "8/1K6/8/8/6n1/1k6/8/8 w - - 0 1", 1, 8 }, + { "8/1K6/8/8/6n1/1k6/8/8 w - - 0 1", 5, 50950 }, + { "8/1K6/8/8/6n1/1k6/8/8 w - - 0 1", 7, 3844295 }, + { "8/1K6/8/8/6n1/1k6/8/8 w - - 0 1", 8, 47694794 }, + { "8/5qk1/8/2Kb2r1/8/1b5r/2n5/1b6 b - - 0 1", 1, 63 }, + { "8/5qk1/8/2Kb2r1/8/1b5r/2n5/1b6 b - - 0 1", 2, 168 }, + { "8/5qk1/8/2Kb2r1/8/1b5r/2n5/1b6 b - - 0 1", 3, 10739 }, + { "8/5qk1/8/2Kb2r1/8/1b5r/2n5/1b6 b - - 0 1", 4, 28349 }, + { "8/5qk1/8/2Kb2r1/8/1b5r/2n5/1b6 b - - 0 1", 5, 1804208 }, + { "8/5qk1/8/2Kb2r1/8/1b5r/2n5/1b6 b - - 0 1", 6, 5073106 }, + { "2b5/2p5/8/8/5B1k/q7/2K5/8 w - - 0 1", 1, 13 }, + { "2b5/2p5/8/8/5B1k/q7/2K5/8 w - - 0 1", 2, 376 }, + { "2b5/2p5/8/8/5B1k/q7/2K5/8 w - - 0 1", 3, 3875 }, + { "2b5/2p5/8/8/5B1k/q7/2K5/8 w - - 0 1", 4, 112556 }, + { "2b5/2p5/8/8/5B1k/q7/2K5/8 w - - 0 1", 5, 1189238 }, + { "2K2q1q/2n4n/3qb3/1r2qq2/5n2/k4n2/r5Q1/1q6 w - - 0 1", 1, 0 }, // checkmate + { "8/1Q1pkp1Q/3ppp2/8/1Q2Q2Q/4K3/8/8 w - - 0 1", 5, 6990511 }, + { "8/3pkp2/3ppp2/8/1Q6/4K3/8/8 w - - 0 1", 5, 617665 }, + { "7k/4p3/8/2KP3r/8/8/8/8 b - - 0 1", 5, 197176 }, + { "rnbqkbnr/1p2pppp/p7/2Pp4/8/8/PPPKPPPP/RNBQ1BNR w kq d6 0 4", 1, 25 }, + { "rnbqkbnr/1p2pppp/p7/2Pp4/8/8/PPPKPPPP/RNBQ1BNR w kq d6 0 4", 2, 701 }, + { "rnbqkbnr/1p2pppp/p7/2Pp4/8/8/PPPKPPPP/RNBQ1BNR w kq d6 0 4", 3, 17762 } }; check_perfts(tests); } diff --git a/types.h b/types.h index f88af18..e2d1b91 100644 --- a/types.h +++ b/types.h @@ -179,7 +179,6 @@ ENABLE_INCR_OPERATORS_ON(PieceType) ENABLE_INCR_OPERATORS_ON(Square) ENABLE_INCR_OPERATORS_ON(File) ENABLE_INCR_OPERATORS_ON(Rank) - #undef ENABLE_INCR_OPERATORS_ON constexpr Direction operator+(Direction d1, Direction d2) { return Direction(int(d1) + int(d2)); } @@ -190,7 +189,27 @@ constexpr Square operator+(Square s, Direction d) { return Square(int(s) + int(d constexpr Square operator-(Square s, Direction d) { return Square(int(s) - int(d)); } constexpr Square &operator+=(Square &s, Direction d) { return s = s + d; } constexpr Square &operator-=(Square &s, Direction d) { return s = s - d; } -// specifically for Polyglot (a.k.a zobrist hashing but use proper hash) +constexpr Rank operator+(Rank s, Direction d) { + assert(d == EAST || d == WEST || d == DIR_NONE); + return Rank(int(s) + int(d)); +} +constexpr Rank operator-(Rank s, Direction d) { + assert(d == EAST || d == WEST || d == DIR_NONE); + return Rank(int(s) - int(d)); +} +constexpr Rank &operator+=(Rank &s, Direction d) { return s = s + d; } +constexpr Rank &operator-=(Rank &s, Direction d) { return s = s - d; } +constexpr File operator+(File s, Direction d) { + assert(d == EAST || d == WEST || d == DIR_NONE); + return File(int(s) + int(d)); +} +constexpr File operator-(File s, Direction d) { + assert(d == EAST || d == WEST || d == DIR_NONE); + return File(int(s) - int(d)); +} +constexpr File &operator+=(File &s, Direction d) { return s = s + d; } +constexpr File &operator-=(File &s, Direction d) { return s = s - d; } + enum class PolyglotPiece : uint8_t { WPAWN = 1, WKNIGHT = 3, @@ -207,7 +226,6 @@ enum class PolyglotPiece : uint8_t { NO_PIECE = 12, PIECE_NB = 12 }; -// Normal board, you can use ANY! (but comfortable for certain chess engines such as Stockfish) enum class EnginePiece : uint8_t { NO_PIECE, WPAWN = PAWN + 0, @@ -356,13 +374,12 @@ class Move { constexpr int from_to() const { return data & 0xFFF; } constexpr MoveType type_of() const { return MoveType(data & (3 << 14)); } - constexpr MoveType typeOf() const { return type_of(); } + + constexpr bool is_ok() const { return none().data != data && null().data != data; } constexpr PieceType promotion_type() const { - return static_cast(((data >> 12) & 3) + static_cast(PieceType::KNIGHT)); + return PieceType(((data >> 12) & 3) + KNIGHT); } - constexpr PieceType promotionType() const { return promotion_type(); } - constexpr bool is_ok() const { return none().data != data && null().data != data; } static constexpr Move null() { return Move(65); } static constexpr Move none() { return Move(0); }