我制作这颗钻石时遇到了麻烦。每当我使字符等于均匀长度时,结果都很好。然而,当它是奇数时,只有钻石的底部被弄乱了。我一直在工作几个小时,差不多完成了。在此先感谢您的帮助。
chars = 'ABCDEF'
length = len(chars)
string = ''
dots = (length*2 - 1)*2 - 1
for i in range(length):
string1 = ''
string += chars[i]
length1 = len(string)
for j in range(0, length1):
if j % 2 != 0:
string1 += chars[length -1 - j].center(3, '.')
else:
string1 += chars[length - 1 - j]
for k in range(i - 1, -1, -1):
if k % 2 != 0:
string1 += chars[length - 1 - k].center(3, '.')
else:
string1 += chars[length - 1 - k]
string1 = string1.center(dots, '.')
print(string1)
string=''
for i in range(length - 1):
string1 = ''
string += chars[i]
length1 = len(string)
for j in range(length - 1 - i):
if j % 2 != 0:
string1 += chars[length - 1 - j]
else:
string1 += chars[length -1 - j].center(3, '.')
for k in range(i + 2, length):
if k % 2 != 0:
string1 += chars[k].center(3, '.')
else:
string1 += chars[k]
string1 = string1.center(dots, '.')
print(string1)
当字符长度为奇数时
当字符长度均为
时
答案 0 :(得分:12)
这是python。您可以使用许多有用的字符串函数在少量代码行中创建创造性的ASCII艺术。
一些最重要的内容是str.join
,str.Xjust
。我们还会使用chr
和ord
来迭代字符范围。
首先,定义一个处理填充的函数。
def pad(c1, c2, sep='.', field_width=10):
out = sep.join(chr(x) for x in range(c2, c1, -1)).rjust(field_width, sep) # build the first part
return sep.join([out, chr(c1), out[::-1]])
第一行代码将构建钻石线的前半部分。第二行连接前半部分的中心字母,以及上半部分的反转版本。
接下来,确定范围 - 您的钻石的大小。
start = 'A'
end = ...
field_width = (ord(end) - ord('A')) * 2 - 1
现在,您需要两个独立的环 - 一个用于上部钻石,另一个用于下部钻石。两个循环在每次迭代时调用pad
。
for e in range(ord(end), ord(start), -1):
print(pad(e, ord(end), '.', field_width))
for e in range(ord(start), ord(end) + 1):
print(pad(e, ord(end), '.', field_width))
end = 'E'
:
........E........
......E.D.E......
....E.D.C.D.E....
..E.D.C.B.C.D.E..
E.D.C.B.A.B.C.D.E
..E.D.C.B.C.D.E..
....E.D.C.D.E....
......E.D.E......
........E........
end = 'F'
:
..........F..........
........F.E.F........
......F.E.D.E.F......
....F.E.D.C.D.E.F....
..F.E.D.C.B.C.D.E.F..
F.E.D.C.B.A.B.C.D.E.F
..F.E.D.C.B.C.D.E.F..
....F.E.D.C.D.E.F....
......F.E.D.E.F......
........F.E.F........
..........F..........
Seth Difley's answer探索了一种替代方法,包括建造钻石的前半部分并将其反转以获得下半部分。实际上,这种方法也可以用于这种解决方案,类似于:
lines = []
for e in range(ord(end), ord(start) - 1, -1):
lines.append(pad(e, ord(end), '.', field_width))
for x in lines + lines[-2::-1]:
print(x)
这也导致相同的输出,并且更快。
答案 1 :(得分:3)
策略:由于现有程序正确渲染钻石的上半部分,因此生成上半部分,然后通过反转上半部分的线条生成下半部分。 build_diamond
返回包含上半部分字符串的列表。 print('\n'.join(string_list))
打印上半部分。 bottom_of_diamond_string_list = list(reversed(string_list))[1:]
从上半部分反转字符串并使用[1:]
删除中间字符串以获取下半部分的字符串。 print('\n'.join(bottom_of_diamond_string_list))
打印下半部分。测试并适用于5和6(偶数和奇数)chars
长度。如果需要,可以进行更多的代码清理。
chars = 'ABCDEF'
length = len(chars)
def build_diamond(length):
dots = (length*2 - 1)*2 - 1
string = ''
string_list = []
for i in range(length):
string1 = ''
string += chars[i]
length1 = len(string)
for j in range(0, length1):
if j % 2 != 0:
string1 += chars[length -1 - j].center(3, '.')
else:
string1 += chars[length - 1 - j]
for k in range(i - 1, -1, -1):
if k % 2 != 0:
string1 += chars[length - 1 - k].center(3, '.')
else:
string1 += chars[length - 1 - k]
string1 = string1.center(dots, '.')
string_list.append(string1)
return string_list
if __name__ == '__main__':
string_list = build_diamond(length)
print('\n'.join(string_list))
bottom_of_diamond_string_list = list(reversed(string_list))[1:]
print('\n'.join(bottom_of_diamond_string_list))