Programmer Puzzle: Encoding a chess board state throughout a game

前端 未结 30 1539
闹比i
闹比i 2021-01-29 17:16

Not strictly a question, more of a puzzle...

Over the years, I\'ve been involved in a few technical interviews of new employees. Other than asking the standard \"do you

30条回答
  •  挽巷
    挽巷 (楼主)
    2021-01-29 17:42

    Storing the board state

    The simplest way I thought of is too first have a array of 8*8 bits representing the location of each piece (So 1 if there is a chess piece there and 0 if there isn't). As this is a fixed length we don't need any terminator.

    Next represent every chess piece in order of its location. Using 4 bits per piece, this takes 32*4 bits (128 in total). Which is really really wasteful.

    Using a binary tree, we can represent a pawn in one byte, a knight and rook and bishop in 3 and a king and queen in 4. As we also need to store the color of the piece, which takes an extra byte it ends up as (forgive me if this is wrong, I have never looked at Huffman coding in any detail before):

    • Pawn : 2
    • Rook: 4
    • Knight: 4
    • Bishop: 4
    • King: 5
    • Queen: 5

    Given the totals:

    2*16 + 4*4 + 4*4 + 4*4 + 2*5 + 2*5 = 100
    

    Which beats using a fixed size set of bits by 28 bits.

    So the best method I have found is to store it in a 82 + 100 bit array

    8*8 + 100 = 164
    



    Storing Moves
    The first thing we need to know with is which piece is moving to where. Given that there are at maximum 32 pieces on the board and we know what each piece is, rather than an integer representing the square, we can have an integer representing the piece offset, which means we only have to fit 32 possible values to represent a piece.

    Unfortunately there are various special rules, like castling or overthrowing the king and forming a republic (Terry Pratchett reference), so before we store the piece to move we need a single bit indicating if it is a special move or not.

    So for each normal move we have a necessary 1 + 5 = 6 bits. (1 bit type, 5 bits for the piece)

    After the piece number has been decoded, we then know the type of piece, and each piece should represent its move in the most efficient way. For example (If my chess rules are up to scratch) a pawn has a total of 4 possible moves (take left, take right, move one forward, move two forward).
    So to represent a pawn move we need '6 + 2 = 8' bits. (6 bit for initial move header, 2 bits for what move)

    Moving for the queen would be more complex, in that it would be best to have a direction (8 possible directions, so 3 bits) and a total of 8 possible squares to move to for each direction (so another 3 bits). So to represent moving a queen it would require 6 + 3 + 3 = 12 bits.

    The last thing that occurrences to me is that we need to store which players turn it is. This should be a single bit (White or black to move next)



    Resultant Format
    So the file format would look something like this

    [64 bits] Initial piece locations
    [100 bits max] Initial pieces [1 bit] Player turn
    [n bits] Moves

    Where a Move is
    [1 bit] Move type (special or normal)
    [n bits] Move Detail

    If the Move is a normal move, the Move Detail looks something like
    [5 bits] piece
    [n bits] specific piece move (usually in the range of 2 to 6 bits]

    If it is a special move
    It should have an integer type and then any additional information (like if it is castling). I cannot remember the number of special moves, so it may be OK just to indicate that it is a special move (if there is only one)

提交回复
热议问题