"""Standard layout of fixed handicap stones.
This follows the rules from the GTP spec.
"""
[docs]def max_free_handicap_for_board_size(board_size):
    """Return the maximum number of stones for place_free_handicap command."""
    return board_size * board_size - 1 
[docs]def max_fixed_handicap_for_board_size(board_size):
    """Return the maximum number of stones for fixed_handicap command."""
    if board_size <= 7:
        return 0
    if board_size > 25:
        raise ValueError
    if board_size % 2 == 0 or board_size == 7:
        return 4
    else:
        return 9 
handicap_pattern = [
    ['00', '22'],
    ['00', '22', '20'],
    ['00', '22', '20', '02'],
    ['00', '22', '20', '02', '11'],
    ['00', '22', '20', '02', '10', '12'],
    ['00', '22', '20', '02', '10', '12', '11'],
    ['00', '22', '20', '02', '10', '12', '01', '21'],
    ['00', '22', '20', '02', '10', '12', '01', '21', '11'],
]
[docs]def handicap_points(number_of_stones, board_size):
    """Return the handicap points for a given number of stones and board size.
    Returns a list of pairs (row, col), length 'number_of_stones'.
    Raises ValueError if there isn't a placement pattern for the specified
    number of handicap stones and board size.
    """
    if number_of_stones > max_fixed_handicap_for_board_size(board_size):
        raise ValueError
    if number_of_stones < 2:
        raise ValueError
    if board_size < 13:
        altitude = 2
    else:
        altitude = 3
    pos = {'0' : altitude,
           '1' : (board_size - 1) / 2,
           '2' : board_size - altitude - 1}
    return [(pos[s[0]], pos[s[1]])
            for s in handicap_pattern[number_of_stones-2]]