type PartialChessboard = list[int | None]

def hsymmetry(q: PartialChessboard) -> PartialChessboard:
    n = len(q)
    return [(n-row -1) if row is not None else None for row in q]

def dsymmetry(q: PartialChessboard) -> PartialChessboard:
    n = len(q)
    new_board: PartialChessboard = [None] * n
    for i in range(n):
        if q[i] is not None:
            new_board[q[i]] = i

    return new_board

def rotate(q: PartialChessboard) -> PartialChessboard:
    '''
    >>> rotate([2, 0, 3, 1])
    [2, 0, 3, 1]
    >>> rotate([2, None, 3, 1])
    [None, 0, 3, 1]
    >>> rotate([1, 3, 5, 0, 2, 4])
    [2, 5, 1, 4, 0, 3]
    >>> rotate([1, None, None, 0, 2, 4])
    [2, 5, 1, None, 0, None]
    >>>
    '''
    return hsymmetry(dsymmetry(q))

if __name__ == '__main__':
    import doctest
    doctest.testmod()