3x3x3 큐브의 표면을 그래프로


18

당신의 임무는 54 정점으로 그래프를 생성하는 것입니다. 각각은 매직 큐브의 패싯에 해당합니다. 해당면이 한면을 공유하는 경우 두 꼭지점 사이에 모서리가 있습니다.

규칙

  • 알고리즘에서 그래프를 나타 내기 위해 인접 목록, 인접 행렬, 가장자리 목록 또는 적절한 형식을 출력하도록 선택할 수 있습니다. (인간이 읽을 수있는 시각적 그래프는 일반적으로 알고리즘에서 합리적인 형식이 아닙니다.)
  • 모든 정점을 자체에 인접하거나 자체에 인접하지 않게 할 수 있습니다.
  • 각 모서리에 대해 양방향을 포함하거나 (자체 루프의 경우 1-2 회 계산) 각 모서리에 대해 정확히 한 번만 출력 할 수 있지만 방법을 혼합하지는 마십시오.
  • 정점의 번호를 다시 매기거나 일부 숫자를 건너 뛰거나 원하는 방식으로 정점에 숫자가 아닌 레이블을 사용할 수도 있습니다. 번호가 명확하지 않은 경우 번호를 게시해야 다른 사람들이 더 쉽게 답변을 확인할 수 있습니다.
  • 이것은 코드 골프입니다. 바이트 단위의 최단 코드가 이깁니다.

출력 예

이것은 예제에서 사용 된 정점의 번호입니다.

          0  1  2
          3  4  5
          6  7  8
 9 10 11 18 19 20 27 28 29 36 37 38
12 13 14 21 22 23 30 31 32 39 40 41
15 16 17 24 25 26 33 34 35 42 43 44
         45 46 47
         48 49 50
         51 52 53

인접 목록으로 출력 (각 목록 앞의 정점 번호는 선택 사항) :

0 [1 3 9 38]
1 [2 4 0 37]
2 [29 5 1 36]
3 [4 6 10 0]
4 [5 7 3 1]
5 [28 8 4 2]
6 [7 18 11 3]
7 [8 19 6 4]
8 [27 20 7 5]
9 [10 12 38 0]
10 [11 13 9 3]
11 [18 14 10 6]
12 [13 15 41 9]
13 [14 16 12 10]
14 [21 17 13 11]
15 [16 51 44 12]
16 [17 48 15 13]
17 [24 45 16 14]
18 [19 21 11 6]
19 [20 22 18 7]
20 [27 23 19 8]
21 [22 24 14 18]
22 [23 25 21 19]
23 [30 26 22 20]
24 [25 45 17 21]
25 [26 46 24 22]
26 [33 47 25 23]
27 [28 30 20 8]
28 [29 31 27 5]
29 [36 32 28 2]
30 [31 33 23 27]
31 [32 34 30 28]
32 [39 35 31 29]
33 [34 47 26 30]
34 [35 50 33 31]
35 [42 53 34 32]
36 [37 39 29 2]
37 [38 40 36 1]
38 [9 41 37 0]
39 [40 42 32 36]
40 [41 43 39 37]
41 [12 44 40 38]
42 [43 53 35 39]
43 [44 52 42 40]
44 [15 51 43 41]
45 [46 48 17 24]
46 [47 49 45 25]
47 [33 50 46 26]
48 [49 51 16 45]
49 [50 52 48 46]
50 [34 53 49 47]
51 [52 44 15 48]
52 [53 43 51 49]
53 [35 42 52 50]

답변:


8

APL (Dyalog Classic) , 34 30 바이트

jimmy23013 님 덕분에 -4

4≥+/¨|∘.-⍨,(⍳3)∘.⌽7 ¯1∘.,○⍳3 3

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

인접하는 각 정점이있는 인접 행렬을 출력합니다.

⍳3 3 의 배열을 생성 (0 0)(0 1)(0 2)(1 0)(1 1)(1 2)(2 0)(2 1)(2 2)

