3x3x3 küpün grafik olarak yüzeyi


18

Senin görevin 54 köşeli bir grafik oluşturmak, her biri bir Rubik küpü bir faset karşılık gelir. Karşılıklı yüzeyler bir tarafı paylaştığında iki köşe arasında bir kenar vardır.

kurallar

  • Algoritmada bir grafiği temsil etmek için bir bitişiklik listesi, bitişiklik matrisi, kenar listesi veya makul bir biçim vermeyi seçebilirsiniz. (Bir insan tarafından okunabilen görsel bir grafik, çoğu durumda bir algoritmada genellikle makul bir format değildir.)
  • Her tepe noktasını kendisine bitişik yapabilir ya da hiçbirini kendine bitişik yapamazsınız.
  • Her kenar için her iki yönü de dahil edebilirsiniz (kendinden döngüler için bir veya iki kez sayın) veya her kenar için tam olarak bir kez çıktı alabilirsiniz, ancak yolları karıştırmayın.
  • Köşeleri yeniden numaralandırabilir, bazı sayıları atlayabilir veya köşeler için istediğiniz şekilde sayı olmayan etiketleri bile kullanabilirsiniz. Açık değilse, numaralandırmayı da göndermelisiniz, böylece diğerleri cevabınızı daha kolay bir şekilde kontrol edebilir.
  • Bu kod golfü. Bayt cinsinden en kısa kod kazanır.

Örnek çıktı

Bu, örnekte kullanılan köşe noktalarının numaralandırmasıdır:

          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

Bitişik liste olarak çıktı (her listeden önceki köşe numarası isteğe bağlıdır):

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]

Yanıtlar:


8

APL (Dyalog Klasik) , 34 30 bayt

-4 jimmy23013 sayesinde

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

Çevrimiçi deneyin!

her tepe noktası kendisine bitişik olarak bir bitişiklik matrisi çıkarır

⍳3 3 bir dizi oluşturmak (0 0)(0 1)(0 2)(1 0)(1 1)(1 2)(2 0)(2 1)(2 2)

hepsini π ile çarp

7 ¯1∘., olası tüm yollarla 7 veya -1 başına

(⍳3)∘.⌽ koordinat üçlülerini tüm olası yollarla 0 1 2 adım döndürün

+/¨|∘.-⍨, her bir çift arasındaki manhattan mesafesini hesapla

4≥ komşu yönler için 4'ten büyük olmamalıdır


@ jimmy23013 π kullanarak çok güzel :) teşekkür ederim!
ngn

54x54 matris ... bu etkileyici
don parlak

6

Ruby , 79 bayt

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

Çevrimiçi deneyin!

Aşağıdaki haritada gösterildiği gibi, her bir tepe noktasının sağındaki ve altındaki köşelerin listesi olarak tek yönlü bir grafiğin bir temsilini yazdırır.

 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]

Çevrimiçi deneyin!

Bir bitişiklik matrisini x, boole değerlerinin listesi olarak tanımlar . Elmaslar kendilerine bitişik sayılır.

p(n)cepheleri 2 birim olan 3x3x3'lük bir küpün beşinci yüzünün merkezinin koordinatlarını hesaplar. Bitişiklik, 2 faset 5'in altında bir kare mesafeye sahipse (bitişik fasetler en fazla 4 kare mesafeye, bitişik olmayan fasetler en az 6 kare mesafeye sahipse) test edilerek belirlenir.


3

Kömür , 48 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

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

[0..6]Her boyut için aralıktaki tüm 3 boyutlu koordinat kümelerini oluşturun .

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

Merkezleridir sadece bu koordinatları tutun 2x2yüzlerinden biri üzerinde kareler x=0, y=0, z=0, x=6, y=6, z=6.

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

Her koordinat için, taksi mesafesi 2 olan koordinatların indekslerini yazdırın.

Köşeler aşağıdaki gibi numaralandırılmıştır:

         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

web üzerinde kömür için herhangi bir belge var mı?
parlak don

@donbright Yanıt başlığındaki GitHub bağlantısını takip edin ve Wiki'yi tıklayın.
Neil

2

Wolfram Dili 190 bayt

Aşağıda, tüm grafik kenarları gerçek koordinatlar açısından döndürülür (her bir mini küpün kenarda 2 birim olduğu ve Rubik küpünün başlangıçta sol alt tepe noktası olduğu varsayıldığında).

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

Her dış yüzeyde nokta üretme işlevi, işlevi tarafından yapılır h. X = 0, x = 6'da noktalar oluşturmak için 3 kez çağrılmalıdır; y = 0, y = 6; ve z = 0, z = 6.

Manhattan'dan diğerine 2 birim uzaklık olan her bir faset noktası ilgili noktaya bağlanacaktır.

Grafik kenarlarını görsel olarak aşağıdakilerle görüntüleyebiliriz; aaşağıda oklarla gösterilen grafik kenarlarının listesidir.

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

pic1

Aşağıda Rubik küpü, dış yüzeylerdeki noktalar ve 8 grafik kenarı gösterilmektedir. pic2

Kırmızı noktalar y = 0 ve y = 6'daki yüzeylerde bulunur; mavi ve gri noktalar sırasıyla x = 6 ve x = 0'daki yüzeylerde bulunur; siyah noktalar z = 6 ve z = 0 olan yüzeylerde bulunur.


güzel resimler, ok uçları gerçekten harika
don

1

Pas - 278 bayt

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

Bu büyük, ancak derlenmiş bir dil için en küçük kod (şimdiye kadar). Bir bitişik liste oluşturur. Karton_box'ın python cevabına çok benziyor ama Quaternions'un çalışıp çalışmayacağını görmek istedim.

Adım 1: Her biri tek bir yönü temsil eden 54 Kuaterniyon oluşturun.

Adım 2: her bir Kuaterniyon için, diğer tüm Kuaternleri Quadrance (diğer bir deyişle kare uzaklık, diğer bir deyişle kare fark normları) ile listeleyin.

Kuaterniyonlar şu şekilde inşa edilir: Hayali vektörler ijk, bir ızgara kabuğunda -2, -2, -2 ila 2,2,2, adım 2 noktalarıdır. W'nin gerçek kısmı her zaman -1, 0 veya 1, böylece küpün karşı taraflarındaki fasetler aynı gerçek parçaya sahiptir, ancak bitişik taraflar farklı gerçek parçalara sahiptir. Gerçek kısım, küpün farklı 'taraflarını' hesaplama yoluyla ayırt etmeyi sağlar.

Kuaterniyon numaralandırma (bir küpün sahte izometrik 3d görünümü):

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

Dizinlenmiş numaralandırma (katlanmamış küp):

                    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, Tarayıcı), 153 bayt

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)

Çevrimiçi deneyin!

Bu, aynı noktaları bitişik hale getirerek 5 baytı azaltacak şekilde değiştirilir, yani ||bir-B||1.

JavaScript (ES6, Tarayıcı), 158 bayt

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)

Çevrimiçi deneyin! (taklit alertile console.log)

54 yönün merkezini 3 boyutlu boşluğa eşler ve 0<||bir-B||1her puan çifti için. Yönlendirilen tüm kenarları sayı çifti olarak çıktılar [a, b]. Tepe haritası:

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 olduğunu bile bilmiyordum
don parlak
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.