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)
Provarlo online è un'opzione.
Whoops, inciampato su questo a causa della recente attività, non si è accorto che aveva più di due anni in qualche modo fino a quando non ho trascorso un bel po 'su questo. Bene, due risposte sono un po 'tristi, quindi questa è probabilmente una buona idea pubblicare comunque. Sono sicuro che ci sono dozzine di modi per migliorarlo: non ho notato fino ad ora che l'input è sempre strano, il che sarebbe stato utile sapere.
Spiegazione
i=input()
Questo input, ovviamente, l=len(i)
sta salvando la lunghezza della stringa perché viene usata parecchie volte.
a=range(-l,l+1)
- uno strumento rapido per creare un iteratore che allontani le distanze disponibili dall'origine in entrambe le direzioni lungo una dimensione.
g=[(y,x)for y in a for x in a]
costruisce un elenco di coordinate tuple che compongono l'intera griglia finale.
p=[(y,x)for y,x in g if abs(x+y*1j)<=l and x|y]
crea un sottoinsieme dell'elenco contenente solo le coordinate su cui possono eventualmente atterrare lettere non centrali.
m=i[l//2]
stabilisce il personaggio centrale.
d=[*i.replace(m,"",1).center(len(p))]
- il personaggio centrale viene eliminato, lasciandoci con gli altri detriti. La center()
funzione è molto bella qui, perché ci consente di tracciare la linea (con uno spazio di default) fino a quando non è lungo un certo numero di caratteri. Ecco, questo è il numero di spazi su cui le lettere possono atterrare, rispecchiando così la distribuzione di cui abbiamo bisogno.
r.shuffle(d)
mescola naturalmente la distribuzione in realtà ... distribuita.
Il loop, for c in g: o+=m if c==(0,0)else d.pop()if c in p else" "
guarda l'intero quadrato di tessere fattibili, indipendentemente da qualsiasi cosa possibilmente atterrare su di esso o meno, e, se necessario, aggiunge un carattere alla nostra stringa di output o
. I personaggi vengono estratti dal nostro campione di detriti in modo che appaiano solo una volta.
if c[1]==l:o+="\n"
- Aggiunge anche le interruzioni di riga. Ritorna.