샘플을 인덱스로 변환


12

우리는 고정 된 수 쓰레기통 에 공을 넣습니다 . 이 쓰레기통은 비워집니다.

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 구성에 인덱스를 할당합니다.

가능한 구성을 특정 방식으로 정렬하여 색인을 지정합니다.

  1. 합계를 기준으로 오름차순으로 정렬 : 먼저 0 0 0 0, 1 개의 공이 추가 된 후 가능한 구성 등
  2. 그런 다음 각 합계 내에서 첫 번째 빈에서 마지막 빈까지 오름차순으로 정렬하십시오.

    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
    
  3. 그런 다음이 목록을 통해 오름차순으로 색인이 지정됩니다.

    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

카운트의 숫자가 다른 경우 연결의 숫자 값을 기준으로 정렬하는 방법은 무엇입니까?
TheBikingViking

@TheBikingViking 흠, 그 생각하지 않았다, 나는 예제 코드와 테스트 사례를 반영하기 위해 문구를 변경했습니다. 각 합계 내에서 구성이 첫 번째 빈에서 먼저 정렬 된 다음 두 번째 빈에서 정렬됩니다.
JAD

답변:


3

젤리 , 8 바이트

S0rṗLSÞi

온라인으로 사용해보십시오!

무차별 대입 솔루션. 첫 번째 테스트 사례는 TIO에 비해 너무 많지만 랩톱에서 로컬로 확인했습니다. 두 번째 테스트 사례에는 데스크톱 컴퓨터에도 RAM이 너무 많이 필요합니다.

작동 원리

S0rṗLSÞi  Main link. Argument: A (array)

S         Compute the sum s of A.
 0r       Create the range [0, ..., s].
    L     Yield the length l of A.
   ṗ      Cartesian power; yield the array of all l-tuples over [0, ..., s], in
          lexicographical order.
     SÞ   Sort the l-tuples by their sums. The sorting mechanism is stable, so
          l-tuples with the same sum are still ordered lexicographically.
       i  Find the index of A in the generated array of tuples.

좋은. RAM에 대한 당신의 말은이 도전의 근원을 상기시켜주었습니다. 내 논문의 경우, 나는 a = 8 이고 가능한 한 높은 공에 대해 가능한 모든 배열을 반복해야했습니다 . 배열을 인덱스로 변환하고 그 루프를 반복하는 아이디어는 RAM의 한계에서 온 것입니다 .P
JAD

그렇기 때문에 예제 코드가 그렇게 까다로운 이유도 있습니다. : P
JAD

1

클로저, 152 바이트

#(loop[v[(vec(repeat(count %)0))]i 1](if-let[r((zipmap v(range))%)](+ r i)(recur(sort(set(for[v v i(range(count v))](update v i inc))))(+ i(count v)))))

생각만큼 쉽지는 않습니다. 덜 골프 버전 :

(def f (fn[t](loop[v[(vec(repeat(count t)0))]i 1]
               (if-let[r((zipmap v(range))t)](+ r i)
                 (recur (sort-by (fn[v][(apply + v)v]) (set(for[v v i(range(count v))](update v i inc))))
                        (+ i(count v)))))))

현재 상태에 대한 루프 v의 요소에서 해시 맵 생성 v(가) 다음 발견되는 상태를 검색 할 경우 그 순위가 반환 (+ 이전에 본 상태의 수)되고, 자신의 순위에 있습니다. 발견되지 않으면 새로운 가능한 상태 세트로 반복됩니다.

실제로 각 루프 내의 모든 상태가 동일한 합계를 갖기 때문에 사용자 정의 정렬 기능이 필요하지 않습니다. [3 1 4 1 5 9]2.6 초 밖에 걸리지 않았지만 예상만큼 느리지 않습니다 .


1

Mathematica, 50 바이트

의 포트 데니스 젤리 대답 .

0~Range~Tr@#~Tuples~Length@#~SortBy~Tr~Position~#&

이름없는 함수를 입력으로 정수 목록을 가져 와서 출력으로 단일 정수로 깊이 -2 목록을 리턴합니다. 예를 들어, 마지막 테스트 케이스의 입력은 {1,0,0,0,0,1}이고 출력은 {{23}}입니다.

약간 ungolfed 버전은 다음과 같습니다

Position[SortBy[Tuples[Range[0,Tr[#]],Length[#]],Tr],#]&

종종 우리는 접두어 표기법 (사용하여 티카에서 개별 바이트를 저장할 수 있습니다 function@n대신 function[n])과 중위 표기 ( a~function~b대신을 function[a,b]). 그러나 결과 코드가 Mathematica의 고유 우선 순위 순서와 잘 맞물려 함수가 적용되는 경우에만 작동합니다. 나는 여기에 대괄호 6 세트로 실제로 모든 것을 제거 하고 (불쾌한 브라켓이없는) 제출 코드로 6 바이트를 절약하는 데 일한 것에 놀랐습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.