모두 π를 곱하십시오

7 ¯1∘., 가능한 모든 방법으로 7 또는 -1을 추가하십시오

(⍳3)∘.⌽ 가능한 모든 방법으로 좌표 3 배를 0 1 2 단계 회전

+/¨|∘.-⍨, 각 쌍 사이의 맨해튼 거리 계산

4≥ 인접 패싯의 경우 4보다 크지 않아야합니다.


π를 사용하는 @ jimmy23013은 매우 좋습니다 :) 감사합니다!
ngn

54x54 매트릭스 ... 그게 인상적
밝은 돈

6

루비 , 79 바이트

54.times{|i|p [(i%6<5?i+1:i+18-i/6%3*7)%54,(i+=i%18<12?6:[18-i%6*7,3].max)%54]}

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

아래지도에 표시된대로 각 정점의 오른쪽 아래에있는 정점 목록으로 단방향 그래프의 표현을 인쇄합니다.

 0  1  2  3  4  5   
 6  7  8  9 10 11   
12 13 14 15 16 17   
         18 19 20 21 22 23
         24 25 26 27 28 29
         30 31 32 33 34 35
                  36 37 38 39 40 41
                  42 43 44 45 46 47 
                  48 49 50 51 52 53

4

파이썬 2.7, 145

def p(n):l=(3-n%2*6,n/6%3*2-2,n/18*2-2);k=n/2%3;return l[k:]+l[:k]
r=range(54)
x=[[sum((x-y)**2for x,y in zip(p(i),p(j)))<5for i in r]for j in r]

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

인접 행렬 x을 부울 값 목록의 목록으로 정의합니다 . 패싯은 자신과 인접한 것으로 간주합니다.

p(n)패싯이 2 단위 인 3x3x3 큐브의 n 번째 패싯 중심의 좌표를 계산합니다. 인접성은 2 개의 패싯이 5 미만의 제곱 거리를 갖는지 여부를 테스트하여 결정됩니다 (인접 패싯은 최대 4의 거리를 가지며 인접하지 않은 패싯은 6 이상의 거리를 가짐).


3

, 48 바이트

F⁷F⁷F⁷⊞υ⟦ικλ⟧≔Φυ⁼Φ﹪ι⁶¬﹪λ²⟦⁰⟧υIEυΦLυ⁼²ΣE§υλ↔⁻ν§ιξ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

F⁷F⁷F⁷⊞υ⟦ικλ⟧

[0..6]각 차원 의 범위에서 모든 3 차원 좌표 세트를 생성하십시오 .

≔Φυ⁼Φ﹪ι⁶¬﹪λ²⟦⁰⟧υ

의 중심들만 좌표 계속 2x2얼굴 중 하나에 사각형 x=0, y=0, z=0, x=6, y=6, z=6.

IEυΦLυ⁼²ΣE§υλ↔⁻ν§ιξ

각 좌표에 대해 택시 거리가 2 인 좌표의 색인을 인쇄하십시오.

꼭짓점의 번호는 다음과 같습니다.

         33 34 35
         21 22 23
          9 10 11
36 24 12  0  1  2 13 25 37 47 46 45
38 26 14  3  4  5 15 27 39 50 49 48
40 28 16  6  7  8 17 29 41 53 52 51
         18 19 20
         30 31 32
         42 43 44

웹에 숯에 대한 문서가 있습니까?
밝게 돈

@donbright 답변 제목의 GitHub 링크를 클릭하고 위키를 클릭하십시오.

2

볼프람 언어 190 바이트

다음은 실제 좌표를 기준으로 모든 그래프 가장자리를 반환합니다 (각 미니 큐브가 가장자리에 2 단위이고 루빅스 큐브의 원점이 왼쪽 하단 정점이라고 가정).

