shCoc/NhN/zhNm>o_/zZSzdUz
Utilizza un algoritmo tutto nuovo, ispirato a questa risposta .
(implicit) z = input()
(implicit) print
s combine list of strings into one string
h first list in
C matrix transpose of (e.g. first characters in first list, etc.)
o order_by(lambda N:
c float_div(
/NhN N.count(N[0]),
/zhN z.count(N[0])),
m map(lambda d:
> slice_head(
o order_by(lambda Z:
_/zZ -1*z.count(Z),
Sz sorted(z)),
d d),
Uz range(len(z))
Passo dopo passo:
Innanzitutto, abbiamo ordinato i personaggi in base alla loro comunanza, i legami spezzati in ordine alfabetico. Questo è o_/zZSz
. o
è uguale a quello di Python sorted(<stuff>,key=<stuff>)
, con un'espressione lambda per la chiave, tranne per il fatto che la mantiene come una stringa.
Quindi generiamo un elenco dei prefissi di quella stringa, da lunghezza len(z)
a lunghezza 1. >
è equivalente a quello di Python <stuff>[<int>:]
.
Quindi, riordiniamo questo elenco di stringhe di prefisso in base alla posizione frazionaria, 0 essendo il bordo sinistro e 1 essendo la destra, del primo carattere del prefisso sul layout rettangolare visto nella domanda. /NhN
conta quante volte il primo carattere nel prefisso si presenta nel prefisso, mentre /zhN
fornisce il numero di occorrenze del primo carattere nel prefisso nella stringa come un buco. Questo assegna a ciascun prefisso guidato da ciascun personaggio di un gruppo una frazione diversa, dalla 1/k
più occorrenza destra di quel personaggio alla k/k
più sinistra. Riordinando l'elenco dei prefissi con questo numero si ottiene la posizione appropriata nel layout. I legami vengono spezzati usando l'ordinamento precedente, che era prima per conteggio quindi in ordine alfabetico, come desiderato.
Infine, dobbiamo estrarre il primo carattere da ciascuna stringa di prefisso, combinarli in un'unica stringa e stamparli. L'estrazione dei primi caratteri è hC
. C
esegue una trasposizione matrice nell'elenco, in realtà zip(*x)
in Python 3. h
estrae la prima riga della matrice risultante. Questa è in realtà l'unica riga, perché la presenza del prefisso di 1 carattere impedisce la formazione di altre righe complete. s
somma i caratteri di questa tupla in un'unica stringa. La stampa è implicita.
Test:
$ pyth -c 'shCoc/NhN/zhNm>o_/zZSzdUz' <<< 'oroybgrbbyrorypoprr'
rorbyroprbyorrobypg
Programmi incrementali su oroybgrbbyrorypoprr
:
Sub-Piece Output
Sz bbbgoooopprrrrrryyy
o_/zNSz rrrrrroooobbbyyyppg (uses N because o uses N on first use.)
m>o_/zNSzdUz ['rrrrrroooobbbyyyppg', 'rrrrroooobbbyyyppg', 'rrrroooobbbyyyppg', 'rrroooobbbyyyppg', 'rroooobbbyyyppg', 'roooobbbyyyppg', 'oooobbbyyyppg', 'ooobbbyyyppg', 'oobbbyyyppg', 'obbbyyyppg', 'bbbyyyppg', 'bbyyyppg', 'byyyppg', 'yyyppg', 'yyppg', 'yppg', 'ppg', 'pg', 'g']
oc/NhN/zhNm>o_/zZSzdUz ['roooobbbyyyppg', 'obbbyyyppg', 'rroooobbbyyyppg', 'byyyppg', 'yppg', 'rrroooobbbyyyppg', 'oobbbyyyppg', 'pg', 'rrrroooobbbyyyppg', 'bbyyyppg', 'yyppg', 'ooobbbyyyppg', 'rrrrroooobbbyyyppg', 'rrrrrroooobbbyyyppg', 'oooobbbyyyppg', 'bbbyyyppg', 'yyyppg', 'ppg', 'g']
Coc/NhN/zhNm>o_/zZSzdUz [('r', 'o', 'r', 'b', 'y', 'r', 'o', 'p', 'r', 'b', 'y', 'o', 'r', 'r', 'o', 'b', 'y', 'p', 'g')]
shCoc/NhN/zhNm>o_/zZSzdUz rorbyroprbyorrobypg
Vecchia risposta:
ssCm*+t*u*G/zHS{-zd1]kd/zdo_/zNS{z
Questo programma funziona calcolando quante volte replicare un determinato elenco secondario. L'elenco secondario appare come ['', '', '', '', ... , 'r']
. La lunghezza totale di questo elenco secondario è il prodotto del numero di occorrenze di tutte le altre caramelle, ovvero u*G/zHS{-zd1
. L'elenco completo completo viene creato replicando l'elenco della stringa vuota ]k
, che molte volte, quindi rimuovendo ed elemento con t
e aggiungendo il nome della caramella alla fine con +d
.
Quindi, questo elenco secondario viene replicato tutte le volte che viene trovata la caramella nell'input /zd
, garantendo che l'elenco di ogni caramella abbia la stessa lunghezza.
Ora, con questa funzione mappata su tutte le caramelle uniche nell'ordine corretto ( o_/zNS{z
), abbiamo un rettangolo simile a quello nell'istruzione della domanda, ma con stringhe vuote anziché punti. Eseguendo una matrice transpose ( C
) seguita da due sommazioni ( ss
) fornisce la stringa finale.
Verifica:
$ pyth programs/candy.pyth <<< 'oroybgrbbyrorypoprr'
rorbyroprbyorrobypg