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)
Спробуйте в Інтернеті - це варіант.
Уопс, наткнувшись на це через нещодавню діяльність, не помітив, що це було якось понад два роки, поки я не витратив на це добре. Ну, дві відповіді - це щось сумно, так що це, мабуть, хороша ідея для публікації в будь-якому випадку. Я впевнений, що існує десяток способів покращити це - досі не помічав, що введення завжди непарне, що було б корисно знати.
Пояснення
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))]
- виймається центральний персонаж, залишаючи нас з іншими сміттями. center()
Функція дуже добре тут, тому що це дозволяє нам роздути з лінії (з за замовчуванням пробіл) до тих пір, поки це певна кількість символів. Ось така кількість пробілів, на яких можуть літери, відображаючи, таким чином, відображення потрібного нам розподілу.
r.shuffle(d)
природно перетасовує, що розподіл фактично ... розподілений.
Цикл, for c in g: o+=m if c==(0,0)else d.pop()if c in p else" "
переглядає всю площу можливих плиток, незалежно від того, що можливо на ній висаджується чи ні, і за необхідності додає символу до вихідного рядкаo
. Персонажі спливають із нашого зразка сміття, щоб вони з’явились лише один раз.
if c[1]==l:o+="\n"
- Додає також розриви рядків. Повертається.