首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打印连接4板

打印连接4板
EN

Code Review用户
提问于 2021-09-28 08:42:02
回答 1查看 392关注 0票数 2

我被要求编写一个可变大小的连接4板,其标准大小为6x7,最小大小为2x2,最大为20x20。教授说他可以写20行,最多可以写3倍。我的代码以58行的速度与之接近,令人不舒服。在不使用用户定义函数的情况下,我能做些什么来减少它呢?

代码语言:javascript
复制
r, c, p, a, std, b = 0, 0, 0, '', input('Standard game? (y/n): '), ' '
if std == 'y':
    r, c = 6, 7
else: 
    r, c = int(input('r? (2 - 20): ')), int(input('c? (2 - 20): '))
if r < 11 and c < 11:
    for i in range (r-1, -1, -1): 
        a = str(i)
        for j in range (c):
            a = a + str(' ·') #repeats the dot for j times
        print(a + ' ')
    for j in range (c):
        b = b + ' ' + str(j) #adds successive nos. to the bottom row, ie the index
    print(b + ' ')
elif r < 11 and c >= 11:
    a, b = ' ', '  '
    for i in range (r-1, -1, -1):
        a = ' ' + str(i) + ' '
        for j in range (c):
            a = a + ' ' + str('· ')
        print(a)
    for j in range (10):
        b = b + '  ' + str(j)
    for j in range (10, c):
        b = b + ' ' + str(j)
    print(b + ' ')
elif r >= 11 and c < 11:
    b = '  '
    for i in range (r-1, 9, -1): 
        a = str(i) + ' '
        for j in range (c):
            a = a + str(' · ')
        print(a) #repeats the dot for j times for j >= 10 (i.e. no space)
    for i in range (9, -1, -1): 
        a = ' ' + str(i) + ' '
        for j in range (c):
            a = a + str(' · ')
        print(a) #repeats the dot for j times for j < 10 (space)    
    for j in range (c):
        b = b + '  ' + str(j)
    print(b + ' ')
else:
    a, b = ' ', '  '
    for i in range (r-1, 9, -1): 
        a = str(i) + ' '
        for j in range (c):
            a = a + str(' · ')
        print(a) #repeats the dot for j times for j >= 10 (i.e. no space)
    for i in range (9, -1, -1): 
        a = ' ' + str(i) + ' '
        for j in range (c):
            a = a + str(' · ')
        print(a)
    for j in range (10):
        b = b + '  ' + str(j)
    for j in range (10, c):
        b = b + ' ' + str(j)
    print(b + ' ')
EN

回答 1

Code Review用户

发布于 2021-09-28 18:14:53

我将着重于创建一个可读、可维护和可伸缩的实现。即使在不牺牲可读性的情况下(避免每行多个变量赋值),这种实现也只有15行。这个数字可以通过内联一些变量等进一步减少,但我认为这不值得在这里做。

请注意,这并不包括用户输入的正确验证,这通常是一个好主意。

完整代码

为了提高可读性,我添加了一些空行:

代码语言:javascript
复制
standard_game = input('Standard game? (y/n): ').lower() == "y"

if standard_game:
    ROWS = 6
    COLUMNS = 7
else:
    ROWS = int(input('ROWS? (2 - 20): '))
    COLUMNS = int(input('COLUMNS? (2 - 20): '))
    
width_y_axis_elements = len(str(ROWS - 1))
width_x_axis_elements = len(str(COLUMNS - 1)) + 1

dots = '·'.rjust(width_x_axis_elements) * COLUMNS

for i in range(ROWS - 1, -1, -1):
    label = str(i).rjust(width_y_axis_elements)
    print(f"{label}{dots}")
    
x_axis = ''.join(map(lambda s: s.rjust(width_x_axis_elements), map(str, range(COLUMNS))))
print(f"{' ' * width_y_axis_elements}{x_axis}")

简化这个实现的关键是认识到ROWSCOLUMNS在10以下或以上并不是真正的特例。您只需要考虑每个轴上最高数字的长度,然后相应地填充所有内容。为此,我们使用str.rjust。一旦您从概念上理解了这一点,实现就相当简单了。如果必要的话,请不要犹豫地要求澄清故事!

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/268466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档