하이퍼 큐브의 가장자리


12

당신의 임무는 함수 나 프로그램을 작성하는 것입니다. 함수 나 n>0입력 은 정수 를 입력으로 받아 n차원 하이퍼 큐브 의 가장자리리스트를 출력합니다 . 그래프 이론에서 모서리는 연결된 2 개의 꼭짓점 (또는 원하는 경우 모서리)으로 정의됩니다.

실시 예 1

1 차원 하이퍼 큐브는 라인과 두 정점, 우리는 호출 기능 ab.

여기에 이미지 설명을 입력하십시오

따라서 출력은 다음과 같습니다.

[[a, b]]

실시 예 2

4 차원 하이퍼 큐브 (또는 tesseract)는 32 개의 모서리로 구성되며 그래프는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

출력은 다음과 같습니다

[[a, b], [a, c], [a, e], [a, i], [b, d], [b, f], [b, j], [c, d], [c, g], [c, k], [d, h], [d, l], [e, f], [e, g], [e, m], [f, h], [f, n], [g, h], [g, o], [h, p], [i, j], [i, k], [i, m], [j, l], [j, n], [k, l], [k, o], [l, p], [m, n], [m, o], [n, p], [o, p]]

규칙

  • 이름이 고유 한 한 원하는대로 정점의 이름을 지정할 수 있습니다.
  • 가장자리는, 즉 방향성이 있습니다 [a, b][b, a]같은 가장자리로 간주됩니다.
  • 출력물에 중복 모서리가 포함되어서는 안됩니다.
  • 출력은 합리적인 형식 일 수 있습니다.
  • 표준 허점은 금지되어 있습니다.

채점

가장 짧은 코드가 승리합니다.



[1,2], [2,3] 등은 괜찮습니까?
Rɪᴋᴇʀ

@EasterlyIrk Yep.
murphy

가장자리는 어떤 순서로도 출력 될 수 있습니다.
Luis Mendo

@DonMuesli 맞습니다.
murphy

답변:


4

젤리, 13 바이트

ạ/S’
2ṗœc2ÇÐḟ

여기에서 시도하십시오. input 3의 경우 출력은 다음과 같습니다.

[[[1, 1, 1], [1, 1, 2]],
 [[1, 1, 1], [1, 2, 1]],
 [[1, 1, 1], [2, 1, 1]],
 [[1, 1, 2], [1, 2, 2]],
 [[1, 1, 2], [2, 1, 2]],
 [[1, 2, 1], [1, 2, 2]],
 [[1, 2, 1], [2, 2, 1]],
 [[1, 2, 2], [2, 2, 2]],
 [[2, 1, 1], [2, 1, 2]],
 [[2, 1, 1], [2, 2, 1]],
 [[2, 1, 2], [2, 2, 2]],
 [[2, 2, 1], [2, 2, 2]]]

[1, 1, 1]등이 괜찮은 "이름" 이기를 바랍니다 .

설명

첫 번째 라인은 한 쌍의 에지에 "술어"이다 [A, B] ạ/S’같은지에 sum(abs(A - B)) - 1영 (거짓 Y) 인 IFF AB정확히 하나의 좌표가 다르다.

두 번째 줄은 주요 프로그램입니다.

  • 2ṗ(Cartesian power of [1, 2])로 모든 모서리를 생성합니다 .
  • œc2(대체없이 크기 2의 조합)을 사용하여 가능한 모든 쌍을 가져옵니다 .
  • 앞에서 정의한 술어를 만족시키는 요소 만 유지하십시오 ( ÐḟÇ).

1
ạ/S’2ṗœc2ÇÐḟ바이트의 몇 가지를 저장합니다.
Dennis

c/P=2, 2ṗṗ2ÇÐf너무 작동합니다.
Dennis

스마트 한 "이름 지정"체계! 확실히 규칙 내에서.
murphy

9

파이썬 2, 54 56 62 바이트

lambda n:{tuple({k/n,k/n^1<<k%n})for k in range(n<<n)}

파이썬은 세트 요소가 해시 가능해야하므로 튜플로 변환되는 것을 제외하고 세트 세트를 만들어 중복 모서리를 제거합니다. 세트 참고 {a,b}하고 {b,a}같은 튜플 같고 변환합니다. xsot는로 2 바이트를 절약했습니다 n<<n.

세트 문자열이 출력 형식 인 경우 49 바이트로 줄일 수 있습니다.

lambda n:{`{k/n,k/n^1<<k%n}`for k in range(n<<n)}

다음과 같은 출력을 제공합니다

set(['set([1, 3])', 'set([2, 3])', 'set([0, 2])', 'set([0, 1])'])

