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)
L'essayer en ligne est une option.
Oups, tombé sur ce sujet en raison d'une activité récente, n'a pas remarqué qu'il avait plus de deux ans jusqu'à ce que j'y passe un bon moment. Eh bien, deux réponses sont un peu tristes, c'est donc probablement une bonne idée de poster quand même. Je suis sûr qu'il existe des dizaines de façons d'améliorer cela - je n'ai pas remarqué jusqu'à présent que les commentaires sont toujours étranges, ce qui aurait été utile de savoir.
Explication
i=input()
l=len(i)
Cette entrée, bien sûr, enregistre la longueur de la chaîne car elle est utilisée plusieurs fois.
a=range(-l,l+1)
- un outil rapide pour créer un itérateur allant des distances disponibles loin de l'origine dans les deux sens le long d'une dimension.
g=[(y,x)for y in a for x in a]
construit une liste de coordonnées de tuple qui constitue la grille finale entière.
p=[(y,x)for y,x in g if abs(x+y*1j)<=l and x|y]
crée un sous-ensemble de la liste contenant uniquement les coordonnées sur lesquelles les lettres non centrales peuvent éventuellement atterrir.
m=i[l//2]
établit le caractère central.
d=[*i.replace(m,"",1).center(len(p))]
- le personnage central est sorti, nous laissant avec les autres débris. La center()
fonction est très agréable ici, car elle nous permet de remplir la ligne (avec par défaut un espace) jusqu'à ce qu'elle soit longue d'un certain nombre de caractères. Ici, c'est le nombre d'espaces sur lesquels les lettres peuvent atterrir, reflétant ainsi la distribution dont nous avons besoin.
r.shuffle(d)
mélange naturellement ladite distribution comme étant réellement ... distribuée.
La boucle,, for c in g: o+=m if c==(0,0)else d.pop()if c in p else" "
regarde le carré entier des tuiles réalisables, indépendamment de tout ce qui peut y atterrir ou non, et si nécessaire, ajoute un caractère à notre chaîne de sortie o
. Les personnages sont extraits de notre échantillon de débris afin qu'ils n'apparaissent qu'une seule fois.
if c[1]==l:o+="\n"
- Ajoute également des sauts de ligne. Retour.