ASCII Python Art # 2

Es posible que haya notado mi última consulta en una tarea similar. Estoy tratando de replicar esta estructura:

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

Si piensas que está compuesto por 4 triangularjs, soy capaz de producir cada una de las esquinas individualmente y luego colocarlas una debajo de la otra. Sin embargo, no sé cómo me ocuparía de juntarlos en una construcción más grande. ¿Intentaré esto, o abordaré el problema abordándolo como si fuera una construcción simple y trabajaré línea por línea como lo hice con las partes de triangularjs individuales? Simplemente asumí que los triangularjs en una cosa más grande podrían ser un atajo.

Esto funciono para mi

 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 

Podrías reducirlo más si quisieras también:

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

Salida w = 20:

 ******************** ********* ********* ******** ******** ******* ******* ****** ****** ***** ***** **** **** *** *** ** ** * * ** ** *** *** **** **** ***** ***** ****** ****** ******* ******* ******** ******** ********* ********* ******************** 
 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

Yo lo trataría como un problema diferente. Si imagina un origen en el centro de la figura, entonces solo desea imprimir un * donde la “distancia de Manhattan” a esa celda sea mayor que la mitad de la longitud del borde. Por ejemplo, podrías hacer lo siguiente:

 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 

... lo que produce esto:

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

Qué tal si:

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

La presión de los compañeros en el trabajo. Aquí hay una versión más corta para estar al día con todos mis compatriotas:

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

Si su instructor estaba buscando bucles simples, esto puede ayudar (aunque probablemente sea demasiado tarde, y solo funciona con valores de “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*"*") 

O si desea eliminar la variable “w” todos juntos:

 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*"*")