우리는 고정 된 수 의 쓰레기통 에 공을 넣습니다 . 이 쓰레기통은 비워집니다.
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
우리는 빈이 가지고있는 가능한 모든 상태를 반복하고 빠뜨리지 않고 반복 할 수있는 빠른 방법이 필요하며 가능한 모든 빈을 열거하고 싶지 않습니다. 대신 각 bin 구성에 인덱스를 할당합니다.
가능한 구성을 특정 방식으로 정렬하여 색인을 지정합니다.
- 합계를 기준으로 오름차순으로 정렬 : 먼저
0 0 0 0
, 1 개의 공이 추가 된 후 가능한 구성 등 그런 다음 각 합계 내에서 첫 번째 빈에서 마지막 빈까지 오름차순으로 정렬하십시오.
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 인덱스를 사용할 수 있지만 사용할 것을 지정하십시오. 주의 : 여기에있는 모든 예는 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