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)
Dùng thử trực tuyến là một lựa chọn.
Rất tiếc, vấp phải điều này do hoạt động gần đây, đã không nhận thấy nó đã hơn hai tuổi cho đến khi tôi dành thời gian tốt cho việc này. Vâng, hai câu trả lời là loại buồn, vì vậy đây có lẽ là một ý tưởng tốt để đăng. Tôi chắc chắn có hàng tá cách để cải thiện điều này cho đến bây giờ rằng đầu vào luôn là số lẻ, điều này sẽ hữu ích khi biết.
Giải trình
i=input()
là đầu vào, tất nhiên, l=len(i)
là tiết kiệm độ dài của chuỗi vì nó được sử dụng khá nhiều lần.
a=range(-l,l+1)
- một công cụ nhanh chóng để tạo một trình vòng lặp bao gồm các khoảng cách có sẵn từ gốc cả hai chiều dọc theo một chiều.
g=[(y,x)for y in a for x in a]
xây dựng một danh sách các tọa độ tuple tạo nên toàn bộ lưới cuối cùng.
p=[(y,x)for y,x in g if abs(x+y*1j)<=l and x|y]
tạo một tập hợp con của danh sách chỉ chứa tọa độ mà các chữ cái không nằm giữa có thể có thể nằm trên.
m=i[l//2]
thiết lập nhân vật trung tâm.
d=[*i.replace(m,"",1).center(len(p))]
- nhân vật trung tâm được đưa ra ngoài, để lại cho chúng tôi những mảnh vụn khác. Các center()
chức năng là rất tốt đẹp ở đây, bởi vì nó cho phép chúng ta pad ra dòng (với mặc định một không gian) cho đến khi đó là một số lượng nhất định các ký tự. Ở đây, đó là số lượng không gian mà các chữ cái có thể nằm trên, do đó phản ánh sự phân phối mà chúng ta cần.
r.shuffle(d)
tự nhiên xáo trộn cho biết phân phối để thực sự ... phân phối.
Vòng lặp, for c in g: o+=m if c==(0,0)else d.pop()if c in p else" "
nhìn qua toàn bộ ô vuông khả thi, bất kể mọi thứ có thể hạ cánh trên nó hay không, và khi cần thiết, sẽ thêm một ký tự vào chuỗi đầu ra của chúng tôi o
. Các nhân vật được bật ra khỏi mẫu mảnh vỡ của chúng tôi để chúng chỉ xuất hiện một lần.
if c[1]==l:o+="\n"
- Thêm ngắt dòng là tốt. Trả về.