Powierzchnia sześcianu 3x3x3 jako wykres

18

Twoim zadaniem jest wygenerowanie wykresu z 54 wierzchołkami, z których każdy odpowiada aspektowi na kostce Rubika. Pomiędzy dwoma wierzchołkami znajduje się krawędź, jeśli odpowiednie fasety mają wspólny bok.

Zasady

  • Możesz zdecydować się na wydrukowanie listy sąsiedztwa, macierzy sąsiedztwa, listy krawędzi lub dowolnego rozsądnego formatu do przedstawienia wykresu w algorytmie. (Graficzny wykres czytelny dla człowieka zazwyczaj nie jest rozsądnym formatem w algorytmie w większości przypadków).
  • Możesz ustawić każdy wierzchołek przylegający do siebie lub żaden przylegający do siebie.
  • Możesz albo uwzględnić oba kierunki dla każdej krawędzi (policzyć jeden lub dwa razy dla pętli własnych), albo wypisywać dokładnie jeden raz dla każdej krawędzi, ale nie mieszaj różnych sposobów.
  • Możesz przenumerować wierzchołki, pominąć niektóre liczby, a nawet użyć etykiet numerycznych dla wierzchołków w dowolny sposób. Powinieneś również opublikować numerację, jeśli nie jest to oczywiste, aby inni mogli sprawdzić twoją odpowiedź w łatwiejszy sposób.
  • To jest golf golfowy. Najkrótszy kod w bajtach wygrywa.

Przykładowe dane wyjściowe

Oto numeracja wierzchołków użytych w przykładzie:

          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

Dane wyjściowe jako lista sąsiadów (numer wierzchołka przed każdą listą jest opcjonalny):

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]
jimmy23013
źródło

Odpowiedzi:

8

APL (Dyalog Classic) , 34 30 bajtów

-4 dzięki jimmy23013

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

Wypróbuj online!

wyprowadza macierz przylegania z każdym wierzchołkiem przylegającym do siebie

⍳3 3 wygeneruj tablicę (0 0)(0 1)(0 2)(1 0)(1 1)(1 2)(2 0)(2 1)(2 2)

pomnóż wszystko przez π

7 ¯1∘., dodaj 7 lub -1 na wszystkie możliwe sposoby

(⍳3)∘.⌽ obróć trzykrotnie współrzędne o 0 1 2 kroki na wszystkie możliwe sposoby

+/¨|∘.-⍨, obliczyć odległość manhattan między każdą parą

4≥ nie może być większa niż 4 dla sąsiednich aspektów

ngn
źródło
@ jimmy23013 za pomocą π jest bardzo fajny :) dziękuję!
ngn
Matryca 54x54 ... to imponujące
don bright
6

Rubinowy , 79 bajtów

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]}

Wypróbuj online!

Drukuje reprezentację wykresu jednokierunkowego jako listę wierzchołków po prawej i poniżej każdego wierzchołka, jak pokazano na poniższej mapie.

 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
Level River St
źródło
4

Python 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]

Wypróbuj online!

Definiuje macierz przylegania xjako listę list wartości boolowskich. Aspekty liczą się jako przylegające do siebie.

p(n)oblicza współrzędne środka n-tego aspektu sześcianu 3x3x3, którego aspekty mają szerokość 2 jednostek. Adiacyję określa się, sprawdzając, czy 2 aspekty mają odległość kwadratową poniżej 5 (sąsiednie aspekty mają odległość kwadratową co najwyżej 4, a sąsiednie aspekty mają odległość kwadratową co najmniej 6).

pudełko kartonowe
źródło
3

Węgiel drzewny , 48 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

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

Wygeneruj wszystkie zestawy trójwymiarowych współrzędnych w zakresie [0..6]dla każdego wymiaru.

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

Zachować tylko te współrzędne, które są ośrodkami 2x2kwadratów na jednej z powierzchni x=0, y=0, z=0, x=6, y=6, z=6.

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

