Topları sabit bir sayıya bir kutuya koyuyoruz . Bu bidonlar boşalmaya başlar.
Empty bin (a=4): 0 0 0 0
Ve teker teker kutulara toplar ekliyoruz.
0 0 0 1 or
0 0 1 0 or
0 1 0 0 or
1 0 0 0
Kovaların kopya olmadan ve hiçbirini kaçırmadan alabileceği tüm olası durumlar arasında hızlı bir şekilde dolaşmaya ihtiyacımız var ve olası tüm kutuları saymak istemiyoruz. Bunun yerine her bin konfigürasyonuna bir indeks atarız.
Dizini, olası yapılandırmaları belirli bir şekilde sıralayarak atarız:
- Toplama göre artan şekilde sıralayın: önce
0 0 0 0
, sonra 1 top eklenmiş olası konfigürasyonlar, sonra 2 vb. Ardından, ilk bölmeden sonuncuya kadar her bir toplamın içinde artan sırada sıralayın:
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
Dizin daha sonra bu listeden artan şekilde atanır:
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
kurallar
Negatif olmayan tamsayılarla herhangi bir boyutta liste alan bir işlev veya program oluşturun ve dizinini yazdırın veya çıktısını alın. Sen varsayabiliriz bir en az 2. En kısa kod kazanır olmak. 0 dizinli çıktı veya 1 dizinli çıktı kullanabilirsiniz ancak hangisini kullandığınızı belirtin. Not: Buradaki tüm örnekler 1 dizinlidir.
Örnek kod
Golf yapılmaz, R cinsinden:
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)
}
Test senaryoları
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