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)
Çevrimiçi denemek bir seçenektir.
Whoops, son etkinlik nedeniyle bunun üzerine tökezledi, bunun üzerinde iyi bir zaman geçirene kadar bir şekilde iki yaşın üzerinde olduğunu fark etmedi. İki cevap biraz üzücü, bu yüzden yine de göndermek iyi bir fikir. Eminim bu konuda iyileştirmek için düzinelerce yol var - şimdiye kadar girdinin her zaman garip olduğunu fark etmedim, ki bu da bilmek yardımcı olurdu.
açıklama
i=input()
girdidir, elbette, l=len(i)
birkaç kez kullanıldığı için dizenin uzunluğunu koruyor.
a=range(-l,l+1)
- bir boyut boyunca her iki yönde de başlangıç mesafesinden mevcut mesafeleri değiştiren bir yineleyici oluşturmak için hızlı bir araç
g=[(y,x)for y in a for x in a]
tüm son ızgarayı oluşturan bir grup koordinat listesi oluşturur.
p=[(y,x)for y,x in g if abs(x+y*1j)<=l and x|y]
yalnızca merkez dışı harflerin üzerine gelebileceği koordinatları içeren listenin bir alt kümesini oluşturur.
m=i[l//2]
merkez karakteri kurar.
d=[*i.replace(m,"",1).center(len(p))]
- merkez karakter çıkarıldı ve bizi diğer enkazlarla birlikte bıraktı. center()
O karakter belirli sayıda uzun olana kadar (varsayılan bir boşluk ile birlikte) çizgi dışarı pad bizi tanır çünkü fonksiyonu, burada çok güzel. Burada, harflerin üzerine gelebileceği alan sayısı, böylece ihtiyacımız olan dağılımı yansıtıyor.
r.shuffle(d)
doğal olarak, söz konusu dağıtımın gerçekte ... dağıtılmış olmasını karıştırır.
Döngü, for c in g: o+=m if c==(0,0)else d.pop()if c in p else" "
olası iniş olsun ya da olmasın, tüm uygulanabilir karoların karesini inceler ve gerekirse çıktı dizimize bir karakter ekler o
. Karakterler enkaz örneğimizden çıkarılır, böylece yalnızca bir kez görünürler.
if c[1]==l:o+="\n"
- Satır kesmeleri de ekler. İadeler.