利用python画钻石_使用Python制作钻石ASCII艺术

I'm having trouble making this diamond. Whenever I make chars equal to an even length, it turns out fine. However, when it is odd, only the bottom portion of the diamond gets messed up. I've been working hours on this and am almost done. Thanks in advance for the help.

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)

When char length is odd

When char length is even

解决方案

This is python. There are a multitude of useful string functions you could use to create inventive ASCII art in a handful lines of code.

Some of the most important ones would be str.join, str.Xjust. We'll also make use of chr and ord to iterate over character ranges.

First, define a function that'll handle padding.

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]])

The first line of code will build the first half of the diamond line. The second line joins the first half with the centre letter, and the reversed version of the first half.

Next, determine the range - how big your diamond is going to be.

start = 'A'

end = ...

field_width = (ord(end) - ord('A')) * 2 - 1

Now, you'll need two separate loops - one for the upper diamond and the other for the lower one. Both loops call pad at each iteration.

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 explores an alternative approach which involves building the first half of the diamond and reversing it to obtain the second half. Indeed, this approach can also be adopted to this solution, something along the lines of:

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)

Which also results in the same output, and is faster.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值