ボールを固定数のビンに入れています。これらのビンは空で始まります。
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
ビンが取る可能性のあるすべての状態を、重複せずに見逃すことなくすばやくループする方法が必要です。すべての可能なビンを列挙する必要はありません。そのため、代わりに各ビン構成にインデックスを割り当てます。
可能な構成を特定の方法で並べ替えて、インデックスを割り当てます。
- 合計で昇順で並べ替え
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インデックス付き出力を使用できますが、使用するものを指定します。NB:ここでの例はすべて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