Estamos colocando bolas em um número fixo de caixas. Essas caixas começam vazias.
Empty bin (a=4): 0 0 0 0
E um por um, adicionamos bolas às caixas.
0 0 0 1 or
0 0 1 0 or
0 1 0 0 or
1 0 0 0
Precisamos de uma maneira rápida de percorrer todos os estados possíveis das caixas, sem duplicatas e sem perder nenhuma, e não queremos enumerar todas as caixas possíveis. Então, em vez disso, atribuímos a cada configuração de compartimento um índice.
Atribuímos o índice classificando as configurações possíveis de uma maneira específica:
- Classifique em ordem crescente por soma: primeiro
0 0 0 0
, as configurações possíveis com 1 bola adicionada e depois 2, etc. Em seguida, classifique dentro de cada soma em ordem crescente, do primeiro compartimento ao ú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
O índice é então atribuído ascendente através desta 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
Regras
Crie uma função ou programa que obtenha uma lista de qualquer tamanho com números inteiros não negativos e imprima ou produza seu índice. Você pode assumir a ser pelo menos 2. vitórias código mais curto. Você pode usar saída indexada em 0 ou indexada em 1, mas especifique qual você usa. NB: todos os exemplos aqui são 1 indexados.
Código de exemplo
Não jogou golfe, em 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 teste
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