이제 우리는 n 차원으로 생각하고 있습니다!


9

질문 : 주어진 숫자 n≥ 2, 얼마나 많은 서로 다른 점 쌍 온 n차원 n x n x n x n x n x n ... x n좌표 범위 격자 0n - 1, 거리입니다 최소 n 간격은? 쌍 {(2,1,3,1), (3,2,1,3)}과는 {(3,2,1,3), (2,1,3,1)}들이 역순으로 동일한 두 개의 점으로 구성되어, 서로 별개의 것으로 간주되지 않는다. 총 쌍 수는 매우 빠르게 증가합니다. 총 쌍의 수는 간다 6, 351, 32 640, 4 881 250, 1 088 367 840, 등

테스트 사례 :

2 -> 0 (all pairs are at most a distance of sqrt(2) < 2 apart)
3 -> 28 (They must either be (2,2,1) or a permutation apart, or (2,2,2) apart. Each corner
has three non-corner (2,2,1) points corresponding to it. And each corner is associated 
with a corner pair that is a (2,2,2). Thus. 3.5 * 8 = 28.
4 -> 4,888
5 -> 1,501,948
6 -> 486,039,360 (I would like someone to verify this if possible)

적어도 이론적으로 n <= 5 동안 코드가 작동해야합니다. 그것을 하드 코딩하지 마십시오. 그것은 표준 허점입니다.



^ n=15쉽게 결과를 얻을 수있는 프로그램
Leaky Nun

tinyurl.com/ya2kmb24 <-C로 포팅되어 계산할 수 n=20있지만 오버플로로 심하게 고통
받음

거리는 어떻게 측정합니까? 유클리드 메트릭? 아니면 L_1을 사용하는 격자입니까?
피터 테일러

테스트 사례에서 @PeterTaylor를 사용하면 유클리드 거리를 사용하고 all pairs are at most a distance of sqrt(2) apart있지만 더 명확하게 지정해야합니다.
주세페

답변:


3

MATL , 12 바이트

tt:Z^tZPR>~z

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

설명

tt   % Implicit input n. Duplicate twice
     % STACK: n, n, n
:    % Range [1 2 ... n]
     % STACK: n, n, [1 2 ... n]
Z^   % Cartesian power. Gives an n^n × n matrix C where each row is a Cartesian tuple
     % STACK: n, C
t    % Duplicate
     % STACK: n, C, C
ZP   % Euclidean distance. Gives an n^n × n^n matrix D of pairwise distances
     % STACK: n, D
R    % Upper triangular part: sets elements below the main diagonal to 0. Call that U
     % STACK: n, U
>~   % Less than or equal? Element-wise. Gives a true-false matrix B
     % STACK: n, B
z    % Number of nonzeros. Implicitly display
     % STACK: number of entries in B that equal true

2

젤리 , 14 13 바이트

Dennis 덕분에 1 바이트.

ṗ⁸Œc_/€ÆḊ€<ċ0

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

빠른 마프 버전

ŒgL€!P:@L!$×P
²S<
ḶœċçÐḟ²ð>0S’2*×⁸ạ⁹$Ѥð€S

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


이것을 실행하기 위해 어떤 통역사를 사용하십니까? 나는 그것을 시도하고 싶지만 TIO는 n = 5 (1 분 후 시간 초과)에 너무 느립니다 prntscr.com/hqbcph
리깅

@ bushdid911 한계를 깰 경우 한계가 깨질 것입니다
Leaky Nun

당신은 대체 할 수 있습니다 æ.`½ÆḊ€.
dylnan

@ bushdid911 n=5단 1 분 만에 실행할 수 있습니다 . (우주의 나이보다 오래 걸릴 수 있으므로 조심하십시오.) 이것은 가장 빠른 코드가 아니므로 왜 코드를 빨리 실행해야합니까?
user202729

1
@ bushdid911 나는 빠른 버전을 만들었습니다.
Leaky Nun


2

J , 40 바이트

2%~[:+/^:_]<:[:+/&.:*:"1[:-"1/~#~#:i.@^~

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

확장 정밀도를 사용하는 경우 ( 5x대신 5) TIO에서 5를 초과합니다 . 나는 내 컴퓨터에서 6을 시도해도 귀찮게하지 않을 것입니다.

골프에 대한 조언, 특히 좌표 생성이 지난 부분을 찾고 있습니다. 캡을 제거 할 수있는 방법이 있어야한다고 생각합니다.

]<:[:+/&.:*:"1로 동등하게 대체 될 수 있습니다 *:<:[:+/"1[:*:.

설명

이 설명은 REPL에서 수행됩니다 (세 개의 공백은 명령을 나타내고 공백은 출력을 나타냅니다). 나는 그 답을 쌓을 것이다.

좌표 생성

#~ #: i.@^~ 격자에 관심있는 모든 좌표를 제공합니다.

^~는 그 자체로 올린 수이며, i.n이 입력 인 범위 [0, n)을 제공합니다. @이러한 기능을 구성합니다.

   i.@^~ 2
0 1 2 3

#~ 숫자 자체를 복사합니다. 예 :

   #~ 3
3 3 3

#:오른쪽 인수를 왼쪽 인수로 지정된 배열에 지정된 기준으로 변환합니다 . 배열의 자릿수는 해당 기본 출력의 자릿수에 해당합니다 (그리고 혼합 된 자릿수를 가질 수 있음). 예를 들어,

   3 3 3 #: 0
0 0 0
   5 5 #: 120
4 0
NB. If you want 120 base 5 use #.inv
   #.inv 120
4 4 0

따라서 모두 함께, 이것은 기본 n (n은 입력)을 n ^ n까지 모든 값을 통해 열거하여 효과적으로 좌표를 제공합니다.

   (#~ #: i.@^~) 2
0 0
0 1
1 0
1 1

각 쌍 사이의 거리 얻기

먼저 dyad /-table 및 ~-reflexive를 사용하여 다른 모든 좌표와 각 좌표의 차이를 가져 옵니다. 이것은 순서가 쌍에 중요하지 않다는 사실을 설명하지 않습니다. 이것은 중복 거리를 생성합니다.

  NB. 2 {. takes the first two elements (I'm omitting the rest).
  2 {. -"1/~ (#~ #: i.@^~) 2
 0  0
 0 _1
_1  0
_1 _1

 0  1
 0  0
_1  1
_1  0

그런 다음 +/&.:*:각 동사에이 동사 를 사용합니다 (에서 "1일명 순위). 이 동사는 +/( &.:) 제곱 ( *:) 아래의 합계 ( )입니다. 아래에서 오른쪽 동사 (사각형)를 적용한 다음 결과를 수집하여 왼쪽 동사 (합)에 대한 인수로 제공합니다. 그런 다음 오른쪽 동사의 역수를 적용합니다 (제곱근).

   +/&.:*: 3 4
5
   +/&.:*:"1 ([: -"1/~ #~ #: i.@^~) 2
      0       1       1 1.41421
      1       0 1.41421       1
      1 1.41421       0       1
1.41421       1       1       0

당연히, 많은 거리가 동일합니다.

입력보다 크거나 같은 거리 계산

마지막 부분은를 사용하여 거리가 입력보다 크거나 같은지 확인합니다 ]<:. 그런 다음 모든 결과는 +/^:_(수렴 할 때까지의 합계)를 사용하여 합산 되어 정확한 값의 수를 계산합니다. 그런 다음이 값은 2로 나뉩니다 ( 2%~, 여기서 ~제공된 인수의 순서를 바꿉니다 %). 우리가 2로 나눌 수있는 이유는 각각의 진실한 페어링에 대해 자신과 조정되는 페어링을 제외하고 뒤집힌 순서에 대한 다른 것이 있기 때문입니다 . 그러나 거리가 0이되기 때문에 괜찮습니다.


1
35 +/@,@(-:@<:+/&.:*:@:-"1/~)#~#:i.@^~
마일
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.