Stawiamy kulki na ustaloną liczbę ciągu pojemników. Te pojemniki zaczynają się puste.
Empty bin (a=4): 0 0 0 0
I jeden po drugim dodajemy kule do pojemników.
0 0 0 1 or
0 0 1 0 or
0 1 0 0 or
1 0 0 0
Potrzebujemy szybkiego sposobu na obejście wszystkich możliwych stanów, które przyjmują pojemniki, bez duplikatów i żadnych braków, i nie chcemy wyliczać wszystkich możliwych pojemników. Zamiast tego przypisujemy każdej konfiguracji bin indeks.
Indeks przypisujemy, sortując możliwe konfiguracje w określony sposób:
- Sortuj rosnąco według sumy: najpierw najpierw
0 0 0 0
możliwe konfiguracje z 1 kulą, potem 2 itd. Następnie posortuj w obrębie każdej sumy w porządku rosnącym, od pierwszego pojemnika do ostatniego:
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
Indeks jest następnie przypisywany rosnąco za pomocą tej listy:
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
Zasady
Utwórz funkcję lub program, który pobiera listę dowolnego rozmiaru z nieujemnymi liczbami całkowitymi i wypisz lub wypisz jej indeks. Można założyć, być co najmniej 2. Najkrótsze wygrywa kod. Możesz użyć danych wyjściowych z indeksowaniem 0 lub 1 z indeksowaniem, ale określ, którego używasz. Uwaga: wszystkie przykłady są tutaj indeksowane 1.
Przykładowy kod
Nie grał w golfa, w 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)
}
Przypadki testowe
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