shCoc/NhN/zhNm>o_/zZSzdUz
Usa um algoritmo totalmente novo, inspirado nesta resposta .
(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 a passo:
Primeiro, classificamos os caracteres por sua comunhão, laços quebrados alfabeticamente. Isto é o_/zZSz
. o
é o mesmo que o de Python sorted(<stuff>,key=<stuff>)
, com uma expressão lambda para a chave, exceto que a mantém como uma string.
Em seguida, geramos uma lista dos prefixos dessa cadeia, do comprimento len(z)
ao comprimento 1. >
é equivalente ao do python <stuff>[<int>:]
.
Em seguida, reordenamos essa lista de sequências de prefixos pela localização fracionária, sendo 0 a aresta esquerda e 1 a direita, do primeiro caractere do prefixo no layout retangular visto na pergunta. /NhN
conta quantas vezes o primeiro caractere no prefixo ocorre no prefixo, enquanto /zhN
fornece o número de ocorrências do primeiro caractere no prefixo na cadeia como um buraco. Isso atribui a cada prefixo liderado por cada caractere em um grupo uma fração diferente, da 1/k
ocorrência mais à direita desse caractere à k/k
da esquerda. Reordenar a lista de prefixos por esse número fornece a posição apropriada no layout. Os laços são quebrados usando a ordem anterior, que era primeiro por contagem e depois alfabética, conforme desejado.
Finalmente, precisamos extrair o primeiro caractere de cada sequência de prefixos, combiná-los em uma única sequência e imprimi-los. Extrair os primeiros caracteres é hC
. C
realiza uma transposição de matriz na lista, zip(*x)
na verdade no Python 3. h
extrai a primeira linha da matriz resultante. Essa é realmente a única linha, porque a presença do prefixo de 1 caractere impede a formação de outras linhas completas. s
soma os caracteres nesta tupla em uma única sequência. A impressão está implícita.
Teste:
$ pyth -c 'shCoc/NhN/zhNm>o_/zZSzdUz' <<< 'oroybgrbbyrorypoprr'
rorbyroprbyorrobypg
Partes incrementais do programa em 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
Resposta antiga:
ssCm*+t*u*G/zHS{-zd1]kd/zdo_/zNS{z
Este programa funciona calculando quantas vezes replicar uma certa sublist. A sub-lista é semelhante ['', '', '', '', ... , 'r']
. O comprimento total desta sub-lista é o produto do número de ocorrências de todos os outros doces, o que é u*G/zHS{-zd1
. A sub-lista completa é construída replicando a lista da cadeia vazia, ]k
muitas vezes, removendo o elemento t
e adicionando o nome do doce ao final +d
.
Em seguida, essa sub-lista é replicada quantas vezes esse doce for encontrado na entrada /zd
, garantindo que a lista de cada doce tenha o mesmo comprimento.
Agora, com essa função mapeada sobre todos os doces únicos na ordem classificada adequada ( o_/zNS{z
), temos um retângulo semelhante ao da declaração da pergunta, mas com cadeias vazias em vez de pontos. Fazer uma matriz transpose ( C
) seguida de dois somatórios ( ss
) fornece a sequência final.
Verificação:
$ pyth programs/candy.pyth <<< 'oroybgrbbyrorypoprr'
rorbyroprbyorrobypg