Поверхность куба 3х3х3 в виде графика


18

Ваша задача - создать граф с 54 вершинами, каждая из которых соответствует фасету куба Рубика. Между двумя вершинами есть ребро, если соответствующие грани имеют общую сторону.

правила

  • Вы можете выбрать вывод списка смежности, матрицы смежности, списка ребер или любого приемлемого формата для представления графа в алгоритме. (Визуальный график, читаемый человеком, в большинстве случаев не является приемлемым форматом алгоритма.)
  • Вы можете сделать либо каждую вершину смежной с собой, либо ни одну смежную с самой собой.
  • Вы можете либо включить оба направления для каждого ребра (сосчитать один или два раза для самостоятельных петель), либо вывести ровно один раз для каждого ребра, но не смешивать пути.
  • Вы можете изменить нумерацию вершин, пропустить некоторые числа или даже использовать ненулевые метки для вершин любым удобным для вас способом. Вы также должны опубликовать нумерацию, если она не очевидна, чтобы другие могли проверить ваш ответ более легкими способами.
  • Это код-гольф. Самый короткий код в байтах побеждает.

Пример вывода

Это нумерация вершин, использованная в примере:

          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 (Дьялог Классик) , 34 30 байт

-4 благодаря jimmy23013

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)∘.⌽ вращать координаты троек на 0 1 2 шага всеми возможными способами

+/¨|∘.-⍨, вычислить манхэттенское расстояние между каждой парой

4≥ оно должно быть не больше 4 для соседних граней


@ jimmy23013 использовать π очень приятно :) спасибо!
нгн

Матрица 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

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]

Попробуйте онлайн!

Определяет матрицу смежности xкак список списков логических значений. Грани считаются смежными с самим собой.

p(n)вычисляет координаты центра n-й грани куба 3x3x3, грани которого имеют ширину 2 единицы. Смежность определяется путем тестирования, если 2 грани имеют квадратное расстояние меньше 5 (смежные грани имеют квадратное расстояние не более 4, несмежные грани имеют квадратное расстояние не менее 6).


3

Древесный уголь , 48 байтов

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

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

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

Генерация всех наборов трехмерных координат в диапазоне [0..6]для каждого измерения.

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

Держите только те координаты , которые являются центрами 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 в заголовке ответа и нажмите Wiki.
Нейл

2

Wolfram Language 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. Он должен вызываться 3 раза, чтобы генерировать точки при x = 0, x = 6; у = 0, у = 6; и z = 0, z = 6.

Каждая точка фасета, которая является манхэттенским расстоянием в 2 единицы от другого, будет связана с соответствующей точкой.

Мы можем визуально отобразить края графика следующим образом; aсписок ребер графа, представленных ниже стрелками

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

pic1

Ниже показан кубик Рубика, точки на внешних гранях и 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

Это большой, но самый маленький код для скомпилированного языка (пока). Создает список смежности. Это очень похоже на ответ Python картонной коробки, но я хотел посмотреть, может ли Quaternions работать.

Шаг 1: Построить 54 кватерниона, каждый из которых представляет один аспект.

Шаг 2: для каждого кватерниона перечислите все остальные кватернионы с квадрантом (он же квадрат расстояния, он же квадрат нормы разности) <= 4.

Кватернионы построены следующим образом: мнимые векторы ijk - это точки на оболочке сетки, от -2, -2, -2 до 2,2,2, шаг 2. Действительная часть w всегда равна -1, 0 или 1, так что грани на противоположных сторонах куба имеют одинаковую действительную часть, но смежные стороны имеют разные действительные части. Действительная часть позволяет различать разные «стороны» куба посредством расчета.

Кватернионная нумерация (псевдоизометрический трехмерный вид куба):

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

JavaScript (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 байтов, делая такие же точки смежными, т.е. ||A-В||1,

JavaScript (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 граней с трехмерным пространством и вычисляет, 0<||A-В||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
Дон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.