t=Table;h[a_,b_,c_]:=t[{x,y,z},{a,1,5,2},{b,1,5,2},{c,0,6,6}];Partition[Sort[a=Cases[DeleteCases[Tuples[Flatten[{h[x,z,y],h[y,z,x],h[x,y,z]},3],{2}],{x_,x_}],x_/;ManhattanDistance@@x==2]],4]

(* output *)
{{{{0,1,1},{0,1,3}},{{0,1,1},{0,3,1}},{{0,1,1},{1,0,1}},{{0,1,1},{1,1,0}}},{{{0,1,3},{0,1,1}},{{0,1,3},{0,1,5}},{{0,1,3},{0,3,3}},{{0,1,3},{1,0,3}}},{{{0,1,5},{0,1,3}},{{0,1,5},{0,3,5}},{{0,1,5},{1,0,5}},{{0,1,5},{1,1,6}}},{{{0,3,1},{0,1,1}},{{0,3,1},{0,3,3}},{{0,3,1},{0,5,1}},{{0,3,1},{1,3,0}}},{{{0,3,3},{0,1,3}},{{0,3,3},{0,3,1}},{{0,3,3},{0,3,5}},{{0,3,3},{0,5,3}}},{{{0,3,5},{0,1,5}},{{0,3,5},{0,3,3}},{{0,3,5},{0,5,5}},{{0,3,5},{1,3,6}}},{{{0,5,1},{0,3,1}},{{0,5,1},{0,5,3}},{{0,5,1},{1,5,0}},{{0,5,1},{1,6,1}}},{{{0,5,3},{0,3,3}},{{0,5,3},{0,5,1}},{{0,5,3},{0,5,5}},{{0,5,3},{1,6,3}}},{{{0,5,5},{0,3,5}},{{0,5,5},{0,5,3}},{{0,5,5},{1,5,6}},{{0,5,5},{1,6,5}}},{{{1,0,1},{0,1,1}},{{1,0,1},{1,0,3}},{{1,0,1},{1,1,0}},{{1,0,1},{3,0,1}}},{{{1,0,3},{0,1,3}},{{1,0,3},{1,0,1}},{{1,0,3},{1,0,5}},{{1,0,3},{3,0,3}}},{{{1,0,5},{0,1,5}},{{1,0,5},{1,0,3}},{{1,0,5},{1,1,6}},{{1,0,5},{3,0,5}}},{{{1,1,0},{0,1,1}},{{1,1,0},{1,0,1}},{{1,1,0},{1,3,0}},{{1,1,0},{3,1,0}}},{{{1,1,6},{0,1,5}},{{1,1,6},{1,0,5}},{{1,1,6},{1,3,6}},{{1,1,6},{3,1,6}}},{{{1,3,0},{0,3,1}},{{1,3,0},{1,1,0}},{{1,3,0},{1,5,0}},{{1,3,0},{3,3,0}}},{{{1,3,6},{0,3,5}},{{1,3,6},{1,1,6}},{{1,3,6},{1,5,6}},{{1,3,6},{3,3,6}}},{{{1,5,0},{0,5,1}},{{1,5,0},{1,3,0}},{{1,5,0},{1,6,1}},{{1,5,0},{3,5,0}}},{{{1,5,6},{0,5,5}},{{1,5,6},{1,3,6}},{{1,5,6},{1,6,5}},{{1,5,6},{3,5,6}}},{{{1,6,1},{0,5,1}},{{1,6,1},{1,5,0}},{{1,6,1},{1,6,3}},{{1,6,1},{3,6,1}}},{{{1,6,3},{0,5,3}},{{1,6,3},{1,6,1}},{{1,6,3},{1,6,5}},{{1,6,3},{3,6,3}}},{{{1,6,5},{0,5,5}},{{1,6,5},{1,5,6}},{{1,6,5},{1,6,3}},{{1,6,5},{3,6,5}}},{{{3,0,1},{1,0,1}},{{3,0,1},{3,0,3}},{{3,0,1},{3,1,0}},{{3,0,1},{5,0,1}}},{{{3,0,3},{1,0,3}},{{3,0,3},{3,0,1}},{{3,0,3},{3,0,5}},{{3,0,3},{5,0,3}}},{{{3,0,5},{1,0,5}},{{3,0,5},{3,0,3}},{{3,0,5},{3,1,6}},{{3,0,5},{5,0,5}}},{{{3,1,0},{1,1,0}},{{3,1,0},{3,0,1}},{{3,1,0},{3,3,0}},{{3,1,0},{5,1,0}}},{{{3,1,6},{1,1,6}},{{3,1,6},{3,0,5}},{{3,1,6},{3,3,6}},{{3,1,6},{5,1,6}}},{{{3,3,0},{1,3,0}},{{3,3,0},{3,1,0}},{{3,3,0},{3,5,0}},{{3,3,0},{5,3,0}}},{{{3,3,6},{1,3,6}},{{3,3,6},{3,1,6}},{{3,3,6},{3,5,6}},{{3,3,6},{5,3,6}}},{{{3,5,0},{1,5,0}},{{3,5,0},{3,3,0}},{{3,5,0},{3,6,1}},{{3,5,0},{5,5,0}}},{{{3,5,6},{1,5,6}},{{3,5,6},{3,3,6}},{{3,5,6},{3,6,5}},{{3,5,6},{5,5,6}}},{{{3,6,1},{1,6,1}},{{3,6,1},{3,5,0}},{{3,6,1},{3,6,3}},{{3,6,1},{5,6,1}}},{{{3,6,3},{1,6,3}},{{3,6,3},{3,6,1}},{{3,6,3},{3,6,5}},{{3,6,3},{5,6,3}}},{{{3,6,5},{1,6,5}},{{3,6,5},{3,5,6}},{{3,6,5},{3,6,3}},{{3,6,5},{5,6,5}}},{{{5,0,1},{3,0,1}},{{5,0,1},{5,0,3}},{{5,0,1},{5,1,0}},{{5,0,1},{6,1,1}}},{{{5,0,3},{3,0,3}},{{5,0,3},{5,0,1}},{{5,0,3},{5,0,5}},{{5,0,3},{6,1,3}}},{{{5,0,5},{3,0,5}},{{5,0,5},{5,0,3}},{{5,0,5},{5,1,6}},{{5,0,5},{6,1,5}}},{{{5,1,0},{3,1,0}},{{5,1,0},{5,0,1}},{{5,1,0},{5,3,0}},{{5,1,0},{6,1,1}}},{{{5,1,6},{3,1,6}},{{5,1,6},{5,0,5}},{{5,1,6},{5,3,6}},{{5,1,6},{6,1,5}}},{{{5,3,0},{3,3,0}},{{5,3,0},{5,1,0}},{{5,3,0},{5,5,0}},{{5,3,0},{6,3,1}}},{{{5,3,6},{3,3,6}},{{5,3,6},{5,1,6}},{{5,3,6},{5,5,6}},{{5,3,6},{6,3,5}}},{{{5,5,0},{3,5,0}},{{5,5,0},{5,3,0}},{{5,5,0},{5,6,1}},{{5,5,0},{6,5,1}}},{{{5,5,6},{3,5,6}},{{5,5,6},{5,3,6}},{{5,5,6},{5,6,5}},{{5,5,6},{6,5,5}}},{{{5,6,1},{3,6,1}},{{5,6,1},{5,5,0}},{{5,6,1},{5,6,3}},{{5,6,1},{6,5,1}}},{{{5,6,3},{3,6,3}},{{5,6,3},{5,6,1}},{{5,6,3},{5,6,5}},{{5,6,3},{6,5,3}}},{{{5,6,5},{3,6,5}},{{5,6,5},{5,5,6}},{{5,6,5},{5,6,3}},{{5,6,5},{6,5,5}}},{{{6,1,1},{5,0,1}},{{6,1,1},{5,1,0}},{{6,1,1},{6,1,3}},{{6,1,1},{6,3,1}}},{{{6,1,3},{5,0,3}},{{6,1,3},{6,1,1}},{{6,1,3},{6,1,5}},{{6,1,3},{6,3,3}}},{{{6,1,5},{5,0,5}},{{6,1,5},{5,1,6}},{{6,1,5},{6,1,3}},{{6,1,5},{6,3,5}}},{{{6,3,1},{5,3,0}},{{6,3,1},{6,1,1}},{{6,3,1},{6,3,3}},{{6,3,1},{6,5,1}}},{{{6,3,3},{6,1,3}},{{6,3,3},{6,3,1}},{{6,3,3},{6,3,5}},{{6,3,3},{6,5,3}}},{{{6,3,5},{5,3,6}},{{6,3,5},{6,1,5}},{{6,3,5},{6,3,3}},{{6,3,5},{6,5,5}}},{{{6,5,1},{5,5,0}},{{6,5,1},{5,6,1}},{{6,5,1},{6,3,1}},{{6,5,1},{6,5,3}}},{{{6,5,3},{5,6,3}},{{6,5,3},{6,3,3}},{{6,5,3},{6,5,1}},{{6,5,3},{6,5,5}}},{{{6,5,5},{5,5,6}},{{6,5,5},{5,6,5}},{{6,5,5},{6,3,5}},{{6,5,5},{6,5,3}}}}

