import random as r
i=input()
l=len(i)
a=range(-l,l+1)
g=[(y,x)for y in a for x in a]
p=[(y,x)for y,x in g if abs(x+y*1j)<=l and x|y]
m=i[l//2]
d=[*i.replace(m,"",1).center(len(p))]
r.shuffle(d)
o=""
for c in g:
o+=m if c==(0,0)else d.pop()if c in p else" "
if c[1]==l:o+="\n"
print(o)
Probarlo en línea es una opción.
Whoops, tropezó con esto debido a una actividad reciente, no notó que tenía más de dos años de alguna manera hasta que pasé un buen rato en esto. Bueno, dos respuestas son un poco tristes, así que probablemente sea una buena idea publicar de todos modos. Estoy seguro de que hay docenas de formas de mejorar esto: hasta ahora no noté que la información siempre es extraña, lo que hubiera sido útil saber.
Explicación
i=input()
es entrada, por supuesto, l=len(i)
está guardando la longitud de la cadena porque se usa varias veces.
a=range(-l,l+1)
- una herramienta rápida para crear un iterador que varía las distancias disponibles desde el origen en ambos sentidos a lo largo de una dimensión.
g=[(y,x)for y in a for x in a]
construye una lista de coordenadas de tupla que conforma la cuadrícula final completa.
p=[(y,x)for y,x in g if abs(x+y*1j)<=l and x|y]
crea un subconjunto de la lista que contiene solo las coordenadas en las que las letras que no están en el centro pueden aterrizar
m=i[l//2]
Establece el carácter central.
d=[*i.replace(m,"",1).center(len(p))]
- el personaje del centro es eliminado, dejándonos con los otros escombros. La center()
función es muy agradable aquí, porque nos permite rellenar la línea (con un espacio predeterminado) hasta que tenga una cierta cantidad de caracteres. Aquí, ese es el número de espacios en los que las letras pueden aterrizar, reflejando así la distribución que necesitamos.
r.shuffle(d)
naturalmente, baraja dicha distribución para ser realmente ... distribuida.
El bucle, for c in g: o+=m if c==(0,0)else d.pop()if c in p else" "
mira sobre todo el cuadrado de mosaicos factibles, independientemente de cualquier cosa que pueda aterrizar sobre él o no, y según sea necesario, agrega un carácter a nuestra cadena de salida o
. Los caracteres salen de nuestra muestra de escombros para que solo aparezcan una vez.
if c[1]==l:o+="\n"
- Agrega saltos de línea también. Devoluciones.