Cuando se trata de comer dulces, me mantengo en estándares más altos que el típico laico. Existe un delicado equilibrio entre "mezclarlo" y "guardar lo mejor para el final".
En este desafío, se te dará una serie de personajes en los que cada personaje representa un dulce. Los diferentes caracteres (distinguen entre mayúsculas y minúsculas) representan diferentes tipos de dulces. Su programa debe determinar el orden correcto de consumo de dulces, de acuerdo con el siguiente procedimiento. Puede escribir un programa completo (STDIN / STDOUT) o una función con nombre para realizar esta tarea.
Digamos que mi alijo de dulces es oroybgrbbyrorypoprr
. Primero, clasifico los dulces en montones del mismo tipo, con grandes cantidades en la parte superior, usando valores de caracteres ASCII más bajos como un desempate.
rrrrrr
oooo
bbb
yyy
pp
g
Luego, tomo cada fila de dulces y los esparto por igual a lo largo de un intervalo. Por ejemplo, si hay 3 dulces, uno se coloca 1/3 del camino, 2/3 del camino y al final.
.r.r.r.r.r.r
..o..o..o..o
...b...b...b
...y...y...y
.....p.....p
...........g
A continuación, voy por cada columna para crear el pedido de caramelo final rorbyroprbyorrobypg
.
Entrada
Una cadena que contiene el alijo de dulces. La entrada para el ejemplo anterior podría haber sido:
oroybgrbbyrorypoprr
Salida
Una cadena que contiene el dulce se reorganizó en el orden correcto de consumo.
rorbyroprbyorrobypg
Tanteo
Este es el código de golf. La respuesta más corta en bytes gana. Aplican reglas estándar de código de golf.
Respuestas:
CJam,
78 68 61 45 42 39 3130 bytesToma la cadena de entrada a través de STDIN
Inspirado en el enfoque recursivo, pero un poco diferente. No hay necesidad de transposición o rectángulo en absoluto!
Cómo funciona:
(Es triste que CJam ya no pueda completarse con Pyth debido a la necesidad de tanta hinchazón como sintaxis)
Pruébalo aquí
fuente
{_@_@{_@\%}h;/*}
con:
.Pyth , 25
Utiliza un algoritmo completamente nuevo, inspirado en esta respuesta .
Paso a paso:
Primero, clasificamos los caracteres por su comunidad, lazos rotos alfabéticamente. Esto es
o_/zZSz
.o
es lo mismo que Pythonsorted(<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 hastak/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:
Piezas incrementales del programa sobre
oroybgrbbyrorypoprr
:Vieja respuesta:
Pyth , 34
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 esu*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:
fuente
Perl 5 - 62
61 código + 1 bandera.
Primero divide la entrada en una matriz de caracteres:
/./g
.Agregue índice de ocurrencia a cada letra dejando los recuentos en variables
$a
...$z
conmap++$$_.$_
. Ahora la matriz es:Luego conviértalo a una clave de clasificación que concatene: relación
$_/$$1
, recuento de desempate~$_
y disyuntor de valor ASCII$_
. Esto resultará en (aquí con espacios adicionales para mayor claridad).Esto se puede ordenar por orden lexicográfico (predeterminado). Al final, extraiga el último carácter e imprima:
print map/(.$)/
fuente
Python 3.x - 124 bytes
fuente
Mathematica,
123119118 bytesDefine una función con nombre
f
. Sin golf:El uso de tipos racionales incorporados parecía una buena idea para esto. Por supuesto, esto no está cerca de CJam. Básicamente, estoy representando la cuadrícula que se muestra en el desafío como una lista de pares. Lo primero en el par es el código de caracteres, el segundo es su posición como una fracción menor o igual a 1 (la columna final es 1). Después de asegurarme de que los caracteres individuales ya están en el orden correcto, solo necesito ordenar esto de manera estable por dicha fracción para obtener el resultado deseado.
fuente
Pyth 45
47 48 51Esto también podría casi con toda seguridad ser más golfizado;)
Funciona construyendo una lista de listas, donde cada lista interna es una fila de cadenas vacías y el nombre del dulce. Esta lista se transpone y luego se unen las listas internas seguidas de estas listas.
¡Gracias @isaacg por recordarme sobre la suma!
fuente
s
en una lista de cadenas funciona comoj""
.APL: 38
Explicación:
Se puede probar en tryapl.org
fuente
R - 166 caracteres
versión sin golf
Explicación:
order
es estable en la clasificación, por lo que mantendrá el orden de nombres más frecuente / léxico cuando haya un empate en el índice, particularmente importante con los últimos dulces)La naturaleza matricial del problema me hizo pensar que R podría intentarlo, pero la mejor interpretación literal del algoritmo que pude hacer fue 211 caracteres:
sin golf:
fuente
Pyth, 29 bytes
Esta es una traducción directa de mi respuesta de CJam en Pyth
Pruébalo en línea aquí
Hay una historia bastante larga detrás de esta solución y @isaacg me ayudó mucho a comprender este nuevo lenguaje.
Idealmente, esta es la traducción exacta de palabra a palabra de mi código CJam ( 17 bytes ):
lo que significa:
Pero lamentablemente Python no devuelve nada en un
+=
llamada, por lo que no era un código Python válido, por lo tanto, un código Pyth no válido también como en Pyth, un lambda solo puede ser una declaración de retorno.Luego busqué en varios métodos y finalmente descubrí que Python
list.append
devuelve unNone
valor, que puedo usar. Hacer que el código sea ( 19 bytes ):lo que significa:
Pero lamentablemente, el soporte de
a
(append) se eliminó de Pyth y la versión que sí lo tiene, no lo tieneo
.Actualización: ahora
a
se ha agregado soporte en Pyth, por lo que el código de 19 bytes anterior funcionará en el compilador en línea. Pero dado que esta es una nueva característica que se agregó después del OP, no la pongo como mi puntaje y dejo que el código de 29 bytes sea mi solución.Por lo tanto, tuve que confiar en Python sin procesar en ese caso, haciendo que el código fuera
fuente