각 외부 패싯에서 점을 생성하는 작업은 함수,에 의해 수행됩니다 h. x = 0, x = 6에서 포인트를 생성하려면 3 번 호출해야합니다. y = 0, y = 6; 및 z = 0, z = 6이다.

맨해튼 거리가 2 단위 인 각 패싯 점은 각 점에 연결됩니다.

다음과 같이 그래프 가장자리를 시각적으로 표시 할 수 있습니다. a아래에 화살표로 표시되는 그래프 가장자리의 목록입니다.

Graphics3D[{Arrowheads[.02],Arrow/@a},Boxed->False,Axes-> True]

pic1

다음은 Rubik의 큐브, 외부 패싯의 점 및 8 개의 그래프 모서리를 보여줍니다. pic2

빨간색 점은 y = 0 및 y = 6에서 패싯에 있습니다. 파란색 및 회색 점은 각각 x = 6 및 x = 0에서 패싯에 있습니다. 검은 점은 z = 6 및 z = 0에서 패싯에 있습니다.


멋진 사진, 화살촉은 정말 멋지다
밝게

1

-278 바이트

fn main(){let mut v=vec![];for x in vec![-2,0,2]{for y in vec![-2,0,2]{for z in vec![-2,2]{v.push([-1,z,x,y]);v.push([0,x,y,z]);v.push([1,x,z,y]);}}}for r in 0..54{print!("\n{} ",r);for s in 0..54{if (0..4).map(|n|v[r][n]-v[s][n]).map(|d|d*d).sum::<i32>()<5{print!("{} ",s)}}}}

