Impresión de un diamante ASCII con ancho de conjunto en python

Sí, esta es una tarea de tarea. Pero solo por favor, si me va a dar el código, por favor dígame qué ha hecho en detalle. Soy extremadamente nuevo en esto.

Por lo tanto, la tarea es imprimir un diamante ASCII según el ancho que ingrese el usuario. Puedo hacer la primera mitad del diamante, pero no la mitad inferior, por alguna razón, simplemente no puedo ver cómo hacerlo.

Aquí está mi código:

wid = int(input("Width: ")) i = 1 while i <= wid: print(" " * (wid - i) + "* " * i) i = i + 1 

Lo que dará como resultado lo siguiente si wid = 5:

 Width: 5 * * * * * * * * * * * * * * * 

Intenté explicar el código con comentarios. Espero que ayude.

 wid = int(input("Width: ")) #no. of lines will be double the width #each loop prints a line. for i in range(wid *2): #first half of the diamond if i<=wid: no_of_spaces = wid - i no_of_stars = i print(" "*no_of_spaces + "* "*no_of_stars) #next half of the diamond else: no_of_spaces = i - wid no_of_stars = 2*wid - i print(" "*no_of_spaces + "* "*no_of_stars) 
  i=1 j=input("ENTER NO =") l=0 for i in range(i,j-((j/2)-1),1): print (' ' * ((j+1)/2-i)+'*' *(i*2-1)) l=(j/2+1) while (i==l): i=1 for i in range(i,j,1): print (' ' *((i*2)-i)+'*' *(ji*2)) if [i==j-1]: l=raw_input('') 

Comienzas con i = 1 y vas hasta i > wid para hacer la parte superior. Para hacer la parte inferior del diamante, debes hacer lo contrario de lo que hiciste para la parte superior. El código es fácil, pero no lo escribiré a menos que usted quiera que lo haga.

después de tu tiempo

 i=i-2 while i>0: print(" "*(wid-i)+"* "*i) i=i-1; 

Un metodo

La forma más sencilla probablemente sería tener dos bucles; una cuenta i hasta el width , otra cuenta i vuelve a 1 .

 width = int(input("Width: ")) i = 1 while i < width: print " " * (width-i) + "* " * i i += 1 while i > 0: print " " * (width-i) + "* " * i i -= 1 

Esto es un poco poco atractivo porque es un poco torpe, pero es simple.


Otro método

Otro método es tener un bucle que cuente hasta el doble de ancho, haciendo una de dos cosas. Lo que hace depende de si he pasado el punto de ancho máximo o no. Así que hace ‘arriba’ y ‘abajo’ en el mismo bucle, contando i desde 1 hasta width*2 .

 width = int(input("Width: ")) i = 1 while i < width*2: if i < width: print " " * (width-i) + "* " * i else: print " " * (i-width) + "* " * (2*width-i) i += 1 

Esta:

  print " " * (width-i) + "* " * i 

... es tu código. Los espacios cuentan desde width hasta 0 , * 's desde 1 hasta width .

Y esto:

  print " " * (i-width) + "* " * (2*width-i) 

... es lo mismo pero invertido. Los espacios cuentan desde 0 hasta width , y los * 's retroceden desde width hasta 1 . Esto entra en juego cuando excedo el width .

 Width: 4 * # first half does this onward * * * * * * * * * * * * # second half does the rest downward * * * 

Y otro

Otra alternativa, una forma más compleja es usar un bucle for en una lista que contiene números que cuentan hacia arriba y hacia abajo. Por ejemplo: [1, 2, 3, 2, 1]

Para hacer esta lista, este código tiene que ser. Lo sé, es un poco feo:

 rows = [] for i in range(1, max+1): rows.append(i) rows += rows[-2::-1] 

Entonces, verás, ejecutamos el bucle for fuera de él.

 width = int(input("Width: ")) rows = [] for i in range(1, width+1): rows.append(i) rows += rows[-2::-1] # takes a reversed list and adds it on to the end: [1, 2, 3, 2, 1] for i in rows: print " " * (width-i) + "* " * i 

i itera a través de cada uno de los números en la lista de rows , que se parece a algo como [1, 2, 3, 2, 1] . Entonces solo necesitamos un gizmo de impresión.

En Python, casi siempre hay una forma más corta y menos comprensible de hacer bucles, y en este caso, podemos eliminar dos líneas adicionales acortando la primera curva:

 width = int(input("Width: ")) rows = [ i for i in range(1, width+1)] # Brain-bending way of doing a for loop rows += rows[-2::-1] for i in rows: print " " * (width-i) + "* " * i 

Y si te sientes un poco loco, aquí tienes una versión de dos líneas de todo esto.

 width = int(input("Width: ")) print "\n".join([ " "*(width-i) + "* "*i for i in [ i for i in range(1, width+1) ]+[ i for i in range(1, width+1) ][-2::-1] ]) 

Pero no recomiendo este estilo de encoding en general.


Lo siento, me dejé llevar un poco al final ... ¡pero lo mejor que puedo decirte ahora es que intentes todo y juegues!

Espero que ayude. 🙂

Ya que se han abordado algunos buenos métodos, aquí hay algunas pequeñas y divertidas soluciones piratas.

Aquí hay uno que usa Python 2.7 string.center solo para cagadas.

 import string width = int(raw_input("Width:")) for i in range(width): print string.center(i * " *", width * 2 ) for i in range(width,0,-1): print string.center(i * " *", width * 2 ) 

Y aquí hay una indignante que sale usando HTML para centrar.

 file = open('file.html','w') file.write("
") for i in range(width): file.write(i * " *") file.write("
") for i in range(width,0,-1): file.write(i * " *") file.write("
") file.write("
") file.close() import webbrowser webbrowser.open("file.html")

échale un vistazo (para python 2.7x) :


Diamante ASCII relleno:

 width = 1 width += int(raw_input('Width : ')) for i in range (1,width): for j in range (width,i,-1): print " ", for j in range (1,i,1): print " * ", print for i in range (width,1,-1): for j in range (width,i,-1): print " ", for j in range (1,i,1): print " * ", print 

¡¡Esto funciona!! Pero no en ninguna ventana del navegador. . .