N 차원 벡터 열거


17

양의 정수 k > 1와 음이 아닌 정수가 주어지면 음이 아닌 정수의- 튜플 (또는 차원 벡터)을 i생성합니다 . 모든 들어 , ℕ의에 ℕ에서지도 k는 , 전단 사해야합니다 . 즉, 모든 입력 은 다른 튜플을 생성해야하며 가능한 모든 튜플은 일부 입력에 의해 생성되어야합니다 .kkkii

STDIN (또는 가장 가까운 대안), 명령 행 인수 또는 함수 인수를 통해 입력을 받고 STDOUT (또는 가장 가까운 대안), 함수 리턴 값 또는 함수 (out) 매개 변수를 통해 결과를 출력하는 프로그램 또는 함수를 작성할 수 있습니다.

출력에 편리하고 명확한 플랫리스트 형식을 사용할 수 있습니다.

귀하의 솔루션에 인공을 제한해서는 안 k하고 i있지만, 당신은 그들이 언어의 기본 정수 크기에 맞는 것으로 가정 할 수있다. 최소한 255기본 정수 크기보다 작은 값을 지원해야합니다 .

어떤을 위해 1 < k < 32, 당신의 코드는 초 만에 결과를 생성한다 (당신의 대답은 지원하지 않는 경우 물론, 이전 규칙에 그 큰 인해를 제한 그에 따라 조정됩니다). 이것은 아무 문제가 없어야합니다 : 그것은 2까지 작동하도록이 문제를 해결하는 것이 가능하다 (128) 몇 초 만 제한 실제로으로 반복으로부터 피하기 답변을 거기 에 대한 결과를 찾을 수 있습니다.i < 231i0i

선택한 매핑에 대한 설명과 그것이 왜 형용사인지에 대한 정당성을 답에 포함 시키십시오 (이는 공식적인 증거 일 필요는 없습니다).

이것은 코드 골프이며, 가장 짧은 대답 (바이트)이 이깁니다.

관련 도전

답변:


5

Pyth, 15 12 바이트

ms+0_%Q>_zdQ

테스트 스위트

내 변환은 xnor 중 하나와 비슷하지만 기본 10에서 입력을 k 개의 개별 숫자로 압축 해제하여 작동합니다.

n = 21003034
k = 3

21003034
 1  3  4    134
2  0  3     203
  0  0        0

숫자는 가장 오른쪽 자릿수의 내림차순으로 정렬되므로 모든 숫자 그룹의 모든 정렬이 가능합니다.

코드가 작동하는 방식은 입력을 뒤집은 다음 마지막 0, 1, ... k-1숫자를 잘라낸 다음 모든 숫자를 빼고 k다시 뒤집고 0시작 부분에 a 를 붙이고 int로 변환하는 것입니다.


4

CJam, 20 바이트

q~({4b2fmd2/z2fb~p}*

이 답변 의 매핑을 k-1 회 적용하므로 매핑은 형용 적 입니다.

프로그램은 입력을로 읽습니다 i k. CJam 통역사 에서 온라인으로 사용해보십시오 .

생각

f (i) 를 다음과 같이 정의 하여 bijective mapping f : N → N 2 를 구성 할 수 있습니다 .

  • i 를 이진수의 배열로 변환합니다 .

  • 홀수 자릿수가있는 경우이 배열 앞에 0 을 추가하십시오 .

  • 결과 배열을 디 인터리빙하여 프로세스에서 새로운 배열로 만듭니다.

  • 이 배열을 밑이 2에서 정수로 변환하십시오. f 1 (i)f 2 (i) 를 결과로 정의하십시오 .

전단 사 사상 얻으려면 g : N → N 3 , 우리가 정의 할 수 g (N) =을 (F 1 (I), F (1) (F 2 (I)), F (2) (F 2 (I))) .

전단 사 사상 얻으려면 H : N → N 4 , 우리는 정의 할 수 = (g : (I) (H)을 1 (I), g (2) (I), F (1) (g 3 (I)), F (2) (g (3) ( i))) .

위의 과정을 계속하여 결국 우리는 bijective 맵 N → N k에 도달 합니다.

암호

q~      e# Read and evaluate all input. This pushes i and k.
({      e# Do k-1 times:
  4b    e#   Convert the integer on the stack (initially i) to base 4.
  2fmd  e#   Replace each base-4 digit d by d/2 and d%2.
  2/    e#   Split into the chunks [d/2 d%2].
  z     e#   Transpose. This collects all quotients in one array and all
        e#   residues in another one.
  2fb   e#   Convert each array from base 2 to integer.
  ~     e#   Dump both integers on the stack.
  p     e#   Print the topmost one.
}*      e#

xnor의 아이디어는 20 바이트를 제공합니다 (또는 내가보다 골프를 잘한다면 더 적습니다) : q~2bW%1$Te]/zWf%2fbp(반대 입력 순서)
Martin Ender

3

CJam, 18 바이트

q~({)2bW%_1#p))b}*

더 바보 같은 공식을 사용합니다.

여기서 사용해보십시오 .

설명

q~          e# Read input.
({          e# Repeat k-1 times:
    )       e# Increment the current integer (initially i), to make it positive.
    2b      e# Convert to binary.
    W%      e# Reverse the binary.
            e# The result can be any non-empty binary string without trailing 0s.
    _1#     e# Find the position of the first 1, or the number of initial 0s.
    p       e# Print.
    )       e# Extract the final bit, which is always 1.
            e# An array that can be any binary string is left in the stack.
    )       e# Increment the 1 to make it 2.
    b       e# Convert the binary string to a number using base 2.
            e# Only the number of initial 0s doesn't affect the result,
            e# which is exactly what is printed before.
}*          e# The final integer is printed automatically when the program ends.

