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)
Wypróbowanie go online jest opcją.
Ups, natknąłem się na to z powodu niedawnej działalności, nie zauważyłem, że ma ponad dwa lata, dopóki nie spędziłem nad tym czasu. Cóż, dwie odpowiedzi są trochę smutne, więc i tak jest to prawdopodobnie dobry pomysł na opublikowanie. Jestem pewien, że istnieją dziesiątki sposobów na poprawę tej sytuacji - do tej pory nie zauważyłem, że dane wejściowe są zawsze dziwne, co warto wiedzieć.
Wyjaśnienie
i=input()
jest oczywiście wkładem l=len(i)
oszczędza długość łańcucha, ponieważ jest używany kilka razy.
a=range(-l,l+1)
- szybkie narzędzie do tworzenia iteratora, w którym dostępne odległości są oddalone od początku w obie strony w jednym wymiarze.
g=[(y,x)for y in a for x in a]
tworzy listę współrzędnych krotkowych, które tworzą całą ostateczną siatkę.
p=[(y,x)for y,x in g if abs(x+y*1j)<=l and x|y]
tworzy podzbiór listy zawierający tylko współrzędne, na których mogą znajdować się litery niecentralne.
m=i[l//2]
ustanawia środkową postać.
d=[*i.replace(m,"",1).center(len(p))]
- środkowa postać została zdjęta, pozostawiając nam resztki gruzu. Ta center()
funkcja jest tutaj bardzo przyjemna, ponieważ pozwala nam wypisać linię (domyślnie spacją), aż będzie miała określoną liczbę znaków. Oto liczba spacji, na których mogą znajdować się litery, odzwierciedlając w ten sposób rozkład, którego potrzebujemy.
r.shuffle(d)
naturalnie tasuje tę dystrybucję jako faktycznie ... dystrybuowaną.
Pętla, for c in g: o+=m if c==(0,0)else d.pop()if c in p else" "
patrzy na cały kwadrat wykonalnych kafelków, niezależnie od wszystkiego, co może na nim wylądować lub nie, i w razie potrzeby dodaje znak do naszego ciągu wyjściowego o
. Znaki wyskakują z naszej próbki śmieci, dzięki czemu pojawiają się tylko raz.
if c[1]==l:o+="\n"
- Dodaje również podział linii. Zwroty.