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"
- Добавляет также разрывы строк. Возвращает.