요약하면, 양의 정수를 다음에 맵핑합니다.

  1. 후행 0의 수입니다.
  2. 후행 0이 제거되고 반전되고 후행 (원래 초기) 1이 제거 된 원래 정수입니다.

3

파이썬 2, 62

lambda z,k:[int('0'+bin(z)[~i:1:-k][::-1],2)for i in range(k)]

이 코드는 추악하고 골치 거리지 만 아이디어는 매우 간단합니다.

포장 k마다 읽어 하나로 바이너리 확장을 k다른 오프셋 (offset)와 일 자리를. 예를 들어을 사용 k=3하면 입력이 다음에 357매핑됩니다 (3,0,7).

101100101 <- 357
  1  0  1 -> 5
 0  0  0  -> 0
1  1  1   -> 7

숫자를 다시 집어 넣으면 숫자가 거꾸로되기 때문에 궤적입니다. 그렇게 할 때 이진 확장은 무한한 선행 0을 갖는 것으로 생각하십시오.


3

J, 38 28 27 바이트

(({.,g^:_1@}.)g=:_ q:>:)~<:

이것은 왼쪽과 오른쪽 인수로 ik 를 사용 하는 암묵적이고 이완적인 동사입니다 . J.js로 온라인으로 사용해보십시오 .

생각

우리는지도 정의 N → N의 : F (K) 에 의해 = (α : F (I) (1) , ... α K-1 , P 1 α K ... P 2 α의 K + 1 - 1 ...) , ⟨p는 N 는 IS를 소수의 순서와 난 + 1 = P (1) α (1) P (2) α 2 ... .

기본 산술 정리에 의해 g (i) : = (α 1 , α 2 ,…)에 의해 정의 된 맵 g : N → N ω ( i + 1의 소인수 분해 지수 )는 형용사입니다.

이후 F (I) = (g (1) (I) ... g K-1 (I), g -1 (g의 K (Ⅰ), g K + 1 (i)는, ...)) ,지도 상에 F가 같은 전단 사이며 잘.

암호

                            Left argument: i -- Right argument: k
                         <: Decerement k.
(                      )~   Reverse the order of the arguments and apply the
                            dyadic verb inside the parentheses to k-1 and i.
              g=:            Define a monadic helper verb g:
                     >:       Increment its right argument.
                 _ q:         Calculate the exponents of the prime factorization.
                             (implicit) Apply g to i.
(            )               Apply the dyadic verb inside the parentheses to k-1
                             and (g i).
           }.                 Drop the first k-1 elements of (g i)...
          @                   and...
     g^:_1                    apply the inverse of g to the result.
  {.                          Take the first k-1 elements of (g i).
    ,                         Append the rightmost result to the leftmost one.

왜 기능이 형용사입니까?
xnor

@xnor 실수로 두 개의 인덱스를 교환했기 때문에 적어도 내 설명에서 하나는 아닙니다. 증명 스케치를 추가했습니다.
데니스

1

파이썬 2, 72

q=lambda z:z and z%2+2*q(z/4)
g=lambda z,k:1/k*[z]or[q(z)]+g(q(z/2),k-1)

이 함수 q는 끝에서 시작하여 모든 2 비트를 가져와 이진수에 작용합니다. 결과적으로 q(z), q(z>>1)이진수가 산재 해있는 두 개의 숫자가 제공 z됩니다. 예를 들어 594는 12와 17로 나뉩니다.

1001010010   <- 594
 0 1 1 0 0   ->  12
1 0 0 0 1    ->  17

우리는 원래 숫자를 복구하기 위해 숫자를 다시 압축 할 수 있기 때문에 bijection입니다.

이 기능은 g이 bijection k-1시간을 적용 하여 단일 요소에서 쌍으로, 트리플 ...에서- k튜플로 확장합니다. 매번 마지막 요소가 두 요소로 확장됩니다. 이것은 bijection을 통해 입력을 쌍으로 맵핑하고 출력의 첫 번째 항목에 대한 쌍의 첫 번째 요소를 가져 와서 k-1나머지 항목을 생성하기 위해 두 번째 요소에 재귀 적으로 함수를 적용하여 반복적으로 수행 됩니다.


이 방법을 너무 복잡하게 만들고 있다는 것을 깨달았습니다 ...
xnor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.