Oberfläche des 3x3x3 Würfels als Grafik


18

Ihre Aufgabe ist es, ein Diagramm mit 54 Scheitelpunkten zu erstellen, die jeweils einer Facette auf einem Zauberwürfel entsprechen. Es gibt eine Kante zwischen zwei Eckpunkten, wenn sich die entsprechenden Facetten eine Seite teilen.

Regeln

  • Sie können eine Adjazenzliste, eine Adjazenzmatrix, eine Kantenliste oder ein beliebiges sinnvolles Format zur Darstellung eines Diagramms in einem Algorithmus ausgeben. (Ein visuelles Diagramm, das von einem Menschen gelesen werden kann, ist in den meisten Fällen kein vernünftiges Format in einem Algorithmus.)
  • Sie können entweder jeden Scheitelpunkt an sich selbst oder keinen an sich selbst angrenzen.
  • Sie können entweder beide Richtungen für jede Kante einschließen (ein- oder zweimal für Selbstschleifen zählen) oder genau einmal für jede Kante ausgeben, aber die Wege nicht mischen.
  • Sie können die Scheitelpunkte neu nummerieren, einige Zahlen überspringen oder sogar Beschriftungen für die Scheitelpunkte verwenden, wie Sie möchten. Sie sollten auch die Nummerierung posten, wenn dies nicht offensichtlich ist, damit andere Ihre Antwort auf einfachere Weise überprüfen können.
  • Das ist Code-Golf. Kürzester Code in Bytes gewinnt.

Beispielausgabe

Dies ist die Nummerierung der Eckpunkte, die im Beispiel verwendet wird:

          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

Ausgabe als Adjazenzliste (Scheitelpunktnummer vor jeder Liste ist optional):

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]

Antworten:


8

APL (Dyalog Classic) , 34 30 Bytes

-4 danke an jimmy23013

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

Probieren Sie es online!

gibt eine Adjazenzmatrix aus, wobei jeder Eckpunkt an sich angrenzt

⍳3 3 generiere ein Array von (0 0)(0 1)(0 2)(1 0)(1 1)(1 2)(2 0)(2 1)(2 2)

multiplizieren Sie alles mit π

7 ¯1∘., Stellen Sie 7 oder -1 auf alle möglichen Arten voran

(⍳3)∘.⌽ Dreifachkoordinaten in allen möglichen Schritten um 0 1 2 drehen

+/¨|∘.-⍨, Manhattans Entfernung zwischen jedem Paar berechnen

4≥ es darf für benachbarte Facetten nicht größer als 4 sein


@ jimmy23013 mit π ist sehr schön :) danke!
19.

54x54 Matrix ... das ist beeindruckend
don bright

6

Ruby , 79 Bytes

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

Probieren Sie es online!

Druckt eine Darstellung eines unidirektionalen Diagramms als Liste der Scheitelpunkte rechts von und unter jedem Scheitelpunkt, wie in der folgenden Karte dargestellt.

 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

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]

Probieren Sie es online!

Definiert eine Adjazenzmatrix xals Liste von Listen mit Booleschen Werten. Facetten gelten als nebeneinander.

p(n)Berechnet die Koordinaten des Mittelpunkts der n-ten Facette eines 3x3x3-Würfels, dessen Facetten 2 Einheiten breit sind. Die Adjazenz wird durch Testen bestimmt, ob 2 Facetten einen quadratischen Abstand unter 5 haben (benachbarte Facetten haben einen quadratischen Abstand von höchstens 4, nicht benachbarte Facetten haben einen quadratischen Abstand von mindestens 6).


3

Kohle , 48 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

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

Generieren Sie [0..6]für jede Dimension alle Sätze dreidimensionaler Koordinaten im Bereich .

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

Behalten nur die Koordinaten , die Zentren sind 2x2Quadrate auf einer der Flächen x=0, y=0, z=0, x=6, y=6, z=6.

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

Drucken Sie für jede Koordinate die Indizes der Koordinaten aus, deren Taxidistanz 2 beträgt.

Die Eckpunkte sind wie folgt nummeriert:

         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

Gibt es eine Dokumentation für Holzkohle im Web?
Don Bright

@donbright Folgen Sie dem GitHub-Link im Antworttitel und klicken Sie auf Wiki.
Neil,

2

Wolfram-Sprache 190 Bytes

Im Folgenden werden alle Diagrammkanten in Bezug auf die tatsächlichen Koordinaten zurückgegeben (vorausgesetzt, jeder Mini-Würfel befindet sich 2 Einheiten am Rand und der Scheitelpunkt des Rubik-Würfels befindet sich links unten am Ursprung).

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

Die Arbeit zum Erzeugen der Punkte auf jeder externen Facette wird von der Funktion erledigt h. Es muss dreimal aufgerufen werden, um die Punkte bei x = 0, x = 6 zu erzeugen; y = 0, y = 6; und z = 0, z = 6.

Jeder Facettenpunkt, der einen Manhattan-Abstand von 2 Einheiten voneinander hat, wird mit dem entsprechenden Punkt verbunden.

Wir können die Graphenkanten folgendermaßen visuell darstellen: aist die Liste der Diagrammkanten, die unten als Pfeile dargestellt werden.

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

pic1

Das Folgende zeigt den Zauberwürfel, die Punkte auf den äußeren Facetten und 8 Diagrammkanten. pic2

Rote Punkte befinden sich auf Facetten bei y = 0 und y = 6; blaue und graue Punkte befinden sich auf Facetten bei x = 6 bzw. x = 0; Schwarze Punkte befinden sich auf Facetten bei z = 6 und z = 0.


schöne bilder, pfeilspitzen sind echt cool
don bright

1

Rust - 278 Bytes

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

Versuchen Sie es auf play.rust-lang.org

Das ist groß, aber der kleinste Code für eine kompilierte Sprache (bis jetzt). Es wird eine Nachbarschaftsliste erstellt. Es ist der Python-Antwort von cardboard_box sehr ähnlich, aber ich wollte sehen, ob Quaternions funktionieren könnten.

Schritt 1: Konstruieren Sie 54 Quaternionen, die jeweils eine einzelne Facette darstellen.

Schritt 2: Listen Sie für jede Quaternion alle anderen Quaternionen mit Quadranz auf (auch als Quadratabstand oder als Quadratnorm der Differenz bezeichnet) <= 4.

Quaternionen sind wie folgt aufgebaut: Die imaginären Vektoren ijk sind Punkte auf der Schale eines Gitters von -2, -2, -2 bis 2,2,2, Schritt 2. Der Realteil w ist immer -1, 0 oder 1, so dass Facetten auf gegenüberliegenden Seiten des Würfels den gleichen Realteil haben, aber benachbarte Seiten unterschiedliche Realteile haben. Der Realteil ermöglicht die Unterscheidung verschiedener 'Seiten' des Würfels durch Berechnung.

Quaternion-Nummerierung (pseudoisometrische 3D-Ansicht eines Würfels):

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

Indizierte Nummerierung (ungefalteter Würfel):

                    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

JavaScript (ES6, Browser), 153 Byte

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)

Probieren Sie es online!

||EIN-B||1

JavaScript (ES6, Browser), 158 Byte

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)

Probieren Sie es online! (simuliert alertmit console.log)

0<||EIN-B||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

Ich wusste nicht einmal, dass es einen Math.hypot gibt
don bright
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.