Surface du cube 3x3x3 sous forme de graphique

18

Votre tâche consiste à générer un graphique avec 54 sommets, chacun correspondant à une facette sur un cube Rubik. Il y a un bord entre deux sommets si les facettes correspondantes partagent un côté.

Règles

  • Vous pouvez choisir de sortir une liste d'adjacence, une matrice d'adjacence, une liste de bords ou tout autre format raisonnable pour représenter un graphique dans un algorithme. (Un graphique visuel lisible par un humain n'est généralement pas un format raisonnable dans un algorithme dans la plupart des cas.)
  • Vous pouvez créer soit chaque sommet adjacent à lui-même, soit aucun à côté de lui-même.
  • Vous pouvez soit inclure les deux directions pour chaque bord (compter une ou deux fois pour les boucles automatiques), soit produire une seule fois pour chaque bord, mais ne pas mélanger les façons.
  • Vous pouvez renuméroter les sommets, ignorer certains nombres ou même utiliser des étiquettes non numériques pour les sommets comme vous le souhaitez. Vous devez également publier la numérotation si elle n'est pas évidente, afin que d'autres puissent vérifier votre réponse de manière plus simple.
  • C'est du code-golf. Le code le plus court en octets gagne.

Exemple de sortie

Il s'agit de la numérotation des sommets utilisée dans l'exemple:

          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

Sortie sous forme de liste d'adjacence (le numéro de sommet avant chaque liste est facultatif):

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

Réponses:

8

APL (Dyalog Classic) , 34 30 octets

-4 grâce à jimmy23013

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

Essayez-le en ligne!

génère une matrice d'adjacence avec chaque sommet adjacent à lui-même

⍳3 3 générer un tableau de (0 0)(0 1)(0 2)(1 0)(1 1)(1 2)(2 0)(2 1)(2 2)

multipliez tout par π

7 ¯1∘., ajouter 7 ou -1 de toutes les manières possibles

(⍳3)∘.⌽ faire pivoter les triples de coordonnées de 0 1 2 étapes de toutes les manières possibles

+/¨|∘.-⍨, calculer la distance manhattan entre chaque paire

4≥ il ne doit pas être supérieur à 4 pour les facettes voisines

ngn
la source
@ jimmy23013 en utilisant π est très sympa :) merci!
ngn
Matrice 54x54 ... c'est impressionnant
Don
6

Rubis , 79 octets

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

Essayez-le en ligne!

Imprime une représentation d'un graphique unidirectionnel, sous la forme d'une liste des sommets à droite et en dessous de chaque sommet, comme indiqué dans la carte ci-dessous.

 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
la source
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]

Essayez-le en ligne!

Définit une matrice d'adjacence xcomme une liste de listes de valeurs booléennes. Les facettes comptent comme étant adjacentes à elles-mêmes.

p(n)calcule les coordonnées du centre de la nième facette d'un cube 3x3x3 dont les facettes ont 2 unités de diamètre. L'adjacence est déterminée en testant si 2 facettes ont une distance carrée inférieure à 5 (les facettes adjacentes ont une distance carrée au plus 4, les facettes non adjacentes ont une distance carrée au moins 6).

boîte en carton
la source
3

Fusain , 48 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

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

Générez tous les ensembles de coordonnées tridimensionnelles dans la plage [0..6]pour chaque dimension.

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

Gardez uniquement les coordonnées qui sont des centres de 2x2carrés sur une des faces x=0, y=0, z=0, x=6, y=6, z=6.

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

Pour chaque coordonnée, imprimez les indices des coordonnées dont la distance taxis est de 2.

Les sommets sont numérotés comme suit:

         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
la source
existe-t-il de la documentation sur le charbon de bois sur le Web?
don bright
@donbright Suivez le lien GitHub dans le titre de la réponse et cliquez sur Wiki.
Neil
2

Langue Wolfram 190 octets

Ce qui suit renvoie toutes les arêtes du graphique en termes de coordonnées réelles (en supposant que chaque mini-cube est de 2 unités à l'arête et que le cube de Rubik a son sommet inférieur gauche à l'origine).

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

Le travail de génération des points sur chaque facette externe est effectué par la fonction h,. Il faut l'appeler 3 fois pour générer les points à x = 0, x = 6; y = 0, y = 6; et z = 0, z = 6.

Chaque point de facette qui est à une distance de Manhattan de 2 unités les unes des autres sera connecté au point respectif.

Nous pouvons afficher visuellement les bords du graphique de la manière suivante; aest la liste des bords du graphique qui sont représentés ci-dessous sous forme de flèches.

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

pic1

Ce qui suit montre le cube de Rubik, les points sur les facettes externes et 8 arêtes de graphique. pic2

Les points rouges sont situés sur les facettes à y = 0 et y = 6; les points bleus et gris sont sur les facettes à x = 6 et x = 0, respectivement; les points noirs sont sur les facettes à z = 6 et z = 0.

DavidC
la source
belles photos, les pointes de flèches sont vraiment cool
don bright
1

Rouille - 278 octets

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

Essayez sur play.rust-lang.org

C'est gros, mais le plus petit code pour un langage compilé (jusqu'à présent). Il crée une liste d'adjacence. C'est très similaire à la réponse python de cardboard_box mais je voulais voir si les Quaternions pouvaient fonctionner.

Étape 1: Construisez 54 Quaternions, chacun représentant une seule facette.

Étape 2: pour chaque Quaternion, énumérez tous les autres Quaternions avec Quadrance (aka distance quadratique, aka norme quadratique de la différence) <= 4.

Les quaternions sont construits comme suit: Les vecteurs imaginaires ijk sont des points sur la coque d'une grille, de -2, -2, -2 à 2,2,2, étape 2. La partie réelle w est toujours -1, 0 ou 1, de sorte que les facettes des côtés opposés du cube ont la même partie réelle, mais les côtés adjacents ont des parties réelles différentes. La partie réelle permet de distinguer différents «côtés» du cube par le calcul.

Numérotation des quaternions (vue pseudo-isométrique 3D d'un cube):

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

Numérotation indexée (cube déplié):

                    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
la source
1

JavaScript (ES6, navigateur), 153 octets

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)

Essayez-le en ligne!

||UNE-B||1

JavaScript (ES6, navigateur), 158 octets

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)

Essayez-le en ligne! (simule alertavec console.log)

0<||UNE-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
Shieru Asakoto
la source
Je ne savais même pas qu'il y avait un Math.hypot
Don