我们将球放入固定数量的垃圾箱中。这些垃圾箱开始为空。
Empty bin (a=4): 0 0 0 0
然后我们一一将球加到垃圾箱中。
0 0 0 1 or
0 0 1 0 or
0 1 0 0 or
1 0 0 0
我们需要一种快速的方法来循环遍历垃圾箱的所有可能状态,没有重复且没有任何遗漏,并且我们不想列举所有可能的垃圾箱。因此,我们改为为每个bin配置分配一个索引。
我们通过以特定方式对可能的配置进行排序来分配索引:
- 按总和升序排序:因此,首先
0 0 0 0
添加可能的配置,然后添加1个球,然后添加2个,依此类推。 然后,从第一个容器到最后一个容器,以升序对每个和进行排序:
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
然后,该索引通过此列表升序分配:
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
规则
创建一个函数或程序,该函数或程序采用具有非负整数的任意大小的列表,并打印或输出其索引。您可以假设a至少为2。最短的代码获胜。您可以使用0索引输出或1索引输出,但是请指定要使用的输出。注意:此处所有示例均采用1索引。
范例程式码
在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)
}
测试用例
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