Te han dado una bolsa de bolos. Todo el mundo sabe que para apreciar más los diferentes sabores, debes rotar entre los sabores.
Lo esencial:
- Solo puedes comer 1 bolo a la vez
- El orden en que comas tus bolos debe ser periódico.
- Cada período no puede contener un sabor particular más de una vez.
- Tu bolso solo tiene muchos bolos. No puede comer más de un sabor particular de bolos de lo que aparece en su bolsa.
- Desea comer tantos bolos como pueda (puede que no siempre sea posible)
Ejemplos:
Digamos que comienzas con 3 bolos rojos, 2 azules y 3 verdes:
R B G R B G R G Invalid: The last R must be followed by a B, not a G
R B G R B G R Valid, but sub-optimal
R R R Valid, but sub-optimal
R G B R G B R G Valid and optimal
G R B G R B G R Also valid and optimal (there are multiple good solutions)
De entrada y salida
- Se le pasa una lista no vacía de enteros positivos para los recuentos de colores. (El ejemplo anterior sería
[3,2,3]
). - Debe devolver una lista que contenga un pedido válido y óptimo.
- En lugar de usar colores, usará los índices de la lista de entrada. (El último ejemplo de salida anterior sería
[2,0,1,2,0,1,2,0]
). - Su salida puede estar indexada a 0 o indexada a 1. Mis ejemplos estarán indexados a 0
Casos de prueba
1 0
4 0 0 0 0
4 1 0 0 0 0
3 1 0 1 0 or 0 0 0
5 2 2 0 1 2 0 1 2 0
2 3 5 2 1 0 2 1 0 2 1 or 1 2 0 1 2 0 1 2
2 4 5 2 1 2 1 2 1 2 1 2
3 4 5 2 1 0 2 1 0 2 1 0 2 1 or 1 2 0 1 2 0 1 2 0 1 2
1 1 1 1 1 6 5 0 1 2 3 4 5 (lots of other solutions)
1 1 1 1 1 8 5 5 5 5 5 5 5 5
2 4 6 8 3 2 1 3 2 1 3 2 1 3 2 1 3 2
Este es un código de golf , ¡así que haga sus soluciones lo más cortas posible en su idioma favorito!
Respuestas:
JavaScript (ES6),
177175 bytesFormateado y comentado
Fórmula utilizada
A continuación se muestra una tabla que muestra cómo funciona la fórmula
F(i, j) = minimum(value[j], value[i] + 1)
, aquí coni = 0
y la entrada[ 5, 2, 2 ]
.Esta fórmula se puede interpretar de la siguiente manera: para cada tipo de Skittle, no podemos seleccionar más que el número del tipo menos disponible más uno.
Casos de prueba
Mostrar fragmento de código
fuente
m
estar al final de los "bucles" son inducidas por el golf o es simplemente cómo es JS?m=0
Sin embargo, poner aquí es inducido por el golf, porque no me importa el valor inicial de este ciclo (se sobrescribirá de todos modos). Inicializarm
allí es conveniente.[1,2,3].reduce((x, y) => x+y, 10)
en JS estaríareduce(lambda x,y: x+y, [1,2,3], 10)
en Python (creo), ambos resultando en16
.Jalea , 22 bytes
Indexación basada en 1.
Pruébalo en línea!
¿Cómo?
Repite cada prefijo de los índices ordenados por valor que desciende una vez más de lo que sería posible con la bolsa de bolos dada, luego elimina el bollo final o bolos de cada uno de estos según sea necesario para que sean alcanzables, y devuelve el que tenga más bolos .
El número que debe eliminarse de una repetición periódica adicional es solo el número con el recuento mínimo en ese prefijo.
fuente
Python3,
174172167 bytesIdea
Dado, por ejemplo, 3 bolos rojos, 2 azules y 3 verdes, uno puede organizarlos en una cuadrícula, ordenados por color y cantidad:
Si uno intenta comer exactamente los bolos, al menos puede comer bolos i * c en total, donde c es el número de bolos en la columna r-ésima, por ejemplo, para i = 2 uno puede comer al menos 6 bolos.
Lo único que queda por hacer es contar cuántos bolos adicionales se pueden comer por un período incompleto.
Golfed
Comentado
Pruébalo en línea!
Editar: se ha sustituido
(i+1)
con-~i
para guardar 2 bytes.Editar: -5 bytes gracias a Dead Possum
fuente
sum(1for e in b if e[0]>c)
asum(c<e[0]for e in b)
. Convertirá True a 1 implícitamente y le ahorrará 5 bytes