一个返回字符串的函数,该字符串类似于python中的棋盘

ercv8c1e  于 2022-12-17  发布在  Python
关注(0)|答案(2)|浏览(75)

我想写一个函数,根据输入的数字返回一个包含'*'' '的正方形棋盘。
预期输出应如下所示:

board_of_5 = (
    ' * * \n'
    '* * *\n'
    ' * * \n'
    '* * *\n'
    ' * * \n'
)
    
board_of_10 = (
    ' * * * * *\n'
    '* * * * * \n'
    ' * * * * *\n'
    '* * * * * \n'
    ' * * * * *\n'
    '* * * * * \n'
    ' * * * * *\n'
    '* * * * * \n'
    ' * * * * *\n'
    '* * * * * \n'
)

下面是我当前的代码,它在一行中产生输出,并且在交替的行中没有偏移:

def get_playing_board(num):
    string = ''
    for i in range(num):
        for j in range(num):
            if j % 2 == 0:
                string += ' '
            elif j % 2 != 0:
                string += '*'
        print(string)
    return string

get_playing_board(5)

如何引入偏移量和换行符?如何遍历行?
我的想法是根据偶数或奇数添加'*'或空格,并对每行和每列进行循环。
但是,我不能得到预期的图表板。

fdx2calv

fdx2calv1#

进入给定行和列的内容取决于行和列索引的关系。具体来说,如果两者都是偶数或奇数(具有相同的奇偶性),则元素将是' '。如果它们的奇偶性不同,则元素将是'*'
检查奇偶校验的最简单方法是使用

if (i % 2) == (j % 2):

数字的奇偶校验位编码在最后一位:1表示偶数,0表示奇数。因此,您可以使用XOR运算符检查是否相同:

if (i ^ j) & 1:

在这种情况下,& 1使用按位AND删除最后一位。
要在每一行的末尾插入一个换行符,只需在外部循环的末尾添加:

def get_playing_board(num):
    board = ''
    for i in range(num):
        for j in range(num):
            board += ' *'[(i ^ j) & 1] # The index expression is 0 or 1
        board += '\n'
    return board

get_playing_board(5)

除了手动生成每一行之外,还有一个聪明的替代方法,即生成一个比num长一个元素的字符串,并为每一行获取一个子集:

def get_playing_board(num):
    row = ' *' * ((num + 2) // 2)
    board = ''
    for i in range(num):
        board += row[i % 2:num + i % 2] + '\n'
    return board

您可以将其中一种方法编写为一行程序:

'\n'.join(''.join(' *'[(i ^ j) & 1] for j in range(num)) for i in range(num))
'\n'.join((' *' * ((num + 2) // 2))[i % 2:num + i % 2] for i in range(num))

我并不特别推荐下面两种方法。

c3frrgcw

c3frrgcw2#

您可以用途:

def get_playing_board(num):
    import math
    n = math.ceil(num/2)
    s = '* '*n
    return '\n'.join(([" "+s[:num-1], s[:num]]*n)[:num])
    
print(get_playing_board(5))

print(get_playing_board(10))

输出:

# print(get_playing_board(5))
 * * 
* * *
 * * 
* * *
 * * 

# print(get_playing_board(10))
 * * * * *
* * * * * 
 * * * * *
* * * * * 
 * * * * *
* * * * * 
 * * * * *
* * * * * 
 * * * * *
* * * * *

相关问题