ASCII Python Art#2

时间:2011-09-05 16:13:03

标签: python

您可能已经注意到我对类似任务的最后一次查询。 我试图复制这个结构:

********************
*********  *********
********    ********
*******      *******
******        ******
*****          *****
****            ****
***              ***
**                **
*                  *
**                **
***              ***
****            ****
*****          *****
******        ****** 
*******      *******
********    ********
*********  *********
********************

如果您认为它由4个三角形组成 - 我可以单独生成每个角落,然后将它们放在另一个角落之下。 我不知道如何将它们放在一个更大的构造中。 我会尝试这个吗,还是我会通过解决它来解决问题,好像是一个单独的构造并按照我对单个三角形部分进行逐行处理?我只是假设将三角形变成更大的东西可能是一条捷径。

5 个答案:

答案 0 :(得分:2)

这对我有用

w = 20
lines = []
for y in xrange(w / 2, 0, -1):
    lines.append("".join(("*" * y, " " * (w - (y * 2)), "*" * y))
lines += reversed(lines[:-1])
for l in lines:
    print l

如果您愿意,可以将其缩小:

lines = ["".join(("*" * y, " " * (w - (y * 2)), "*" * y)) for y in xrange(w / 2, 0, -1)]
print "\n".join(lines + lines[-2::-1])

输出w = 20:

********************
*********  *********
********    ********
*******      *******
******        ******
*****          *****
****            ****
***              ***
**                **
*                  *
**                **
***              ***
****            ****
*****          *****
******        ******
*******      *******
********    ********
*********  *********
********************

答案 1 :(得分:1)

我会把它视为一个不同的问题。如果您想象一个原点位于图形的中心,那么您只需要打印*,其中"Manhattan distance"到该单元格的长度大于边缘长度的一半。例如,您可以执行以下操作:

import sys

r = 5

for y in range(-r,r+1):
    for x in range(-r,r+1):
        c = ' ' if (abs(x) + abs(y)) < r else '*'
        sys.stdout.write(c)
    print

......产生这个:

***********
***** *****
****   ****
***     ***
**       **
*         *
**       **
***     ***
****   ****
***** *****
***********

答案 2 :(得分:1)

print '\n'.join('*' * (20 - i) + ' ' * (i * 2) + '*' * (20 - i) for i in range(0, 20))
print '\n'.join('*' * i + ' ' * (40 - i * 2) + '*' * i for i in range(0, 20))

http://codepad.org/Z46ldEOG

答案 3 :(得分:0)

怎么样:

W = 10

for i in range(10):
    this_str = "*"*(W-i)+" "*i
    print this_str+this_str[::-1]

for i in range(9,-1,-1):
    this_str = "*"*(W-i)+" "*i
    print this_str+this_str[::-1]

工作时的同等压力。这是一个较短的版本,以跟上我所有的同胞:

W=10
lines = ["*"*(W-i)+" "*2*i+"*"*(W-i) for i in range(W)]
print "\n".join(lines + lines[-2::-1])

答案 4 :(得分:0)

如果你的导师正在寻找简单的循环,这可能会有所帮助(即使它可能为时已晚,而且它只能用于“w”值)

w = 20  
for a in range (0,w/2):
    print((w/2-a)*"*"+2*a*" "+(w/2-a)*"*")
for a in range (2,w/2+1):
    print(a*"*"+(w-2*a)*" "+a*"*")

或者如果你想把变量“w”一起取出:

for a in range (0,10):
    print((10-a)*"*"+2*a*" "+(10-a)*"*")
for a in range (2,11):
    print(a*"*"+(20-2*a)*" "+a*"*")