Estamos poniendo las bolas en un número fijo unos contenedores. Estos contenedores comienzan vacíos.
Empty bin (a=4): 0 0 0 0
Y uno por uno agregamos bolas a los contenedores.
0 0 0 1 or
0 0 1 0 or
0 1 0 0 or
1 0 0 0
Necesitamos una forma rápida de recorrer todos los estados posibles que toman los contenedores, sin duplicados y sin perder ninguno, y no queremos enumerar todos los contenedores posibles. Entonces, en cambio, asignamos a cada configuración bin un índice.
Asignamos el índice ordenando las configuraciones posibles de una manera específica:
- Ordenar ascendente por suma: primero
0 0 0 0
, luego las configuraciones posibles con 1 bola agregada, luego 2, etc. Luego ordene dentro de cada suma en orden ascendente, desde el primer contenedor hasta el último:
0 0 0 2 0 0 1 1 0 0 2 0 0 1 0 1 0 1 1 0 0 2 0 0 etc
Luego se asigna el índice ascendente a través de esta lista:
0 0 0 0 -> 1 0 0 0 1 -> 2 0 0 1 0 -> 3 0 1 0 0 -> 4 1 0 0 0 -> 5 0 0 0 2 -> 6 0 0 1 1 -> 7 0 0 2 0 -> 8 0 1 0 1 -> 9 0 1 1 0 -> 10 0 2 0 0 -> 11
Reglas
Cree una función o programa que tome una lista de cualquier tamaño con enteros no negativos e imprima o muestre su índice. Se puede suponer un ser de al menos 2. cortos victorias de código. Puede usar salida indexada 0 o indexada 1, pero especifique cuál usa. NB: todos los ejemplos aquí están indexados en 1.
Código de ejemplo
No golf, en R:
nodetoindex <- function(node){
a <- length(node)
t <- sum(node)
if(t == 0) return(1)
index <- choose(t-1 + a, a)
while(sum(node) != 0){
x <- node[1]
sumrest <- sum(node)
if(x == 0){
node <- node[-1]
next
}
a <- length(node[-1])
index <- index + choose(sumrest + a, a) - choose(sumrest - x + a, a)
node <- node[-1]
}
return(index + 1)
}
Casos de prueba
10 10 10 10 -> 130571
3 1 4 1 5 9 -> 424407
2 9 -> 69
0 0 0 -> 1
0 0 1 -> 2
0 0 0 0 0 0 -> 1
1 0 0 0 0 1 -> 23