Dla każdej współrzędnej wydrukuj indeksy tych współrzędnych, których odległość od taksówki wynosi 2.

Wierzchołki są ponumerowane w następujący sposób:

         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
Neil
źródło
czy w sieci dostępna jest dokumentacja dotycząca węgla drzewnego?
don jasny
@donbright Kliknij link GitHub w tytule odpowiedzi i kliknij Wiki.
Neil
2

Język Wolfram 190 bajtów

Poniższe zwraca wszystkie krawędzie wykresu pod względem rzeczywistych współrzędnych (zakładając, że każdy mini-sześcian ma 2 jednostki na krawędzi, a sześcian Rubika ma dolny lewy wierzchołek u początku).

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}}}}

Prace generowania punktów na każdym aspekcie zewnętrznym odbywa się poprzez funkcji h. Należy go wywołać 3 razy, aby wygenerować punkty przy x = 0, x = 6; y = 0, y = 6; i z = 0, z = 6.

Każdy punkt ścianki, który jest odległością 2 jednostek na Manhattanie, zostanie połączony z odpowiednim punktem.

Możemy wyświetlić krawędzie wykresu wizualnie w następujący sposób; ato lista krawędzi wykresu, które są przedstawione poniżej jako strzałki.

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

pic1

Poniżej pokazano sześcian Rubika, punkty na zewnętrznych ściankach i 8 krawędzi wykresu. pic2

Czerwone kropki znajdują się na ściankach przy y = 0 i y = 6; niebieskie i szare kropki znajdują się na aspektach odpowiednio przy x = 6 i x = 0; czarne kropki są na aspektach przy z = 6 i z = 0.

DavidC
źródło
ładne zdjęcia, groty strzał są naprawdę fajne
don bright
1

Rdza - 278 bajtów

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)}}}}

Spróbuj na play.rust-lang.org

Jest to duży, ale najmniejszy kod dla skompilowanego języka (jak dotąd). Tworzy listę przylegania. Jest bardzo podobny do odpowiedzi pytona karton_box, ale chciałem sprawdzić, czy Quaternions może działać.

Krok 1: Zbuduj 54 czwartorzędy, z których każdy reprezentuje jeden aspekt.

Krok 2: dla każdej ćwiartki wypisz wszystkie pozostałe ćwiartki z kwadrantem (inaczej kwadratowa odległość, inaczej kwadratowa norma różnicy) <= 4.

Czwartorzędy są zbudowane w ten sposób: urojone wektory ijk są punktami na powłoce siatki, od -2, -2, -2 do 2,2,2, krok 2. Rzeczywista część w to zawsze -1, 0 lub 1, tak że ścianki po przeciwnych stronach sześcianu mają tę samą rzeczywistą część, ale sąsiednie boki mają różne rzeczywiste części. Rzeczywista część umożliwia rozróżnienie różnych „boków” sześcianu poprzez obliczenia.

Numeracja czwartorzędu (pseudo-izometryczny widok 3D sześcianu):

   ->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

Indeksowana numeracja (rozłożona kostka):

                    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


Don Bright
źródło
1

JavaScript (ES6, przeglądarka), 153 bajty

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)

Wypróbuj online!

Jest to modyfikowane w celu zmniejszenia 5 bajtów poprzez utworzenie tych samych punktów obok siebie, tj ||ZA-b||1.

JavaScript (ES6, przeglądarka), 158 bajtów

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)

Wypróbuj online! (symuluje alertz console.log)

Odwzorowuje środek wszystkich 54 aspektów na przestrzeń 3-d i oblicza, czy 0<||ZA-b||1za każdą parę punktów. Wysyła wszystkie skierowane krawędzie jako pary liczb [a, b]. Mapa wierzchołków to

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
Shieru Asakoto
źródło
nawet nie wiedziałem, że istnieje Math.hypot
don bright