lambda n:[(k/n,k/n^1<<k%n)for k in range(n*2**n)if k/n&1<<k%n]

먼저 이전 버전의 솔루션을 살펴 보겠습니다.

lambda n:[(i,i^2**j)for i in range(2**n)for j in range(n)if i&2**j]

간격의 각 숫자 [0,2^n)n-비트 이진 문자열로 지정된 좌표를 가진 꼭짓점에 해당합니다 . 정점이 단일 비트가 다르면, 즉 2의 거듭 제곱을 xoring하여 하나가 다른 경우에 인접합니다.

이 익명 함수는 모든 정점과 모든 비트 위치를 뒤집어서 가능한 모든 모서리를 생성합니다. 가장자리를 양방향으로 복제하지 않으려면 1 만 0으로 뒤집습니다.

더 golfed 용액에서 k인코딩 모두에 사용되는 ij통해 k=n*i+j있는, (i,j)으로서 추출 될 수있다 (k/n,k%n). 이것은 이해에 루프를 저장합니다. 올바른 조작자가 우선권을 갖도록 권한 2이 수행됩니다 1<<.

각 정점 쌍을 생성하고 비트가 약간 떨어져 있는지 확인하는 다른 방법은 더 길다 (70 바이트).

lambda n:[(i,x)for i in range(2**n)for x in range(i)if(i^x)&(i^x)-1<1] 

1
n*2**n그냥n<<n
xsot

Python 3.5로 전환 lambda n:{(*{k//n,k//n^1<<k%n},)for k in range(n<<n)}하면 바이트가 절약됩니다. (별표가 표시된 표현식은 3을 저장하지만 나누기 구문은 2를 잃습니다.) 그러나 49 바이트 솔루션은 괜찮습니다.
Lynn

4

Mathematica, 48 24 바이트

EdgeList@*HypercubeGraph

내장 기능을 사용하는 익명의 함수일뿐입니다.


아 내장! 알파벳순으로 정점의 이름을 지정할 필요가 없으므로을 생략 할 수 있습니다 FromLetterNumber. 나는 심지어 EdgeList@*HypercubeGraph올바른 대답 이라고 생각 합니다.
murphy

3

자바 스크립트 (SpiderMonkey 30+), 69 64 바이트

n=>[for(i of Array(n<<n).keys())if(i/n&(j=1<<i%n))[i/n^j,i/n^0]]

이것은 @xnor의 Python 2 솔루션 포트로 시작되었지만 단일 루프를 사용하도록 코드를 다시 작성하여 9 바이트를 절약 할 수있었습니다. 편집 : i@ xnor의 업데이트 된 솔루션에 따라 다른 방법으로 분할 하여 5 바이트를 추가로 절약했으며 이제 단일 루프를 사용합니다.


2

MATL , 20 바이트

2i^:qt!Z~Zltk=XR2#fh

언어 / 컴파일러의 현재 버전 (14.0.0) 에서 작동합니다 .

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

설명

이것은 @ xnor 's answer 와 거의 동일한 아이디어를 사용합니다 .

2i^    % take input n and compute 2^n
:q     % range [0,1,...,2^n-1] (row vector)
t!     % duplicate, transpose into a column vector
Z~     % bitwise XOR with broadcast
Zl     % binary logarithm
tk     % duplicate and round down
=      % true if equal, i.e. for powers of 2
XR     % upper triangular part, above diagonal
2#f    % row and index columns of nonzero values
h      % concatenate vertically

2

Pyth, 13 바이트

fq1.aT.c^U2Q2

입력 3의 출력 :

[[[0, 0, 0], [0, 0, 1]], [[0, 0, 0], [0, 1, 0]], [[0, 0, 0], [1, 0, 0]], [[0, 0, 1], [0, 1, 1]], [[0, 0, 1], [1, 0, 1]], [[0, 1, 0], [0, 1, 1]], [[0, 1, 0], [1, 1, 0]], [[0, 1, 1], [1, 1, 1]], [[1, 0, 0], [1, 0, 1]], [[1, 0, 0], [1, 1, 0]], [[1, 0, 1], [1, 1, 1]], [[1, 1, 0], [1, 1, 1]]]

설명:

fq1.aT.c^U2Q2
                  Implicit: input = Q
        ^U2Q      All Q entry lists made from [0, 1].
      .c    2     All 2 element combinations of them.
f                 Filter them on
   .aT            The length of the vector
 q1               Equaling 1.

1

파이썬 2:59 바이트

lambda n:[(a,a|1<<l)for a in range(2**n)for l in range(n)if~a&1<<l]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.