我被要求编写一个可变大小的连接4板,其标准大小为6x7,最小大小为2x2,最大为20x20。教授说他可以写20行,最多可以写3倍。我的代码以58行的速度与之接近,令人不舒服。在不使用用户定义函数的情况下,我能做些什么来减少它呢?
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 + ' ')发布于 2021-09-28 18:14:53
我将着重于创建一个可读、可维护和可伸缩的实现。即使在不牺牲可读性的情况下(避免每行多个变量赋值),这种实现也只有15行。这个数字可以通过内联一些变量等进一步减少,但我认为这不值得在这里做。
请注意,这并不包括用户输入的正确验证,这通常是一个好主意。
为了提高可读性,我添加了一些空行:
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}")简化这个实现的关键是认识到ROWS和COLUMNS在10以下或以上并不是真正的特例。您只需要考虑每个轴上最高数字的长度,然后相应地填充所有内容。为此,我们使用str.rjust。一旦您从概念上理解了这一点,实现就相当简单了。如果必要的话,请不要犹豫地要求澄清故事!
https://codereview.stackexchange.com/questions/268466
复制相似问题