Wir setzen Bälle in eine feste Anzahl ein Behälter. Diese Fächer beginnen leer.
Empty bin (a=4): 0 0 0 0
Und eins nach dem anderen fügen wir Bälle zu den Behältern hinzu.
0 0 0 1 or
0 0 1 0 or
0 1 0 0 or
1 0 0 0
Wir brauchen einen schnellen Weg, um alle möglichen Zustände, die die Bins annehmen, ohne Duplikate und ohne fehlende zu durchlaufen, und wir wollen nicht alle möglichen Bins aufzählen. Also ordnen wir stattdessen jeder Bin-Konfiguration einen Index zu.
Wir ordnen den Index zu, indem wir die möglichen Konfigurationen auf eine bestimmte Weise sortieren:
- Aufsteigend nach Summe sortieren: also zuerst
0 0 0 0
die möglichen Konfigurationen mit 1 Ball addieren, dann 2, etc. Sortieren Sie dann innerhalb jeder Summe in aufsteigender Reihenfolge vom ersten bis zum letzten Behälter:
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
Der Index wird dann aufsteigend über diese Liste zugeordnet:
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
Regeln
Erstellen Sie eine Funktion oder ein Programm, das eine Liste beliebiger Größe mit nicht negativen Ganzzahlen erstellt, und geben Sie den Index aus oder geben Sie ihn aus. Sie können davon ausgehen , eine mindestens 2 Kürzeste Code gewinnt zu sein. Sie können 0-indizierte oder 1-indizierte Ausgaben verwenden, aber angeben, welche Sie verwenden. NB: Alle Beispiele hier sind 1-indiziert.
Beispielcode
Nicht golfen, in 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)
}
Testfälle
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