play.rust-lang.org에서 시도하십시오

이것은 크지 만 컴파일 된 언어를위한 가장 작은 코드입니다 (지금까지). 인접 목록을 만듭니다. 그것은 cardboard_box의 python 답변과 매우 유사하지만 Quaternions가 작동하는지 확인하고 싶었습니다.

1 단계 : 각각 단일 패싯을 나타내는 54 개의 쿼터니언을 생성합니다.

2 단계 : 각 쿼터니언에 대해 다른 모든 쿼터니언을 사분면 (일명 제곱 거리, 차의 제곱 표준) <= 4로 나열합니다.

쿼터니언은 다음과 같이 구성됩니다. 허수 벡터 ijk는 -2, -2, -2에서 2,2,2, 2 단계의 그리드 셸에있는 점입니다. 실수 부분 w는 항상 -1, 0 또는 따라서 큐브의 반대쪽면이 동일한 실제 부분을 갖지만 인접한 측면이 다른 실제 부분을 갖도록합니다. 실제 부분은 계산을 통해 큐브의 다른 '면'을 구별 할 수 있습니다.

쿼터니언 번호 매기기 (입방체의 의사 등각 투영 3D 뷰) :

   ->i  ^j  \k

                  -2,+2,+2   +0,+2,+2  +2,+2,+2
                  -2,+0,+2   +0,+0,+2  +2,+0,+2
                  -2,-2,+2   +0,-2,+2  +2,-2,+2
                       w=0

   -2,+2,+2       -2 +2 +2   +0 +2 +2   +2 +2 +2     +2,+2,+2
   -2,+0,+2                                          +2,+0,+2
   -2,-2,+2       -2 -2 +2   +0 -2 +2   +2 -2 +2     +2,-2,+2

     -2,+2,+0       -2 +2 +0   +0 +2 +0   +2 +2 +0     +2,+2,+0
     -2,+0,+0                                          +2,+0,+0
     -2,-2,+0       -2 -2 +0   +0 -2 +0   +2 -2 +0     +2,-2,+0

       -2,+2,-2       -2 +2 -2   +0 +2 -2   +2 +2 -2     +2,+2,-2
       -2,+0,-2             w=1                          +2,+0,-2
       -2,-2,-2       -2 -2 -2   +0 -2 -2   +2 -2 -2     +2,-2,-2
           w=-1             w=1                              w=-1

                       -2,+2,-2   +0,+2,-2  +2,+2,-2
                       -2,+0,-2   +0,+0,-2  +2,+0,-2
                       -2,-2,-2   +0,-2,-2  +2,-2,-2
                            w=0

