Stiamo mettendo le palline in un numero fisso un bidone. Questi bidoni iniziano vuoti.
Empty bin (a=4): 0 0 0 0
E uno per uno aggiungiamo le palle ai bidoni.
0 0 0 1 or
0 0 1 0 or
0 1 0 0 or
1 0 0 0
Abbiamo bisogno di un modo rapido per passare in rassegna tutti i possibili stati dei bin, senza duplicati e senza perderne nessuno e non vogliamo elencare tutti i possibili bin. Quindi invece assegniamo a ciascun bin-configuration un indice.
Assegniamo l'indice ordinando le possibili configurazioni in un modo specifico:
- Ordinamento crescente per somma: quindi prima
0 0 0 0
, quindi le possibili configurazioni con 1 palla aggiunta, quindi 2, ecc. Quindi ordina all'interno di ogni somma in ordine crescente, dal primo cestino all'ultimo:
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
L'indice viene quindi assegnato in ordine crescente attraverso questo elenco:
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
Regole
Crea una funzione o un programma che prende un elenco di qualsiasi dimensione con numeri interi non negativi e stampa o genera il suo indice. È possibile supporre un essere almeno 2. vittorie codice breve. È possibile utilizzare output indicizzato 0 o indicizzato 1, ma specificare quale utilizzare. NB: tutti gli esempi qui sono 1 indicizzati.
Codice di esempio
Non giocato a golf, 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)
}
Casi test
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