Nous mettons des boules en un nombre fixe d' un des bacs. Ces poubelles commencent vides.
Empty bin (a=4): 0 0 0 0
Et un par un, nous ajoutons des balles dans les bacs.
0 0 0 1 or
0 0 1 0 or
0 1 0 0 or
1 0 0 0
Nous avons besoin d'un moyen rapide de parcourir tous les états possibles des bacs, sans doublons et sans en manquer, et nous ne voulons pas énumérer tous les bacs possibles. Donc, à la place, nous attribuons à chaque configuration de bin un index.
Nous attribuons l'index en triant les configurations possibles d'une manière spécifique:
- Tri croissant par somme: donc d'abord
0 0 0 0
, puis les configurations possibles avec 1 boule ajoutée, puis 2, etc. Ensuite, triez chaque somme dans l'ordre croissant, du premier au dernier:
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
L'index est ensuite attribué croissant dans cette liste:
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
Règles
Créez une fonction ou un programme qui prend une liste de n'importe quelle taille avec des entiers non négatifs et affiche ou affiche son index. Vous pouvez supposer que a vaut au moins 2. Le code le plus court l'emporte. Vous pouvez utiliser une sortie indexée 0 ou indexée 1, mais spécifiez celle que vous utilisez. NB: tous les exemples ici sont indexés 1.
Exemple de code
Non 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)
}
Cas de test
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