당신의 임무는 함수 나 프로그램을 작성하는 것입니다. 함수 나 n>0
입력 은 정수 를 입력으로 받아 n
차원 하이퍼 큐브 의 가장자리리스트를 출력합니다 . 그래프 이론에서 모서리는 연결된 2 개의 꼭짓점 (또는 원하는 경우 모서리)으로 정의됩니다.
실시 예 1
1 차원 하이퍼 큐브는 라인과 두 정점, 우리는 호출 기능 a
과 b
.
따라서 출력은 다음과 같습니다.
[[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]
같은 가장자리로 간주됩니다. - 출력물에 중복 모서리가 포함되어서는 안됩니다.
- 출력은 합리적인 형식 일 수 있습니다.
- 표준 허점은 금지되어 있습니다.
채점
가장 짧은 코드가 승리합니다.
답변
젤리, 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 A
와 B
정확히 하나의 좌표가 다르다.
두 번째 줄은 주요 프로그램입니다.
2ṗ
(Cartesian power of[1, 2]
)로 모든 모서리를 생성합니다 .œc2
(대체없이 크기 2의 조합)을 사용하여 가능한 모든 쌍을 가져옵니다 .- 앞에서 정의한 술어를 만족시키는 요소 만 유지하십시오 (
ÐḟÇ
).
답변
파이썬 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
인코딩 모두에 사용되는 i
과 j
통해 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]
답변
Mathematica, 48 24 바이트
EdgeList@*HypercubeGraph
내장 기능을 사용하는 익명의 함수일뿐입니다.
답변
자바 스크립트 (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 바이트를 추가로 절약했으며 이제 단일 루프를 사용합니다.
답변
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
답변
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.
답변
파이썬 2:59 바이트
lambda n:[(a,a|1<<l)for a in range(2**n)for l in range(n)if~a&1<<l]