shCoc/NhN/zhNm>o_/zZSzdUz
Utiliza un algoritmo completamente nuevo, inspirado en esta respuesta .
(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))
Paso a paso:
Primero, clasificamos los caracteres por su comunidad, lazos rotos alfabéticamente. Esto es o_/zZSz
. o
es lo mismo que Python sorted(<stuff>,key=<stuff>)
, con una expresión lambda para la clave, excepto que la mantiene como una cadena.
Luego generamos una lista de los prefijos de esa cadena, a partir de la longitud len(z)
a longitud 1. >
es equivalente a la de Python <stuff>[<int>:]
.
Luego, reordenamos esta lista de cadenas de prefijos por la ubicación fraccional, siendo 0 el borde izquierdo y 1 el derecho, del primer carácter del prefijo en el diseño rectangular visto en la pregunta. /NhN
cuenta cuántas veces aparece el primer carácter en el prefijo en el prefijo, mientras/zhN
da el número de apariciones del primer carácter en el prefijo en la cadena como un agujero. Esto asigna a cada prefijo dirigido por cada personaje en un grupo una fracción diferente, desde1/k
la aparición más a la derecha de ese personaje hasta k/k
la más a la izquierda. Reordenar la lista de prefijos por este número proporciona la posición adecuada en el diseño. Los empates se rompen usando el pedido anterior, que primero se hizo por conteo y luego por orden alfabético, según lo deseado.
Finalmente, necesitamos extraer el primer carácter de cada cadena de prefijo, combinarlos en una sola cadena e imprimirlos. Extraer los primeros caracteres es hC
. C
realiza una transposición matricial en la lista, zip(*x)
en realidad en Python 3.h
extrae la primera fila de la matriz resultante. Esta es en realidad la única fila, porque la presencia del prefijo de 1 carácter evita que se formen otras filas completas. s
suma los caracteres de esta tupla en una sola cadena. La impresión es implícita.
Prueba:
$ pyth -c 'shCoc/NhN/zhNm>o_/zZSzdUz' <<< 'oroybgrbbyrorypoprr'
rorbyroprbyorrobypg
Piezas incrementales del programa sobre 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
Vieja respuesta:
ssCm*+t*u*G/zHS{-zd1]kd/zdo_/zNS{z
Este programa funciona calculando cuántas veces replicar una determinada sublista. La sublista se ve así ['', '', '', '', ... , 'r']
. La longitud total de esta sublista es el producto del número de ocurrencias de todos los otros dulces, que es u*G/zHS{-zd1
. La sublista completa se construye replicando la lista de la cadena vacía ]k
, que muchas veces, luego eliminando y elemento cont
y agregando el nombre del caramelo al final con +d
.
Luego, esta sublista se replica tantas veces como se encuentra ese dulce en la entrada, /zd
, asegurando que la lista de cada dulce sea de igual longitud.
Ahora, con esta función asignada a todos los dulces únicos en el orden ordenado apropiado ( o_/zNS{z
), tenemos un rectángulo similar al de la pregunta, pero con cadenas vacías en lugar de puntos. Hacer una transposición matricial ( C
) seguida de dos sumaciones ( ss
) da la cadena final.
Verificación:
$ pyth programs/candy.pyth <<< 'oroybgrbbyrorypoprr'
rorbyroprbyorrobypg