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)
Es ist eine Option, es online zu versuchen.
Whoops, der aufgrund der jüngsten Aktivitäten darauf gestoßen war, bemerkte nicht, dass es irgendwie über zwei Jahre alt war, bis ich eine Weile damit verbracht hatte. Nun, zwei Antworten sind irgendwie traurig, daher ist es wahrscheinlich eine gute Idee, sie trotzdem zu posten. Ich bin mir sicher, dass es Dutzende von Möglichkeiten gibt, dies zu verbessern - bis jetzt ist mir noch nicht aufgefallen, dass Eingaben immer ungerade sind, was zu wissen hilfreich gewesen wäre.
Erläuterung
i=input()
Bei der Eingabe wird natürlich l=len(i)
die Länge der Zeichenfolge gespart, da sie einige Male verwendet wird.
a=range(-l,l+1)
- Ein schnelles Werkzeug zum Erstellen eines Iterators, mit dem die verfügbaren Abstände vom Ursprung in beide Richtungen entlang einer Dimension berechnet werden können.
g=[(y,x)for y in a for x in a]
Erstellt eine Liste mit Tupelkoordinaten, aus denen das gesamte endgültige Raster besteht.
p=[(y,x)for y,x in g if abs(x+y*1j)<=l and x|y]
Erstellt eine Teilmenge der Liste, die nur die Koordinaten enthält, auf denen möglicherweise nicht zentrierte Buchstaben landen können.
m=i[l//2]
Legt den Mittelcharakter fest.
d=[*i.replace(m,"",1).center(len(p))]
- Der Mittelcharakter wird entfernt und wir bleiben mit den anderen Trümmern zurück. Die center()
Funktion ist hier sehr schön, da wir die Zeile (standardmäßig mit einem Leerzeichen) auffüllen können, bis sie eine bestimmte Anzahl von Zeichen lang ist. Das ist hier die Anzahl der Leerzeichen, auf denen die Buchstaben landen können, was die Verteilung widerspiegelt, die wir benötigen.
r.shuffle(d)
natürlich mischt besagte Verteilung, um wirklich… verteilt zu werden.
Die Schleife for c in g: o+=m if c==(0,0)else d.pop()if c in p else" "
überblickt das gesamte Quadrat der möglichen Kacheln, unabhängig davon, ob irgendetwas darauf landet oder nicht, und fügt unserer Ausgabezeichenfolge nach Bedarf ein Zeichen hinzu o
. Charaktere werden aus unserer Trümmerprobe herausgeschleudert, so dass sie nur einmal erscheinen.
if c[1]==l:o+="\n"
- Fügt auch Zeilenumbrüche hinzu. Kehrt zurück.