인덱스 번호 매기기 (펼친 큐브) :

                    16 34 52
                    10 28 46
                     4 22 40
         48 30 12   14 32 50  15 33 51
         42 24  6    8 26 44   9 27 45
         36 18  0    2 20 38   3 21 39
                     1 19 37
                     7 25 43
                    13 31 49
                     5 23 41
                    11 29 47
                    17 35 53



1

자바 스크립트 (ES6, 브라우저), 153 바이트

for(F=n=>(A=[n%9/3|0,n%3]).splice(n/18,0,(n/9&1)*3-.5)&&A,i=0;i<54;i++)for([a,b,c]=F(i),j=0;j<54;Math.hypot(a-d,b-e,c-f)>1||alert([i,j]),j++)[d,e,f]=F(j)

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

동일한 점을 인접하게하여 5 바이트를 줄 이도록 수정합니다. 즉 ||||1.

자바 스크립트 (ES6, 브라우저), 158 바이트

for(F=n=>(A=[n%9/3|0,n%3]).splice(n/18,0,(n/9&1)*3-.5)&&A,i=0;i<54;i++)for([a,b,c]=F(i),j=0;j<54;Math.hypot(a-d,b-e,c-f)>1||i-j&&alert([i,j]),j++)[d,e,f]=F(j)

온라인으로 사용해보십시오! ( alert와 시뮬레이션 console.log)

54 개의 모든 측면의 중심을 3 차원 공간에 매핑하고 0<||||1모든 포인트 쌍에 대해. 모든 방향 모서리를 숫자 쌍으로 출력합니다 [a, b]. 정점 맵은

47 50 53
46 49 52
45 48 51
20 23 26 11 14 17 35 32 29  8  5  2 
19 22 25 10 13 16 34 31 28  7  4  1 
18 21 24  9 12 15 33 30 27  6  3  0 
36 39 42
37 40 43
38 41 44

나는 심지어 Math.hypot가 있다는 것을 몰랐다
밝게
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.